前言:在 JavaWeb 中实现对 Redis 的操作,主要有两种方式:Jedis和RedisTemplate。Jedis是Redis官方推荐的面向Java操作Redis的客户端开发Jar包;而RedisTemplate是Spring框架对Jedis API的进行了高度封装,支持连接池自动管理,我们可以在Spring应用中通过简单的连接池配置信息就能访问Redis服务并进行相关缓存操作。也就是Spring的spring-data-redis的相关Jar包,它还默认提供了两个使用Redis的类StringRedisTemplate和RedisTemplate,其中RedisTemplate可以支持Redis没有的缓存对象的操作,而StringRedisTemplate用来存储字符串。
1.1、什么是Jedis?
Jedis 是 Redis 官方推荐的Java客户端开发包,集成了Redis的命令操作,提供了连接池管理。通过Jedis我们可以实现连接Redis,以及操作 Redis 。简而言之,Jedis是Redis的Java连接开发工具。
redis-cli.exe是Redis官方提供的客户端,可以看作一个shell程序,它可以发送命令对redis进行操作;对于Jedis而言,同理是使用Java语言操作Redis,相当于Mysql驱动。Jedis提供了很多接口供Java语言调用。可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis、SRP等等。
Jedis常用API:
1.2、Jedis 的使用
就像在学习 springmvc 框架之前学习 servlet 一样,了解 Jedis 的使用,看一下单机中 Jedis 的使用,
(1)Maven导入相关jar包
(2)Jedis直连使用
Jedis直连,本质是定义一个tcp连接,然后使用socket技术进行通信。每次操作新创建一个Jedis对象,执行完毕后关闭连接释放对象,对应的就是一次tcp连接。
测试结果:直接使用Jedis很简单
Redis 中最主要的就是读写数据。Redis 只能支持六种数据类型(string/hash/list/set/zset/hyperloglog)的操作,但在 Java 中我们却通常以类对象为主,所以在需要 Redis 存储的五中数据类型与 Java 对象之间进行转换,如果自己编写一些工具类,比如一个角色对象的转换,还是比较容易的,但是涉及到许多对象的时候,这其中无论工作量还是工作难度都是很大的,所以总体来说,就操作对象而言,使用 Redis 还是挺难的,好在 Spring 框架对这些进行了封装和支持。
上面说到了 Jedis 无法操作对象的问题,无法在那些基础类型和 Java 对象之间方便的转换,但是在 Spring 应用中,这些问题都可以通过使用RedisTemplate得到解决!
(3)Jedis直连的缺陷
首先我们如果每次使用缓存都生成一个 Jedis 对象的话,这样意味着会建立很多 socket 连接,造成系统资源浪费;同时在实现上是直连,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。
因此,为了避免这些问题,引入了池的概念 JedisPool。JedisPool 是一个线程安全的网络连接池,预先生成一批jedis连接对象放入连接池中,当需要对redis进行操作时从连接池中借用jedis对象,操作完成后归还。这样jedis对象可以重复使用,避免了频繁创建socket连接,节省了连接开销。所以就可以有效的解决以上问题以实现系统的高性能。
我们可以把JedisPool理解成项目中的数据库连接池,例如:阿里巴巴的druid
1.3、JedisPool连接池使用
Jedis连接资源的创建与销毁是很消耗程序性能,所以Jedis为我们提供了Jedis的池化技术。
JedisPool在创建时初始化一些连接资源存储到连接池中,使用Jedis连接资源时不需要创建,而是从连接池中获取一个资源进行Redis的操作,使用完毕后,不需要销毁该Jedis连接资源,而是将该资源归还给连接池,供其他请求使用。这样jedis对象可以重复使用,避免了频繁创建socket连接,节省了连接开销。
Jedis直连和使用连接池JedisPool的对比:
(1)JedisPool简单使用
这里只是对连接池进行一个简单使用,实际开发通常会对JedisPool进行封装,进行一些参数配置和方法定义等
测试结果:
(2)JedisPool 属性配置(JedisPoolConfig)
对于企业级开发来说,连接池的合理使用是非常重要的,如果设置不当会引起很多不必要的麻烦,容易造成线上的故障。
为了方便使用,Jedis提供了,它本身继承了设置了一些空闲监测设置
JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。
具体如何正确设置,可以置参考博客:Jedis连接池的使用及配置优化
(3)JedisPool封装工具类例子
JedisPoolUtil类:封装Redis连接池配置JedisPoolConfig信息,通过单例RedisPool获取redis对象
因为连接池中会有很多实例,RedisPool对象会很大,所以我们需要把他写成单例模式,如果是交由Spring管理就不用了,因为Spring管理的Bean默认是单例的。
a、JedisPoolUtil类
b、编写测试代码:
运行结果:获取JedisPool的对象是单例模式的,然后从JedisPool连接池里面取出jedis对象进行缓存存取操作

