前言

平时的工作中经常使用到Redis,但是对于redis客户端,你又了解多少呢?常见的redis客户端有哪些呢?你使用过什么redis的客户端呢?springboot里面集成的是什么客户端呢?

三连问一脸懵,于是乎我开始了对于redis客户端的探究,以本篇文章记录之。

常见的redis客户端

先看看redis一共有多少客户端,先去redis官网,里面有clients一栏,这不正是我想要的东西嘛!!!

redis官网 里面看到redis的常见的一些客户端,如下:

可以看到我听过的Jedis、Redission都在里面。五角星标出来的是官方推荐的redis客户端,一共三种,分别是Jedis、lettuce、Redission。

突然想起之前看到一个面试题:redission是运行在客户端还是服务端呢?当时有点疑惑呢,这不现在马上就有了答案了。客户端!!!

SpringBoot里面集成的客户端是哪一种呢?

为了回答这个问题,我打开之前的springboot项目,从pom.xml中点进去看到redis的坐标:

1
2
3
4
		 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

深入进去看到redis客户端的依赖:

可以看到使用的redis客户端是lettuce(生菜)。

在redisTemplate使用中我们打断点,也可以看到LettuceConnectionFactory相关的类:

经过查阅资料,发现在springboot1.x版本中默认使用的redis客户端是jedis,在springboot2.x中默认的客户端是lettuce。

由此引出另一个问题:

jedis和lettuce之间有什么区别呢

点开lettuce,可以看到里面有netty相关的jar包:

查阅相关资料,jedis与lettuce之间的差别总结如下表所示:

jedislettuce
jedis采用的是直连redis server,在多个线程之间共用一个jedis实例时,是线程不安全的。如果想避免线程不安全,可以使用连接池pool,这样每个线程单独使用一个jedis实例。由此带来的问题时,如果线程数过多,带来redis server的负载加大。有点类似于BIO的模式。Lettuce的连接是基于Netty的,连接实例可以在多个线程间共享,所以,一个多线程的应用可以使用同一个连接实例,而不用担心并发线程的数量。
当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
通过异步的方式可以让我们更好的利用系统资源,而不用浪费线程等待网络或磁盘I/O。Lettuce 是基于 netty 的,netty 是一个多线程、事件驱动的 I/O 框架,所以 Lettuce 可以帮助我们充分利用异步的优势。

总结

好啦,至此,对于redis客户端比有了一些更清晰的认识,再也不是模模糊糊的了。后续有更深的理解再来补充。

参考资料

SpringBoot2集成redis,使用lettuce客户端

redis官网