5 étapes pour créer un excellent module Redis

5 étapes pour créer un excellent module Redis

Voici cinq choses à garder à l’esprit lorsque écrire un module Redis. Bien que cette liste ne soit pas exhaustive, mon objectif est d’offrir un bon moyen de démarrer si vous n’avez pas encore beaucoup d’expérience dans la construction de modules.

1. Trouvez un cas d’utilisation de module convaincant

Redis dispose déjà de nombreux outils qui vous permettent de créer la solution exacte dont vous avez besoin. Un exemple pourrait être les serrures. Utilisation de SET avec l’option NXvous pouvez créer une clé de verrouillage, et en la combinant avec EXPIRER, vous obtenez un bail de verrouillage. Cela peut être très utile lors de la résolution de problèmes de coordination. Lorsque les commandes intégrées ne suffisent pas, vous pouvez également recourir à Script Luaqui ajoutent une programmabilité complète aux opérations composites qui sont ensuite exécutées de manière atomique par Redis.

Les modules vont encore plus loin, vous offrant encore plus de flexibilité et de rapidité, grâce à leur capacité à accéder à des API de niveau inférieur par rapport à Lua, mais ils sont plus difficiles à maintenir et à distribuer. Optez pour un module uniquement lorsque Lua ne peut pas résoudre complètement votre cas d’utilisation.

Les modules peuvent ajouter de nouvelles commandes

Les modules peuvent ajouter de nouvelles commandes à Redis qui exécutent des fonctions C arbitraires (pour être précis, vous pouvez également utiliser Rouiller, Zig ou tout langage compatible C-ABI). Ce que vous faites dans votre fonction dépend de vous. Un point de départ basique, mais utile, pourrait consister à implémenter une commande similaire à une commande existante, mais faisant quelque chose de plus. Un exemple de ceci pourrait être SETNE (qui a été mentionné pour la première fois par un utilisateur dans cette requête d’extraction GitHub). SETNE se comporte exactement comme SET, mais lorsque la nouvelle valeur est égale à la valeur courante, il ne modifie pas la clé, évitant ainsi de produire un faux notification d’espace de clés. En général, pour vous entraîner, pensez aux petits ajouts que vous pourriez apporter aux commandes existantes pour vous aider dans des cas d’utilisation spécifiques.

La plupart de ces petits ajouts seraient mieux implémentés sous forme de scripts Lua, mais c’est un bon moyen d’acquérir de l’expérience au cas où vous ne pourriez pas trouver d’idées de modules convaincantes dès le départ. Quelques exercices laissés au lecteur : SETEQ, HINCRDATEBY.

Les modules peuvent ajouter de nouveaux types de données

Le moyen le plus efficace pour un module d’ajouter des fonctionnalités à Redis consiste à ajouter un nouveau type de données. Redis met fortement l’accent sur la conception appropriée des structures de données et de leurs algorithmes et propriétés associés. Bien que vous ne sachiez peut-être pas quelle est l’implémentation exacte du type de données Set, vous savez avec certitude que l’appartenance à un ensemble (SISMEMBRE) sera toujours rapide quelle que soit la taille de l’ensemble (c’est-à-dire qu’il a une complexité asymptotique sous-linéaire), par exemple.

C’est la base de nos propres modules :

  • RediRecherche est un module de recherche plein texte basé sur des index inversés.
  • RedisGraph est un module graphique basé sur des matrices creuses.
  • RedisTimeSeriesRedisTimeSeries est similaire à Redis Streams mais optimisé pour les séries numériques.
  • RedisBloom offre quelques structures de données probabilistes différentes.
  • RedisAI exécute des graphiques d’apprentissage en profondeur Tensorflow (et quelques autres types).

Ce sont des modules sérieux, mais tous les modules qui introduisent un nouveau type de données ne doivent pas nécessairement être aussi complexes. Il existe de nombreux types de données plus simples qui pourraient être utiles en tant que module. Un exemple de base pourrait être une implémentation différente d’un type de données déjà présent dans Redis, comme l’utilisation d’un ArrayList pour implémenter des listes, par exemple.

2. Peaufinez votre API

N’oubliez pas qu’une mauvaise utilisation des commandes de votre module sera aussi importante à préparer qu’une utilisation correcte. Les utilisateurs de Redis aiment essayer les commandes à la main pour mieux comprendre, et saisir de mauvais arguments fait partie de ce processus. Votre API doit être facile à utiliser et difficile à utiliser à mauvais escient, mais lorsque l’inévitable se produit, assurez-vous de signaler des messages d’erreur significatifs.

Jetez un œil au comportement des commandes standard dans Redis et voyez si vous pouvez proposer quelque chose qui fonctionne sur les mêmes hypothèses. Cela réduira la surcharge mentale requise pour utiliser vos commandes. Un exemple est que, dans Redis, la plupart des commandes ont un comportement sensible lorsqu’elles sont appelées sur une clé inexistante : INCR supposera qu’une clé manquante a la valeur 0, il la définira donc sur 1, SADD supposera qu’une clé manquante est un ensemble vide, et ainsi de suite.

3. Soyez un bon citoyen

Les modules peuvent interagir avec l’écosystème Redis. Assurez-vous de lire la documentation pour savoir comment obtenir les bons détails, surtout si votre module implémente un nouveau type de données. Voici les deux aspects les plus importants pour bien faire les choses.

Drapeaux de commande

