Redis的两个框架:

Jedis与RedissonJedis api 在线网址

redisson 官网https://redisson.org/

redisson git项目地址https://github.com/redisson/redisson

lettuce 官网地址:https://lettuce.io/

lettuce git项目地址:https://github.com/lettuce-io/lettuce-core

 

在redis官网推荐的三大框架就是:jedis  redission  lettuce

redisson api文档 redission官方文档_redisson api文档

我们在使用redis的时候,需要使用驱动来链接redis,通过驱动去操作redis,我们可以直接使用redis提供的基本的驱动来操作数据库但是为了效率我们一般会使用开源的解决方案来进行操作,目前主流的开源解决方案有jedis,redission,lettuce三种解决方案,其中jedis是同步(即当前jedis与redis数据库获取连接后,只有当释放连接后才能允许下一次的连接,所以需要通过连接池来使用Jedis)的方案,现在包括spring-data也已经不再内置使用了,替换成了lettuce,那有些人就说了,那我们学习lettuce不就行了么?你说的没问题,为什么有三种呢,我们其实使用一种就可以了啊,是的没有问题,但是用哪个我们需要来分析分析。jedis出现的时间比较长了,接触redis比较早的人可能使用的都是jedis,但是随着现代系统的多核和异步,为了不断提高的吞吐量,异步非阻塞线程模型大行其道,这里面非常热门的框架就是Netty,Netty因其设计优秀,应用面广,实际使用的场景广泛,很多大型框架比如hadoop,dubbo等许多的底层都是通过Netty来实现的通信。所以我们就专门针对异步的且基于netty的Redis驱动来分析,redission和lettuce都是基于netty的也就是说他俩都是异步非阻塞的,但是他们有什么区别呢?其实在使用语法上面有一些区别,redission对结果做了一层包装,通过包装类来进行一些额外的操作来达到异步操作,并且redission提供了额外的分部署锁功能,可能很多人并不会去研究这个功能或者说公司内有大牛自己来实现分布式锁,这些就另当别论了。

1 概述

1.1.  主要内容

    Redisclient支持多种语言,包括:c、C++、C#、php、java、python、go等语言,根据自己的开发语言,选择合适的redis client版本类型即可。我是使用java语言开发的,针对java语言,redis client也提供了多种客户端支持,按照推荐类型依次是:Jedis、Redisson、JRedis、JDBC-Redis、RJC、redis-protocol、aredis、lettuce。

    本文的主要内容为对比Redis的两个框架:Jedis与Redisson,分析各自的优势与缺点,为项目中Java缓存方案中的Redis编程模型的选择提供参考。

2.Jedis与Redisson对比

2.1. 概况对比

  • Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟练的使用Jedis。
  • 而Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了一个或多个Redis方法调用。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

(即jedis的每个方法底层都是对redis的单个命令的封装,而redission的每个方法比较复杂,封装了一个或多个redis命令)

2.2. 数据结构

Jedis仅支持基本的数据类型如:String、Hash、List、Set、Sorted Set。

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

Redisson实现了分布式和可扩展的java数据结构,支持的数据结构有:List, Set, Map, Queue, SortedSet, ConcureentMap, Lock, AtomicLong, CountDownLatch。并且是线程安全的,底层使用Netty4实现网络通信。和jedis相比,功能比较简单,不支持排序,事务,管道,分区等redis特性,可以认为是jedis的补充,不能替换jedis。

优点:

  • 可以使用熟悉的java数据结构,比如要往List中存储1,2,3,4,代码是这样的:
List<Integer> list = redisson.getList("list");
list.add(1);
list.add(2);
list.add(3);
list.add(4);
  • 支持存储pojo对象,比如要存储一个TestObject,代码是这样的:
List<TestObject> list = redisson.getList("list");
list.add(new TestObject());
  • 是线程安全的,这也是redisson特别强调的,看一下List的存储逻辑,使用watch,muti,exec保证了数据的一致性。
public V set(int index, V element) {
    checkIndex(index);
    RedisConnection<String, Object> conn = connectionManager.connection();
    try {
        while (true) {
            conn.watch(getName());
            V prev = (V) conn.lindex(getName(), index);
            conn.multi();
            conn.lset(getName(), index, element);
            if (conn.exec().size() == 1) {
                return prev;
            }
        }
    } finally {
        connectionManager.release(conn);
    }
}

缺点:

  • 不支持字符串存储,Redisson的实现类中只支持集合操作,不能对普通字符做操作。
  • 不支持很多redis特性,比如排序,事务,管道,集群等。
  • 发布时间短,稳定性和可靠性有待验证。

Redisson不仅提供了一系列的分布式Java常用对象,基本可以与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可提供更便捷的方法。

2.3.可伸缩性

Jedis使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。

Redisson使用非阻塞的I/O和基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作。

Lettuce:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作

2.4. 第三方框架整合

1       Redisson提供了和Spring框架的各项特性类似的,以Spring XML的命名空间的方式配置RedissonClient实例和它所支持的所有对象和服务;

2       Redisson完整的实现了Spring框架里的缓存机制;

3       Redisson在Redis的基础上实现了Java缓存标准规范;

4       Redisson为Apache Tomcat集群提供了基于Redis的非黏性会话管理功能。该功能支持Apache Tomcat的6、7和8版。

5 Redisson还提供了Spring Session会话管理器的实现。