<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>materia Archives | Clever Cloud</title>
	<atom:link href="https://www.clever.cloud/fr/blog/tag/materia/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.clever.cloud/fr/blog/tag/materia/</link>
	<description>From Code to Product</description>
	<lastBuildDate>Wed, 10 Jun 2026 16:35:48 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://cdn.clever-cloud.com/uploads/2023/03/cropped-cropped-favicon-32x32.png</url>
	<title>materia Archives | Clever Cloud</title>
	<link>https://www.clever.cloud/fr/blog/tag/materia/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Materia KV parle maintenant GraphQL</title>
		<link>https://www.clever.cloud/fr/blog/entreprise/2026/06/10/materia-kv-parle-maintenant-graphql/</link>
		
		<dc:creator><![CDATA[David Legrand]]></dc:creator>
		<pubDate>Wed, 10 Jun 2026 16:35:46 +0000</pubDate>
				<category><![CDATA[Entreprise]]></category>
		<category><![CDATA[Fonctionnalités]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[graphql]]></category>
		<category><![CDATA[materia]]></category>
		<guid isPermaLink="false">https://www.clever.cloud/?p=24518</guid>

					<description><![CDATA[<p><img width="800" height="355" src="https://cdn.clever-cloud.com/uploads/2026/06/2026-06-05-clever-cloud-banniere-blog-materia-kv-graphql-fr.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Materia KV GraphQL" decoding="async" fetchpriority="high" srcset="https://cdn.clever-cloud.com/uploads/2026/06/2026-06-05-clever-cloud-banniere-blog-materia-kv-graphql-fr.png 800w, https://cdn.clever-cloud.com/uploads/2026/06/2026-06-05-clever-cloud-banniere-blog-materia-kv-graphql-fr-300x133.png 300w, https://cdn.clever-cloud.com/uploads/2026/06/2026-06-05-clever-cloud-banniere-blog-materia-kv-graphql-fr-768x341.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></p><!-- wp:paragraph -->
<p>GraphQL sur une base clé-valeur, on dirait presque une provocation. D'un côté, le modèle de données le plus dépouillé qui soit : une clé, une valeur, point. De l'autre, le langage de requête typé qu'on réserve d'ordinaire aux API exposant des graphes d'objets assez profonds. Les deux mondes n'avaient a priori pas grand-chose à se dire.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Et pourtant, c'est exactement ce que <a href="https://www.clever.cloud/developers/doc/addons/materia-kv/">Materia KV</a> vous propose désormais : vous continuez à écrire vos données avec n'importe quel client Redis ou Valkey, et vous pouvez les <strong>relire via un endpoint GraphQL</strong>. Pas de couche de synchronisation, pas de réplica à tenir à jour, pas de second stockage à alimenter. Tout ce que vous poussez d'un côté est interrogeable de l'autre dans la foulée, sur le même cluster. C'est la même base, vue par deux portes différentes.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Materia suit son chemin</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Avant d'aller plus loin, rappelons d'où vient Materia KV, car le produit ne s'est pas construit en un jour. Depuis son <a href="https://www.clever.cloud/developers/changelog/2024/06-11-materia-kv-public-alpha/">entrée en Alpha publique</a>, la base clé-valeur <em>serverless</em> de Clever Cloud s'est étoffée posément, au rythme de vos retours. Le TTL <a href="https://www.clever.cloud/developers/changelog/2024/10-01-materia-kv-ttl-layer-update/">est rapidement arrivé </a> pour gérer l'expiration des clés ; dans la foulée, le <a href="https://www.clever.cloud/developers/changelog/2024/11-28-kv-explorer-available/">KV Explorer</a> s'est invité dans la Console et la commande <a href="https://www.clever.cloud/developers/changelog/2024/12-18-clever-tools-3.11/"><code>clever kv</code></a> dans les Clever Tools, afin de consulter vos données sans installer le moindre outil tiers. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Sont ensuite venus les <a href="https://www.clever.cloud/developers/changelog/2025/03-12-materia-kv-json/">commandes JSON</a> (<code>JSON.GET</code>, <code>JSON.SET</code>, <code>JSON.DEL</code>), puis le passage en <a href="https://www.clever.cloud/developers/changelog/2025/10-15-materia-kv-v2/">bêta avec le support des Hash</a>, le <a href="https://www.clever.cloud/developers/changelog/2026/02-05-materia-kv-set/">type Set</a> au début de l'année, et tout récemment un <a href="https://www.clever.cloud/developers/changelog/2026/03-30-materia-kv-hash-ttl-commands/">lot de nouvelles commandes hash, string et TTL</a>. Sans oublier qu'un tel add-on se déploie aussi bien via le <a href="https://registry.terraform.io/providers/CleverCloud/clevercloud/latest/docs/resources/materiadb_kv">provider Terraform</a> que via le <a href="https://www.clever.cloud/developers/changelog/2025/02-18-kunernetes-operator-0.6.0/">Clever Kubernetes Operator</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Le fil rouge de toute cette histoire reste le même : la compatibilité. Nous n'avons jamais voulu vous imposer une API maison, un ORM exotique ou un client estampillé Clever Cloud. Vous parlez à Materia KV avec des protocoles que vous connaissez déjà. La couche Redis/Valkey était la première. La couche GraphQL apporte une nouvelle dimension.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Comment ça marche en pratique ?</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Vous écrivez via l'API Redis, vous lisez via GraphQL, et les deux interfaces tapent dans le même keyspace avec le <strong>même token</strong> : celui qui sert de mot de passe à votre <code>redis-cli</code> (votre <code>$KV_TOKEN</code>, alias <code>$REDIS_PASSWORD</code>, <a href="https://doc.biscuitsec.org/">basé sur Eclipse Biscuit</a>) sert aussi de <em>bearer token</em> côté GraphQL. Vous n'avez donc rien à faire pour un add-on existant.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Materia KV étant un cluster distribué, l'endpoint est une URL unique, partagée par tous les add-ons : <a href="https://materiakv-graphql.eu-fr-1.services.clever-cloud.com/graphql" target="_blank" rel="noreferrer noopener">https://materiakv-graphql.eu-fr-1.services.clever-cloud.com/graphql</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Le schéma expose un seul type racine, <code>MateriaKvQuery</code>, qui couvre les strings, les hashs et les sets. Ouvrez l'URL dans un navigateur et vous tombez sur un <em>playground</em> <strong>GraphiQL</strong> où explorer tout le schéma, ou récupérez le SDL avec l'outil d'introspection de votre choix.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Une précision avant d'aller plus loin : pour l'instant, <strong>c'est de la lecture seule</strong>. Aucune mutation. Et c'est souvent suffisant en l'état : écrire reste l'affaire des clients Redis/Valkey, qui le font déjà parfaitement, pendant que GraphQL se concentre sur les requêtes de données.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Place à la pratique. Dans tout ce qui suit, on écrit avec <code>redis-cli</code> et on relit avec <code>curl</code>, en supposant les variables de l'add-on chargées dans l'environnement :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash"># On récupère les variables d'environnement de l'add-on, vous pouvez aussi le faire via un fichier .env par exemple
source <(clever addon env ADDON_ID -F shell)
export KV_GRAPHQL_URL="https://materiakv-graphql.eu-fr-1.services.clever-cloud.com/graphql"</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Une string pour commencer. On pose une clé côté redis-cli, puis on la lit côté GraphQL:</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">redis-cli -h $KV_HOST -p $KV_PORT --tls SET demo:greeting "Hello, Materia!"

curl -s "$KV_GRAPHQL_URL" \
  -H "Authorization: Bearer $KV_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"query($key:String!){ string(key:$key){ key value } }","variables":{"key":"demo:greeting"}}'</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ce qui renvoie le résultat suivant :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-json">{ "data": { "string": { "key": "demo:greeting", "value": "Hello, Materia!" } } }</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ce qui a été écrit d'un côté est lisible de l'autre, sans délai ni couche intermédiaire. Là où GraphQL prend l'avantage, c'est dès que vos données sont plus complexes. Un hash par exemple, transporte un enregistrement structuré :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">redis-cli -h $KV_HOST -p $KV_PORT --tls \
 HSET demo:user:alice name Alice role admin email alice@example.com active true</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>GraphQL peut vous le renvoyer sous la forme d'une liste typée de paires <code>{ name, value }</code>, et vous n'avez plus à découper une réponse plate à la main côté client :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-graphql">query ReadUser($key: String!) {
  hash(key: $key) {
    key
    fields { name value }
  }
}</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>La même logique s'applique pour un set, cette collection sans ordre ni doublon que les deux protocoles exposent comme un objet de première classe :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">redis-cli -h $KV_HOST -p $KV_PORT --tls SADD demo:group:admins alice bob carol</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Pourra être interrogé avec la requête suivante :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-graphql">query ReadGroup($key: String!) {
  getSetMembers(key: $key) { key members }
}</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Requêtes complexes : là où GraphQL brille</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Mais voici le morceau qui justifie à lui seul l'existence de cette couche de compatibilité : GraphQL n'expose pas seulement vos sets, il sait les combiner : trouver les membres présents dans deux groupes à la fois tient en une requête, sans recourir à <code>SINTER</code>, sans index pré-calculé, sans fusion côté client.</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">redis-cli -h $KV_HOST -p $KV_PORT --tls SADD demo:group:admins alice bob carol
redis-cli -h $KV_HOST -p $KV_PORT --tls SADD demo:group:active alice carol dave</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Avec <code>keys = ["demo:group:admins", "demo:group:active"]</code>, vous récupérez <code>["alice", "carol"]</code>. Les champs <code>setUnion</code> et <code>setDifference</code> répondent au même schéma : qui est admin <em>et</em> actif, qui est l'un <em>ou</em> l'autre, qui est admin mais <em>pas</em> actif. Le calcul reste sur le cluster, vous ne rapatriez que le résultat :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-graphql">query AdminsAndActive($keys: [String!]!) {
  setIntersection(keys: $keys)
}</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Le TTL, vu sous deux angles</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Un détail pour celles et ceux qui apprécient les formats bien choisis. Redis raisonne en TTL relatif, en secondes ; GraphQL, lui, <s> </s>vous renvoie l'instant d'expiration absolu via le champ expireAt, typé avec un scalaire DateTime (RFC 3339). Deux représentations de la même vérité, chacune dans l'unité qui a du sens pour son protocole.</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">redis-cli -h $KV_HOST -p $KV_PORT --tls SET demo:session:xyz auth-token-42 EX 300</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>La requête GraphQL sera alors :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-graphql">query ReadSession($key: String!) {
  string(key: $key) { key value expireAt }
}</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Quant aux documents JSON, Materia KV les stocke par-dessus les strings tout en gardant l'API JSON de Redis. GraphQL vous rend le document sérialisé tel quel : vous le parsez côté client, et chaque champ fait l'aller-retour sans perte.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Testez de bout en bout</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Pour voir les deux couches fonctionner de concert, nous avons publié une démo interactive, déployable sur Clever Cloud, <a href="https://github.com/CleverCloud/kv-graphql-example">dont le code source est disponible sur GitHub</a>. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Écrite avec <a href="https://bun.sh/">Bun</a> et ses API natives (<code>Bun.serve</code>, <code>Bun.RedisClient</code>), sans framework ni librairie superflue, elle déroule six scénarios — string, hash, set, intersection, TTL, JSON. Vous cliquez, elle vous montre côte à côte les commandes Redis envoyées et la requête GraphQL qui relit le résultat, avec les variables, les réponses brutes et les temps de réponse. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>La déployer tient en quelques commandes :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">git clone https://github.com/CleverCloud/kv-graphql-example
cd kv-graphql-example

