web-dev-qa-db-fra.com

Redisson vs Jedis pour redis

Maintenant, je dois utiliser un client Java pour redis. J'ai rencontré Jedis et Redisson .

[~ # ~] modifier [~ # ~] : recadrage car la question était basée sur une opinion.

Quel est le plus efficace en termes de vitesse? Des repères?

Lequel d'entre eux est en mesure de fournir les éléments suivants?

  • Verrous distribués (et mise à jour de certaines clés dans une carte)

  • Notification d'expiration de clé automatique, mais je souhaite que cela ne soit reçu que par un seul abonné particulier parmi un groupe d'abonnés (similaire au concept de groupe de consommateurs dans Apache Kafka). Comment cela peut-il être réalisé?

PS: Veuillez ne pas le marquer comme doublon de this .

30
Shubham Chaurasia

Cette question est basée sur l'opinion, mais permet d'obtenir quelques points objectifs:

TL; DR:

Le choix du pilote dépend de plusieurs choses:

  • Dépendances supplémentaires
  • Modèle de programmation
  • Évolutivité
  • Avoir une opinion sur la mise en œuvre de fonctionnalités de haut niveau
  • Perspective de votre projet, direction dans laquelle vous souhaitez évoluer

Explication

Dépendances supplémentaires

Certains projets sont jugés concernant les dépendances supplémentaires et les dépendances transitoires lors de l'ajout d'une bibliothèque.

Jedis est presque sans dépendance, il nécessite Apache Commons Pool 2 pour le pooling de connexions.

Redisson requiert Netty, l'API JCache et Project Reactor comme dépendances de base. Il est extensible car il s'intègre à de nombreuses autres bibliothèques (magasin Tomcat Session).

Modèle de programmation

C'est ainsi que vous interagissez avec votre client Redis. Il définit également le niveau d'abstraction.

Jedis est un pilote de bas niveau exposant l'API Redis comme Java appels de méthode:

Jedis jedis = …;

jedis.set("key", "value");

List<String> values = jedis.mget("key", "key2", "key3");

Redisson est un client de haut niveau qui expose ses fonctionnalités à travers différents objets API:

Redisson redisson = …

RMap map = redisson.getMap("my-map"); // implement Java.util.Map

map.put("key", "value");

map.containsKey("key");

map.get("key");

Chaque appel invoque un ou plusieurs appels Redis, certains d'entre eux sont implémentés avec Lua (Redis "Scripting").

Évolutivité

Il existe plusieurs pilotes disponibles pour Java qui viennent avec diverses propriétés qui pourraient convenir à votre projet. L'évolutivité joue également dans cela. En regardant les pilotes, il résume comment les pilotes, fonctionnent avec leurs ressources et quelle programmation modèles qu'ils prennent en charge.

Jedis utilise le blocage des E/S et les appels de méthode sont synchrones. Votre flux de programme doit attendre que les E/S soient gérées par les sockets. Il n'y a pas de support asynchrone (Future, CompletableFuture) ou réactif (RxJava Observable ou Reactive Streams Publisher).

Les instances client Jedis ne sont pas thread-safe, elles nécessitent donc un pool de connexions (instance Jedis par thread appelant).

Redisson utilise des E/S non bloquantes et une couche de communication événementielle avec netty. Les appels de méthode sont synchrones, asynchrones ou réactifs (via Project Reactor 2.0 ou 3.1). Les connexions sont regroupées, mais l'API elle-même est thread-safe et nécessite moins de ressources. Je ne suis pas tout à fait sûr, mais vous pouvez peut-être même opérer sur une seule connexion. C'est le moyen le plus efficace lorsque vous travaillez avec Redis.

Opinion sur l'implémentation client

Ces paragraphes traitent de la façon dont les clients sont mis en œuvre.

Les deux clients ont une excellente couverture de fonctionnalités et vous pouvez répondre à vos besoins avec les deux bibliothèques.

Jedis est une implémentation simple qui écrit simplement des commandes dans un OutputStream et analyse les réponses. Pas plus que ça.

Si vous souhaitez des fonctionnalités de haut niveau, vous devez les implémenter à l'aide de l'API Redis. Il vous donne un contrôle total sur les commandes que vous invoquez et le comportement qui en résulte. La mise en œuvre de vos fonctionnalités peut nécessiter des efforts supplémentaires ici.

Redisson est un client de haut niveau qui fournit des fonctionnalités à travers ses abstractions. Bien que vous puissiez utiliser ces objets sans avoir besoin de savoir qu'ils sont soutenus par Redis (Map, List, Set,…), chaque appel d'API se traduit par un ou plusieurs Redis appels, certains à l'exécution du script Lua.

Vous pourriez aimer ou détester la façon dont Redisson se comporte et comment il met en œuvre les fonctionnalités, mais au final, vous ne pouvez pas faire grand-chose. L'utilisation des fonctionnalités de haut niveau de Redissons peut réduire vos efforts d'implémentation.

Perspective

Cette section dépend entièrement de votre destination. Jedis prend en charge toutes les commandes de l'API Redis, Redis Standalone, Redis Sentinel et Redis Cluster. Il n'y a pas de lecture esclave dans les configurations maître-esclave, mais je suppose que ce n'est qu'une question de temps jusqu'à ce que jedis fournisse ces fonctionnalités.

Avec jedis, vous ne pouvez pas passer en mode asynchrone et l'utilisation des fonctionnalités avancées d'AWS ElastiCache ou des lectures esclaves nécessite votre propre implémentation.

Redisson a une large couverture de diverses configurations. Il prend en charge tout ce que Jedis prend en charge et fournit des stratégies de lecture pour les configurations maître/esclave, a amélioré la prise en charge d'AWS ElastiCache.

53
mp911de