目录
1. 目标
针对redis java client,从多角度进行选型对比,以便选择符合业务要求的redis client。
2. 选型过程
2.1. 待选集合
依据redis官网对client的标记进行选择。
推荐的client使用star标记。最近持续维护的client使用smile标记.
待选集合:Jedis,Lettuce,Redisson。
2.2. 对比列表
Jedis | Lettuce | Redisson | |
地址 | https://github.com/xetorthio/jedis | Lettuce | https://github.com/redisson/redisson |
what | 小且健全的redis java客户端,支持redis的所有特性和命令,如事务、管道、发布订阅。 | 线程安全的redis客户端,封装同步、异步、交互API。不执行阻塞和事务操作时,多线程可共享连接。 | 线程安全的redis客户端,支持多场景,提供基于redis的某些分布式服务解决方案 |
实现与使用 | 实现简单,使用简单 | 实现较复杂,使用简单 | 实现复杂,使用简单 |
网络 | 阻塞IO | Netty | Netty |
redis命令特性支持 | redis命令与特性提供健全的支持 | redis命令与特性支持 | redis命令和特性支持 |
抽象封装程度 | 没有做特别的抽象,特性使用是否正确依赖使用者。 | 同步、异步、交互场景封装 | 丰富的数据模型、分布式服务、特性的封装,第三方框架的扩展实现 |
操作的维度 | 指令维度的操作 | 指令维度的操作 | 使用对象、服务将redis指令和业务分离,对象维度的操作,使用更方便,没有使用指令灵活,支持redisClient执行指令;分布式服务特性缺乏管理平台。 |
redis连接 | 每次操作均需要从连接池中获取连接,线程间不可以共享连接,高并发时需要考虑连接过多对client和server的影响。 | 共享连接,连接是long-lived和线程安全的,而且自动重连 | 共享连接 |
client分片 | 支持,提供实现 | 不支持,未提供实现 | 不支持,针对特殊数据模型提供数据分片 |
read slave | 未找到使用slave执行read指令的API,但可以自行实现 | 支持slave执行read指令 | 支持slave执行read指令 |
排他+超时 | 支持 | 支持 | 需要使用封装的数据模型 |
社区维护 | 社区维护好,版本更新快 | 社区维护一般,版本更新较慢 | 分为企业版和开源版,维护好,版本更新快 |
特性表 | Sorting Connection handling Commands operating on any kind of values Commands operating on string values Commands operating on hashes Commands operating on lists Commands operating on sets Commands operating on sorted sets Transactions Pipelining Publish/Subscribe Persistence control commands Remote server control commands Connection pooling Sharding (MD5, MurmurHash) Key-tags for sharding Sharding with pipelining Scripting with pipelining Redis Cluster | synchronous, asynchronous and reactive usage Redis Sentinel Redis Cluster SSL and Unix Domain Socket connections Streaming API CDI and Spring integration Codecs (for UTF8/bit/JSON etc. representation of your data) multiple Command Interfaces | 各种封装的对象 服务 其他框架的扩展实现 |
图示Redison的价值,来自redisson wiki
2.3. 确定选型的考虑角度
client连接数对redis性能影响的角度
连接数 | QPS |
100 | 12w |
3w | 6w |
6w | 5w |
所以若每秒使用redis次数达数万,不建议用Jedis,因为不仅降低redis性能,而且降低client所在服务器的性能。
可选择Lettuce,Redisson。
client分片的角度
如果不使用redis cluster,而是采用client端分片,则选择Jedis。
隔离redis具体使用的角度
Redisson,将redis指令与业务隔离,直接使用数据模型、特性封装、分布式服务,而不用关心使用哪些redis指令。
其他文章