clever create -t node -a kv-graphql-example
clever addon create kv kv-graphql-example --link kv-graphql-example 
clever env set KV_GRAPHQL_URL "https://materiakv-graphql.eu-fr-1.services.clever-cloud.com/graphql"

clever deploy
clever open</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Et après ?</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Cette première implémentation de GraphQL nous permet de vous faire tester cette approche, de récolter vos avis. Ce n'est pas une fin en soi : les mutations font partie des pistes sur la table, et comme d'habitude avec Materia KV, ce sont vos usages qui décideront de l'ordre des priorités. N'hésitez donc pas à l'éprouver et <a href="https://github.com/CleverCloud/Community/discussions/categories/materia" target="_blank" rel="noreferrer noopener">à nous signaler ce qui vous manque</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Pour creuser, tout est là : la <a href="https://www.clever.cloud/developers/doc/addons/materia-kv/#using-the-graphql-compatibility-layer">documentation de la couche GraphQL</a>, <a href="https://www.clever.cloud/developers/changelog/2026/05-11-materia-kv-graphql/">l'annonce au changelog</a>, et <a href="https://github.com/CleverCloud/kv-graphql-example">l'exemple complet</a>. Et pour ceux qui attendent de pouvoir profiter de la  résilience de Materia avec des clients issus de l'écosystème DynamoDB, c'est en cours via un produit dédié. Il est actuellement en test auprès de clients qui l'utilisent pour des besoins spécifiques et sera ouvert plus largement un peu plus tard dans l'année.</p>
<!-- /wp:paragraph -->]]></description>
										<content:encoded><![CDATA[<p><img width="800" height="355" src="https://cdn.clever-cloud.com/uploads/2026/06/2026-06-05-clever-cloud-banniere-blog-materia-kv-graphql-fr.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Materia KV GraphQL" decoding="async" srcset="https://cdn.clever-cloud.com/uploads/2026/06/2026-06-05-clever-cloud-banniere-blog-materia-kv-graphql-fr.png 800w, https://cdn.clever-cloud.com/uploads/2026/06/2026-06-05-clever-cloud-banniere-blog-materia-kv-graphql-fr-300x133.png 300w, https://cdn.clever-cloud.com/uploads/2026/06/2026-06-05-clever-cloud-banniere-blog-materia-kv-graphql-fr-768x341.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></p><!-- wp:paragraph -->
<p>GraphQL sur une base clé-valeur, on dirait presque une provocation. D'un côté, le modèle de données le plus dépouillé qui soit : une clé, une valeur, point. De l'autre, le langage de requête typé qu'on réserve d'ordinaire aux API exposant des graphes d'objets assez profonds. Les deux mondes n'avaient a priori pas grand-chose à se dire.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Et pourtant, c'est exactement ce que <a href="https://www.clever.cloud/developers/doc/addons/materia-kv/">Materia KV</a> vous propose désormais : vous continuez à écrire vos données avec n'importe quel client Redis ou Valkey, et vous pouvez les <strong>relire via un endpoint GraphQL</strong>. Pas de couche de synchronisation, pas de réplica à tenir à jour, pas de second stockage à alimenter. Tout ce que vous poussez d'un côté est interrogeable de l'autre dans la foulée, sur le même cluster. C'est la même base, vue par deux portes différentes.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Materia suit son chemin</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Avant d'aller plus loin, rappelons d'où vient Materia KV, car le produit ne s'est pas construit en un jour. Depuis son <a href="https://www.clever.cloud/developers/changelog/2024/06-11-materia-kv-public-alpha/">entrée en Alpha publique</a>, la base clé-valeur <em>serverless</em> de Clever Cloud s'est étoffée posément, au rythme de vos retours. Le TTL <a href="https://www.clever.cloud/developers/changelog/2024/10-01-materia-kv-ttl-layer-update/">est rapidement arrivé </a> pour gérer l'expiration des clés ; dans la foulée, le <a href="https://www.clever.cloud/developers/changelog/2024/11-28-kv-explorer-available/">KV Explorer</a> s'est invité dans la Console et la commande <a href="https://www.clever.cloud/developers/changelog/2024/12-18-clever-tools-3.11/"><code>clever kv</code></a> dans les Clever Tools, afin de consulter vos données sans installer le moindre outil tiers. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Sont ensuite venus les <a href="https://www.clever.cloud/developers/changelog/2025/03-12-materia-kv-json/">commandes JSON</a> (<code>JSON.GET</code>, <code>JSON.SET</code>, <code>JSON.DEL</code>), puis le passage en <a href="https://www.clever.cloud/developers/changelog/2025/10-15-materia-kv-v2/">bêta avec le support des Hash</a>, le <a href="https://www.clever.cloud/developers/changelog/2026/02-05-materia-kv-set/">type Set</a> au début de l'année, et tout récemment un <a href="https://www.clever.cloud/developers/changelog/2026/03-30-materia-kv-hash-ttl-commands/">lot de nouvelles commandes hash, string et TTL</a>. Sans oublier qu'un tel add-on se déploie aussi bien via le <a href="https://registry.terraform.io/providers/CleverCloud/clevercloud/latest/docs/resources/materiadb_kv">provider Terraform</a> que via le <a href="https://www.clever.cloud/developers/changelog/2025/02-18-kunernetes-operator-0.6.0/">Clever Kubernetes Operator</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Le fil rouge de toute cette histoire reste le même : la compatibilité. Nous n'avons jamais voulu vous imposer une API maison, un ORM exotique ou un client estampillé Clever Cloud. Vous parlez à Materia KV avec des protocoles que vous connaissez déjà. La couche Redis/Valkey était la première. La couche GraphQL apporte une nouvelle dimension.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Comment ça marche en pratique ?</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Vous écrivez via l'API Redis, vous lisez via GraphQL, et les deux interfaces tapent dans le même keyspace avec le <strong>même token</strong> : celui qui sert de mot de passe à votre <code>redis-cli</code> (votre <code>$KV_TOKEN</code>, alias <code>$REDIS_PASSWORD</code>, <a href="https://doc.biscuitsec.org/">basé sur Eclipse Biscuit</a>) sert aussi de <em>bearer token</em> côté GraphQL. Vous n'avez donc rien à faire pour un add-on existant.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Materia KV étant un cluster distribué, l'endpoint est une URL unique, partagée par tous les add-ons : <a href="https://materiakv-graphql.eu-fr-1.services.clever-cloud.com/graphql" target="_blank" rel="noreferrer noopener">https://materiakv-graphql.eu-fr-1.services.clever-cloud.com/graphql</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Le schéma expose un seul type racine, <code>MateriaKvQuery</code>, qui couvre les strings, les hashs et les sets. Ouvrez l'URL dans un navigateur et vous tombez sur un <em>playground</em> <strong>GraphiQL</strong> où explorer tout le schéma, ou récupérez le SDL avec l'outil d'introspection de votre choix.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Une précision avant d'aller plus loin : pour l'instant, <strong>c'est de la lecture seule</strong>. Aucune mutation. Et c'est souvent suffisant en l'état : écrire reste l'affaire des clients Redis/Valkey, qui le font déjà parfaitement, pendant que GraphQL se concentre sur les requêtes de données.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Place à la pratique. Dans tout ce qui suit, on écrit avec <code>redis-cli</code> et on relit avec <code>curl</code>, en supposant les variables de l'add-on chargées dans l'environnement :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash"># On récupère les variables d'environnement de l'add-on, vous pouvez aussi le faire via un fichier .env par exemple
source <(clever addon env ADDON_ID -F shell)
export KV_GRAPHQL_URL="https://materiakv-graphql.eu-fr-1.services.clever-cloud.com/graphql"</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Une string pour commencer. On pose une clé côté redis-cli, puis on la lit côté GraphQL:</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">redis-cli -h $KV_HOST -p $KV_PORT --tls SET demo:greeting "Hello, Materia!"

curl -s "$KV_GRAPHQL_URL" \
  -H "Authorization: Bearer $KV_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"query($key:String!){ string(key:$key){ key value } }","variables":{"key":"demo:greeting"}}'</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ce qui renvoie le résultat suivant :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-json">{ "data": { "string": { "key": "demo:greeting", "value": "Hello, Materia!" } } }</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ce qui a été écrit d'un côté est lisible de l'autre, sans délai ni couche intermédiaire. Là où GraphQL prend l'avantage, c'est dès que vos données sont plus complexes. Un hash par exemple, transporte un enregistrement structuré :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">redis-cli -h $KV_HOST -p $KV_PORT --tls \
 HSET demo:user:alice name Alice role admin email alice@example.com active true</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>GraphQL peut vous le renvoyer sous la forme d'une liste typée de paires <code>{ name, value }</code>, et vous n'avez plus à découper une réponse plate à la main côté client :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-graphql">query ReadUser($key: String!) {
  hash(key: $key) {
    key
    fields { name value }
  }
}</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>La même logique s'applique pour un set, cette collection sans ordre ni doublon que les deux protocoles exposent comme un objet de première classe :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">redis-cli -h $KV_HOST -p $KV_PORT --tls SADD demo:group:admins alice bob carol</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Pourra être interrogé avec la requête suivante :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-graphql">query ReadGroup($key: String!) {
  getSetMembers(key: $key) { key members }
}</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Requêtes complexes : là où GraphQL brille</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Mais voici le morceau qui justifie à lui seul l'existence de cette couche de compatibilité : GraphQL n'expose pas seulement vos sets, il sait les combiner : trouver les membres présents dans deux groupes à la fois tient en une requête, sans recourir à <code>SINTER</code>, sans index pré-calculé, sans fusion côté client.</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">redis-cli -h $KV_HOST -p $KV_PORT --tls SADD demo:group:admins alice bob carol
redis-cli -h $KV_HOST -p $KV_PORT --tls SADD demo:group:active alice carol dave</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Avec <code>keys = ["demo:group:admins", "demo:group:active"]</code>, vous récupérez <code>["alice", "carol"]</code>. Les champs <code>setUnion</code> et <code>setDifference</code> répondent au même schéma : qui est admin <em>et</em> actif, qui est l'un <em>ou</em> l'autre, qui est admin mais <em>pas</em> actif. Le calcul reste sur le cluster, vous ne rapatriez que le résultat :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-graphql">query AdminsAndActive($keys: [String!]!) {
  setIntersection(keys: $keys)
}</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Le TTL, vu sous deux angles</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Un détail pour celles et ceux qui apprécient les formats bien choisis. Redis raisonne en TTL relatif, en secondes ; GraphQL, lui, <s> </s>vous renvoie l'instant d'expiration absolu via le champ expireAt, typé avec un scalaire DateTime (RFC 3339). Deux représentations de la même vérité, chacune dans l'unité qui a du sens pour son protocole.</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">redis-cli -h $KV_HOST -p $KV_PORT --tls SET demo:session:xyz auth-token-42 EX 300</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>La requête GraphQL sera alors :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-graphql">query ReadSession($key: String!) {
  string(key: $key) { key value expireAt }
}</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Quant aux documents JSON, Materia KV les stocke par-dessus les strings tout en gardant l'API JSON de Redis. GraphQL vous rend le document sérialisé tel quel : vous le parsez côté client, et chaque champ fait l'aller-retour sans perte.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Testez de bout en bout</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Pour voir les deux couches fonctionner de concert, nous avons publié une démo interactive, déployable sur Clever Cloud, <a href="https://github.com/CleverCloud/kv-graphql-example">dont le code source est disponible sur GitHub</a>. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Écrite avec <a href="https://bun.sh/">Bun</a> et ses API natives (<code>Bun.serve</code>, <code>Bun.RedisClient</code>), sans framework ni librairie superflue, elle déroule six scénarios — string, hash, set, intersection, TTL, JSON. Vous cliquez, elle vous montre côte à côte les commandes Redis envoyées et la requête GraphQL qui relit le résultat, avec les variables, les réponses brutes et les temps de réponse. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>La déployer tient en quelques commandes :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">git clone https://github.com/CleverCloud/kv-graphql-example
cd kv-graphql-example

