Jedis
传统老牌Java客户端,一直在更新,对redis命令有比较全面的支持。
优点
- 支持全面的Redis命令,具有全面的API。
缺点
- 阻塞式I/O,其方法都是同步调用,程序流需要等到 sockets 处理完 I/O 才能执行,不支持异步;
- Jedis 客户端实例不是线程安全的,所以需要通过连接池来使用 Jedis。
lettuce
lettuce是可扩展的线程安全的客户端,支持异步模式。如果避免阻塞和事务操作,如BLPOP和MULTI/EXEC,多个线程就可以共享一个连接。lettuce 底层基于 Netty,支持高级的 Redis 特性,比如哨兵,集群,管道,自动重新连接和Redis数据模型。
优点:
- 支持同步异步通信模式;
- Lettuce 的 API 是线程安全的,如果不是执行阻塞和事务操作,如BLPOP和MULTI/EXEC,多个线程就可以共享一个连接。
- SpringBoot 2.x默认Redis客户端,对Lettuce 提供完美支持
Redisson
Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的 Java 常用对象,还提供了许多分布式服务。其中包括( BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson 提供了使用Redis 的最简单和最便捷的方法。Redisson 的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。
优点:
- 使用者对 Redis 的关注分离,可以类比 Spring 框架,这些框架搭建了应用程序的基础框架和功能,提升开发效率,让开发者有更多的时间来关注业务逻辑;
- 提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列等。 缺点:
- Redisson 对字符串的操作支持比较差。
Redis Java客户端技术选型
文章基于SpringBoot 2.x进行选型
- 仅使用Redis进行字符串的数据进行缓存处理,可以使用默认的lettuce。
- 需要使用Redis做分布式事务,可以选择lettuce + Redisson。
- 需要缓存分布式集合数据并对集合进行频繁读写操作,可以选择lettuce + Redisson。
- 使用Redis 做消息队列,可以选择lettuce + Redisson。
连接池
Lettuce 连接被设计为线程安全,所以一个连接可以被多个线程共享,同时lettuce连接默认是自动重连。
虽然连接池在大多数情况下是不必要的,但在某些用例中可能是有用的。
连接池是否有必要?
Lettuce被线程安全的,它满足了多数场景需求.。所有Redis用户的操作是单线程执行的,使用多连接并不能改善一个应用的性能.。
阻塞操作的使用通常与获得专用连接的工作线程结合在一起。
使用Redis事务是使用动态连接池的典型场景,因为需要专用连接的线程数趋于动态,也就是说动态连接池的需求是有限的。
连接池总是伴随着复杂性和维护成本提升。