1.4、项目使用的JedisUtil工具类
JedisPool一般通过读取jedis.properties配置文件指定JedisPoolConfig信息比较方便,这样需求变动时只需要修改配置文件,而不用修改代码。
(1)在项目Resource目录下新建jedis.properties配置文件如下
jedis.properties配置文件:
(2)Jedis封装工具类
(3)JedisUtil测试代码
测试结果:
2.1、Redis
redis是一款开源的高性能Key-Value数据库,运行在内存中,由ANSI C编写。企业开发通常采用Redis来实现缓存。同类的产品还有memcache 、memcached 、MongoDB等。
2.2、Jedis
Jedis是Redis官方推出的一款面向Java的客户端,提供了很多接口供Java语言调用。可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis、SRP等等。
2.3、Spring Data Redis
Spring-data-redis是Spring大家族的一部分,提供了在srping应用中通过简单的连接池配置访问redis服务,对Reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装。其中的RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。而且RedisTemplate还支持对象缓存操作。
spring-data-redis针对Jedis 提供了如下功能:
a.连接池自动管理,提供了一个高度封装的“RedisTemplate”类
b.针对Jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
- ValueOperations:简单K-V操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:针对list类型的数据操作
第一部分我们对Jedis的使用进行了介绍,而且封装了一个JedisPoolUtil工具类。可是这样还是很麻烦,难道每次我们使用的时候都得复制这个JedisUtill 连接池配置工具类到新项目中?而且Jedis还不支持缓存对象的操作。程序员从来不需要重复遭轮子,Spring框架已经帮我们封装好了这一切!
Spring框架中的spring-data-redis模块对Jedis API的进行了高度封装,提供了在Spring应用中通过简单的连接池信息配置就可以访问Redis服务并进行相关缓存操作。SpringDataRedis相对于Jedis来说可以方便地更换Redis的Java客户端如多线程安全的Lettuce,比Jedis多了自动管理连接池的特性,不需要我们自己的JediPoolUtil封装工具类。
它还默认提供了两个使用Redis的类StringRedisTemplate和RedisTemplate,其中RedisTemplate可以支持Redis没有的缓存对象的操作,而StringRedisTemplate用来存储字符串。(其实它们都是RedisTemplate<K, V>泛型接口的实现类,我们可以自定义模板然后@AutoWired注入IOC容器中使用)
3.1、pom.xml添加redis的起步依赖
3.2、通过自带的StringRedisTemplate类存储对象到Redis中
3.3、SpringBoot 2.0已经使用
其实,随着的到来,支持的组件越来越丰富,也越来越成熟,其中对的支持不仅仅是丰富了它的API,更是替换掉底层的依赖,取而代之换成了高级Redis客户端,用于多线程安全同步,异步和响应使用。
和的都是连接的客户端程序。在实现上是直连,多线程环境下非线程安全,除非使用连接池JedisPool,为每个Jedis实例增加物理连接。基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
为了多线程安全,以前是Jedis+JedisPool组合 ,现在在SpringBoot 2.0应用中直接使用RedisTemplate即可只要配置好连接池属性,那么SpringBoot就能自动管理连接池。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/2207.html