clever create -t node -a kv-graphql-example
clever addon create kv kv-graphql-example --link kv-graphql-example 
clever env set KV_GRAPHQL_URL "https://materiakv-graphql.eu-fr-1.services.clever-cloud.com/graphql"

clever deploy
clever open</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Et après ?</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Cette première implémentation de GraphQL nous permet de vous faire tester cette approche, de récolter vos avis. Ce n'est pas une fin en soi : les mutations font partie des pistes sur la table, et comme d'habitude avec Materia KV, ce sont vos usages qui décideront de l'ordre des priorités. N'hésitez donc pas à l'éprouver et <a href="https://github.com/CleverCloud/Community/discussions/categories/materia" target="_blank" rel="noreferrer noopener">à nous signaler ce qui vous manque</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Pour creuser, tout est là : la <a href="https://www.clever.cloud/developers/doc/addons/materia-kv/#using-the-graphql-compatibility-layer">documentation de la couche GraphQL</a>, <a href="https://www.clever.cloud/developers/changelog/2026/05-11-materia-kv-graphql/">l'annonce au changelog</a>, et <a href="https://github.com/CleverCloud/kv-graphql-example">l'exemple complet</a>. Et pour ceux qui attendent de pouvoir profiter de la  résilience de Materia avec des clients issus de l'écosystème DynamoDB, c'est en cours via un produit dédié. Il est actuellement en test auprès de clients qui l'utilisent pour des besoins spécifiques et sera ouvert plus largement un peu plus tard dans l'année.</p>
<!-- /wp:paragraph -->]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