Lorsque vous déclarez une nouvelle commande, vous devez spécifier quelques drapeaux pour indiquer à Redis ce que votre commande va faire lorsqu’elle est invoquée. Va-t-il simplement lire des données ou également les écrire ? Va-t-il allouer de la mémoire ou simplement modifier des données existantes ? Assurez-vous de remplir ces options correctement. Par exemple, dans des situations de mémoire insuffisante (OOM), nier-oom est un indicateur important qui indiquera à Redis de refuser l’accès à une commande qui alloue de la mémoire, sinon tout le processus sera tué par le tueur OOM ! Même le lecture seulement le drapeau est important. Nouvelle fonctionnalité de mise en cache côté client l’utilisera pour décider d’activer ou non le suivi pour une clé donnée.

Réplication de commandes

Lorsque Redis est exécuté dans une configuration maître/réplica, le maître doit savoir quelles commandes il doit envoyer ou non aux répliques. Toutes les commandes ne doivent pas être répliquées, et certaines peuvent devoir être répliquées uniquement dans des conditions spécifiques. Par exemple, j’ai mentionné ci-dessus la commande SETNE qui définirait une valeur de clé uniquement si la nouvelle valeur est différente de la valeur actuelle (sinon elle ne fait rien). Dans ce cas, la commande doit être répliquée uniquement lorsqu’elle applique effectivement une modification à la clé. Il n’y a aucune raison de faire en sorte que chaque réplique l’exécute si elle n’effectue aucune écriture. Redis ne peut pas savoir quoi faire de l’extérieur, vous devez donc utiliser correctement RedisModule_ReplicateVerbatim et les fonctions connexes.

4. Rédigez une excellente documentation

Peu importe l’utilité de votre module si personne ne comprend comment l’utiliser. Le polissage de votre API peut aider énormément à cet égard, mais vous devez d’abord convaincre les utilisateurs potentiels que le module vaut au moins la peine d’être essayé. Un bon module doit avoir une bonne documentation qui explique l’objectif général du module et répertorie les informations détaillées pour chaque commande.

Si vous jetez un oeil à redis.io, vous verrez que chaque commande répertorie sa complexité BigO relative et contient quelques notes supplémentaires lorsqu’une commande a des constantes particulièrement grandes ou petites, ou lorsqu’il existe des cas extrêmes notables. Essayez de reproduire ce format, en particulier en ce qui concerne la syntaxe des exemples de commandes. Remarquez comment chaque exemple utilise des noms en minuscules pour les espaces réservés, tandis que les majuscules indiquent des mots-clés qui doivent être utilisés textuellement, avec des valeurs facultatives entre crochets. Regarde le documentation de SET pour en voir un exemple.

Le plus important : viser la simplicité

Gardez toujours à l’esprit que le premier principe de conception derrière Redis est la simplicité. Cela ne signifie pas que votre module ne doit jamais explorer d’autres options et parfois sacrifier la simplicité pour d’autres avantages (les modules existent précisément pour permettre aux utilisateurs de Redis d’expérimenter), mais soyez toujours conscient de ce que vous abandonnez.

D’une manière générale, lorsque vous sacrifiez la simplicité pour la facilité d’utilisation, vous limitez également implicitement les façons dont vos utilisateurs pourront utiliser votre module. Dans Redis, la plupart des utilités ne proviennent généralement pas d’une commande donnée utilisée isolément, mais plutôt de la manière dont les utilisateurs peuvent combiner différentes commandes. Des commandes plus petites, plus claires et plus simples seront toujours plus faciles à combiner et donneront ainsi de meilleurs résultats dans le grand schéma des choses. Pour cette raison, je recommande d’augmenter la facilité d’utilisation en appliquant correctement les techniques décrites ci-dessus avant de recourir à ce genre de compromis.

Un autre compromis potentiel pourrait être en faveur de l’efficacité. Cela peut valoir la peine d’être exploré et c’est celui que Redis fait lui-même de temps en temps. Quelques types de données intégrés ont deux représentations internes – une optimisée lorsque le type de données ne contient que quelques éléments, tandis que la seconde est lorsque la clé dépasse un certain seuil. Deux représentations (plus le mécanisme pour basculer entre les deux) sont certainement plus complexes qu’une seule, mais les avantages en valent peut-être la peine. Cela est d’autant plus vrai que la complexité supplémentaire n’apparaît pas dans l’interface utilisateur, car les utilisateurs interagiront avec le type de données de la même manière, quelle que soit la représentation interne utilisée.

En conclusion

Jeter un coup d’œil à quels modules existent déjà, et voyez si vous pouvez trouver l’inspiration. Nous avons publié un SDK pour écrire des modules en Rust et aussi a écrit à propos de le faire dans Zigalors ne vous inquiétez pas si vous ne le faites pas (vouloir) connais C. Nous avons aussi des discussions sur YouTube (Rouiller, Zig), si vous préférez écouter plutôt que lire.

Si vous finissez par écrire un module, assurez-vous d’envoyer une pull request à antirez/redis-doc pour qu’il soit ajouté redis.io et, si vous en avez envie, envoie-moi un tweet @croloris. Je serai heureux d’essayer votre module.

Development Source

Related Posts

RLEC 4.2.1 apporte des contrôles granulaires à la haute disponibilité et aux performances

RLEC 4.2.1 apporte des contrôles granulaires à la haute disponibilité et aux performances

Comment HolidayMe utilise Redis Enterprise comme base de données principale

Comment HolidayMe utilise Redis Enterprise comme base de données principale

Annonce de RedisGears 1.0 : un moteur sans serveur pour Redis

Annonce de RedisGears 1.0 : un moteur sans serveur pour Redis

Clés Redis dans la RAM |  Redis

Clés Redis dans la RAM | Redis

No Comment

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *