Jedis是Redis的一款Java语言的开源客户端连接工具,什么是客户端?就是真正使用者,像我们安装Redis的时候都会有一个这其实就是Redis提供的一个基于操作系统(linux、windows)的客户端。也就是真正使用者是电脑,电脑通过这个客户端可以连接Redis并操作Redis。Jedis同理,他的真正使用者是Java,Java语言可以通过Jedis来连接Redis并操作Redis。
关于Redis的客户端有很多,每个编程语言都有自己的Redis客户端,可以在官网上查看目前的客户端都有哪些:https://redis.com.cn/clients.html#java
目前Redis 官网推荐使用的 Java客户端 有三款:,其中Jedis是最基础的客户端,他只是将Redis的所有命令封装成了Java可直接调用的方法。比如Redis的set命令就对应了Jedis的set方法,get命令就对应了Jedis的get方法。他并没有替我们封装一些基于Redis的特殊功能,比如分布式锁等等…
优点: 它非常小巧,实现原理也很简单,最重要的是很稳定,而且使用的方法参数名称和官方的文档非常 match,如果有什么方法不会用,直接参考官方的指令文档阅读一下就会了,省去了非必要的重复学习成本。不像有些客户端把方法名称都换了,虽然表面上给读者带来了便捷,但是需要挨个重新学习这些 API,提高了学习成本。
缺点: Jedis是直连模式,在多个线程间共享一个Jedis实例时是线程不安全的。这里说的不安全不是说Redis处理数据不安全,而是Jedis向Redis服务器提交数据和从Redis上拿数据不安全,简单阅读Jedis的源码就不难发现,在单个Jedis实例中,向Redis推数据的写流(RedisOutputStream)和从Redis获取数据的读流(RedisInputStream)都是全局属性,当多个线程同时使用这个Jedis实例,也就是说同时操作Redis的写流和读流,结果显而易见,数据会发生不可描述的奇妙融合。
那Jedis是不是就不能用了呢?
不是的,多个线程用一个实例会产生问题,那我们就避免这个情况呀,我们为每一个线程分配一个Jedis实例,让他们单独去操作自己的数据。一般使用JedisPoll线程池来实现。
Jedis的Github源码:https://github.com/redis/jedis
安装完 Redis 的驱动程序后,接下来就是连接 Redis 服务器。最简单的连接方式,就是通过 Jedis 对象连接。代码如下:
同时我们可以使用Jedis 来操作Redis当中的事务。Redis 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。我们可以通过try-catch可以让他具备原子性。
同时Jedis也支持发布订阅:
jedi实例实现了大多数Redis命令。有关支持的命令的完整列表,请参阅jedi Javadocs:https://www.javadoc.io/doc/redis.clients/jedis/latest/redis/clients/jedis/Jedis.html
虽然 redis 服务端是单线程操作,但是在实际项目中,使用 Jedis 对象来操作 redis 时,每次操作都需要新建/关闭 TCP 连接,连接资源开销很高,同时 Jedis 对象的个数不受限制,在极端情况下可能会造成连接泄漏,同时 Jedis 存在多线程不安全的问题。
所以我们需要将 Jedis 交给线程池来管理,使用 Jedis 对象时,从连接池获取 Jedis,使用完成之后,再还给连接池。
Jedis连接池是基于apache-commons pool2实现的。在构建连接池对象的时候,需要提供池对象的配置对象,及JedisPoolConfig(继承自GenericObjectPoolConfig)。我们可以通过这个配置对象对连接池进行相关参数的配置(如最大连接数,最大空数等)。

使用Jedis连接池之后,在每次用完连接对象后一定要记得把连接归还给连接池。Jedis对close方法进行了改造,如果是连接池中的连接对象,调用Close方法将会是把连接对象返回到对象池,若不是则关闭连接。可以查看如下代码

Jedis也可以使用try-with-resources,try-with-resources是Java当中基于try-catch的一个语法糖。可以帮我们省略close的代码。
关于语法糖的本节不细讲了,感兴趣的看一下这篇文章:https://blog.csdn.net/weixin_/article/details/
对每个命令使用带有资源的try块可能会很麻烦,因此您可以考虑使用JedisPooled。
现在你可以像绝地武士一样发送命令了。
哨兵模式简单的说,就是一台主机,一台备机,外加一台监控服务,当监控服务观测到主机已经宕机,就会将备用机切换成主机,以便继续提供服务。
为了保证高可用,redis-cluster集群通常会引入主从复制模型,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。
在springboot当中一般我们使用redis都是通过引入spring-boot-starter-data-redis进行使用的。该starter主要是帮我们屏蔽了Redis客户端之间的差异,给我们提供了统一访问方式RedisTemplate,他支持使用Jedis和lettuce,默认情况下是使用的lettuce。
一般情况下我们也不会使用Jedis,都是使用默认的lettuce

我们可以排除掉lettuce的依赖,然后引入jedis的依赖。
然后添加如下配置
配置RedisTemplate序列化
测试:可以选择使用RedisTemplate 来操作redis,也可以通过JedisConnectionFactory 来获取Jedis实例来操作redis。这里获取到的Jedis记住一定要用完还给连接池。
源码当中我们重点观察这三个类RedisAutoConfiguration、LettuceConnectionConfiguration、LettuceConnectionConfiguration。
其中RedisAutoConfiguration会给我们创建一个RedisTemplate放入到容器当中。然后他创建的时候需要依赖一个RedisConnectionFactory连接工厂。

默认它会加载Lettuce的连接工厂类LettuceConnectionFactory。

我们也可以通过排除Lettuce的依赖,然后引入Jedis的依赖

第三章我们说了连接池有很多参数,但是我们通过application只能配置一部分参数,假如我们想要配置更多的参数可以手动实例化JedisConnectionFactory来创建连接池,这样就可以使用JedisPoolConfig来修改连接池配置了。。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/14099.html