Spring操作Redis

在 Spring 中使用 Redis,除了需要 jedis.jar 外,还需要下载 spring-data-redis.jar,这里值得注意的是 jar 包和 Spring 版本兼容的问题,我使用的 jar 包版本是 1.8.1,而 Spring 的版本是 5.0.4,如果使用其他的版本可能存在不兼容的问题,从而产生异常。

把下载的 jar 包导入到工程环境中,这样就可以在使用 Spring 提供的 RedisTemplate 操作 Redis 了,只是在使用前,需要对 Spring 提供的方案进行探讨,以便更好地使用它们。

在大部分情况下我们都会用到连接池,于是先用 Spring 配置一个 JedisPoolConfig 对象,这个配置相对而言比较简单,使用 Spring 配置 JedisPoolConfig 对象代码如下所示。

<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"><!-- 最大空闲数 --><property name="maxIdle" value="50" /><!-- 最大连接数 --><property name="maxTotal" value="100" /><!-- 最大等待时间 --><property name="maxWaitMillis" value="20000" />
</bean>

这样就设置了一个连接池的配置,继续往下配置。

在使用 Spring 提供的 RedisTemplate 之前需要配置 Spring 所提供的连接工厂,在 Spring Data Redis 方案中它提供了 4 种工厂模型。

	JredisConnectionFactory。JedisConnectionFactory。LettuceConnectionFactory。SrpConnectionFactory。

虽然使用哪种实现工厂都是可以的,但是要根据环境进行测试,以验证使用哪个方案的性能是最佳的。无论如何它们都是接口 RedisConnectionFactory 的实现类,更多的时候我们都是通过接口定义去理解它们,所以它们是具有接口适用性特性的。我将以使用最为广泛的 JedisConnectionFactory 为例进行讲解。

例如,在 Spring 中配置一个 JedisConnectionFactory 对象,配置 JedisConnectionFactory 代码如下所示。

<bean id="connectionFactory"class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="hostName" value="localhost" /><property name="port" value="6379" /><!--<property name="password" value="password"/> --><property name="poolConfig" ref="poolConfig" />
</bean>

解说

	hostName,代表的是服务器,默认值是 localhost,所以如果是本机可以不配置它。port,代表的是接口端口,默认值是 6379,所以可以使用默认的 Redis 端口,也可以不配置它。password,代表的是密码,在需要密码连接 Redis 的场合需要配置它。poolConfig,是连接池配置对象,可以设置连接池的属性。

我们完成了一个 Redis 连接工厂的配置。这里配置的是 JedisConnectionFactory,如果需要的是 LettuceConnectionFactory,可以把使用 Spring 配置 JedisPoolConfig 对象代码中的 Bean 元素的 class 属性修改为 org.springframework.data.redis.connection.lettuce.LettuceConnectionFactor 即可,这取决于项目的需要和特殊性。有了 RedisConnectionFactory 工厂,就可以使用 RedisTemplate 了。

普通的连接使用没有办法把 Java 对象直接存入 Redis,而需要我们自己提供方案,这时往往就是将对象序列化,然后使用 Redis 进行存储,而取回序列化的内容后,在通过转换转变为 Java 对象,Spring 模板中提供了封装的方案,在它内部提供了 RedisSerializer 接口(org.springframework.data.redis.serializer.RedisSerializer)和一些实现类。

可以选择 Spring 提供的方案去处理序列化,当然也可以去实现在 spring data redis 中定义的 RedisSerializer 接口,在 Spring 中提供了以下几种实现 RedisSerializer 接口的序列化器。

	GenericJackson2JsonRedisSerializer,通用的使用 Json2.jar 的包,将 Redis 对象的序列化器。Jackson2JsonRedisSerializer<T>,通过 Jackson2.jar 包提供的序列化进行转换(由于版本太旧,Spring 不推荐使用)。JdkSerializationRedisSerializer<T>,使用 JDK 的序列化器进行转化。OxmSerializer,使用 Spring O/X 对象 Object 和 XML 相互转换。StringRedisSerializer,使用字符串进行序列化。GenericToStringSerializer,通过通用的字符串序列化进行相互转换。

使用它们就能够帮助我们把对象通过序列化存储到 Redis 中,也可以把 Redis 存储的内容转换为 Java 对象,为此 Spring 提供的 RedisTemplate 还有两个属性。

	keySerializer——键序列器。valueSerializer——值序列器。

有了上面的了解,就可以配置 RedisTemplate 了。选用 StringRedisSerializer 作为 Redis 的 key 的序列化器,而使用 JdkSerializationRedisSerializer 作为其 value 的序列化器,则可以以下代码的方法来配置 RedisTemplate。

<bean id="jdkSerializationRedisSerializer"class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
<bean id="stringRedisSerializer"class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="connectionFactory" /><property name="keySerializer" ref="stringRedisSerializer" /><property name="valueSerializer" ref="jdkSerializationRedisSerializer" />
</bean>

这样就配置了一个 RedisTemplate 的对象,并且 spring data redis 知道会用对应的序列化器去转换 Redis 的键值。

举个例子,新建一个角色对象,使用 Redis 保存它的对象,使用 Redis 保存角色类对象如下所示。

package com.pojo;
import java.io.Serializable;
public class Role implements Serializable {/*** 注意,对象要可序列化,需要实现Serializable接口,往往要重写serialVersionUID*/private static final long serialVersionUID = 3447499459461375642L;private long id;private String roleName;private String note;//省略setter和getter方法
}

因为要序列化对象,所以需要实现 Serializable 接口,表明它能够序列化,而 serialVersionUID 代表的是序列化的版本编号。

接下来就可以测试保存这个 Role 对象了,测试代码如下所示。

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);
Role role = new Role();
role.setId(1L);
role.setRoleName("role_name_1");
role.setNote ("note_l");
redisTemplate.opsForValue().set("role_1", role);
Role role1 = (Role) redisTemplate.opsForValue().get ("role_1");
System.out.println(role1.getRoleName());

在 System.out.println(role1.getRoleName()) ;这行打下断点,会发现这里已经成功保存和获取了一个 Java 对象,这段代码演示的是如何使用 StringRedisSerializer 序列化 Redis 的 key,而使用 JdkSerializationRedisSerializer 序列化 Redis 的value,当然也可以根据需要去选择,甚至是自定义序列化器。

注意:以上的使用都是基于 RedisTemplate、基于连接池的操作,换句话说,并不能保证每次使用 RedisTemplate 是操作同一个对 Redis 的连接,比如上面代码中的下面两行代码。set 和 get 方法看起来很简单,它可能就来自于同一个 Redis 连接池的不同 Redis 的连接。

为了使得所有的操作都来自于同一个连接,可以使用 SessionCallback 或者 RedisCallback 这两个接口,而 RedisCallback 是比较底层的封装,其使用不是很友好,所以更多的时候会使用 SessionCallback 这个接口,通过这个接口就可以把多个命令放入到同一个 Redis 连接中去执行,代码如下所示,它主要是实现了上面代码中的功能。

package redisDemo;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;import com.pojo.Role;public class Test {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");RedisTemplate<String, Role> redisTemplate = applicationContext.getBean(RedisTemplate.class);Role role = new Role();role.setId(1L);role.setRoleName("role_name_1");role.setNote("role_note_1");SessionCallback callBack = new SessionCallback<Role>() {@Overridepublic Role execute(RedisOperations ops) throws DataAccessException {ops.boundValueOps("role_1").set(role);return (Role) ops.boundValueOps("role_1").get();}};Role savedRole = (Role) redisTemplate.execute(callBack);System.out.println(savedRole.getId());}
}

这样 set 和 get 命令就能够保证在同一个连接池的同一个 Redis 连接进行操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考研规划计算机科学与技术,2021考研:计算机科学与技术研究方向及冲刺复习规划...

一、研究方向20数据挖掘技术及应用21智能软件与计算理论22模式识别与图像处理23数据库理论及其应用技术24软件工程与面向对象设计&#xff0c;二、初试科目①101思想政治理论②201英语一③301数学一④408计算机学科专业基础综合三、考试内容和试卷结构数据结构、计算机组成原理…

Redis的6种数据类型

Redis 是一种基于内存的数据库&#xff0c;并且提供一定的持久化功能&#xff0c;它是一种键值&#xff08;key-value&#xff09;数据库&#xff0c;使用 key 作为索引找到当前缓存的数据&#xff0c;并且返回给程序调用者。 当前的 Redis 支持 6 种数据类型&#xff0c;它们…

华师计算机基础在线作业秋,18秋华师《计算机基础》在线作业(20210408185935).pdf...

正确答案 :( 多选题 ) 6: 微型计算机的输入设备主要有 ______ 。A: 键盘B: 鼠标C: 显示器D: 扫描仪正确答案 :( 多选题 ) 7: 以下工具软件属于数据压缩软件的有 ________ 。A: A1UB: WinZipC: RealPlayerD: WinRAR正确答案 :( 多选题 ) 8: 在 Excel 工作表中建立函数的方法有 _…

NoSQL和传统数据库的区别

Redis 等 NoSQL 工具也能够存储数据&#xff0c;有人认为 NoSQL 来会取代数据库&#xff0c;但是我不那么认为&#xff0c;我们要理解 NoSQL 和传统数据库的差异。 首先&#xff0c;NoSQL 的数据主要存储在内存中&#xff08;部分可以持久化到磁盘&#xff09;&#xff0c;而数…

内蒙古工业大学计算机科学与技术,计算机科学与技术的应用领域简述论文内蒙古工业大学.doc...

计算机科学与技术的应用领域简述论文内蒙古工业大学《计算机科学引论》课程专题报告题 目&#xff1a;计算机科学与技术的应用领域简述学生姓名: 徐铭贝学 院&#xff1a;信息工程学院系 别&#xff1a;计算机系专 业&#xff1a;计算机科学与技术班 级&#xff1a;计13-1学 号…

Redis字符串深入

字符串是 Redis 最基本的数据结构&#xff0c;它将以一个键和一个值存储于 Redis 内部&#xff0c;它犹如 Java 的 Map 结构&#xff0c;让 Redis 通过键去找到值。Redis 字符串的数据结构如下图所示。 Redis 会通过 key 去找到对应的字符串&#xff0c;比如通过 key1 找到 v…

Redis哈希数详解

Redis 中哈希结构就如同 Java 的 map 一样&#xff0c;一个对象里面有许多键值对&#xff0c;它是特别适合存储对象的&#xff0c;如果内存足够大&#xff0c;那么一个 Redis 的 hash 结构可以存储 2 的 32 次方减 1 个键值对&#xff08;40 多亿&#xff09;。 一般而言&…

计算机专业英语第三章在线测试,《计算机专业英语》第03章在线测试

《计算机专业英语》第03章在线测试 剩余时间&#xff1a; 57:06 答题须知&#xff1a;1、本卷满分20分。 2、答完题后&#xff0c;请一定要单击下面的“交卷”按钮交卷&#xff0c;否则无法记录本试卷的成绩。 3、在交卷之前&#xff0c;不要刷新本网页&#xff0c;否则你的答题…

Redis链表结构深入

链表结构是 Redis 中一个常用的结构&#xff0c;它可以存储多个字符串&#xff0c;而且它是有序的&#xff0c;能够存储 2 的 32 次方减 1 个节点&#xff08;超过 40 亿个节点&#xff09;。 Redis 链表是双向的&#xff0c;因此即可以从左到右&#xff0c;也可以从右到左遍历…

家用使用计算机组装,不能再简单了!家用电脑DIY组装实操

【天极网DIY硬件频道】【天极网硬件频道】近期有网友对DIY组装电脑比较感兴趣&#xff0c;因为自从智能手机和平板电脑横行霸道之后&#xff0c;家中的PC电脑被使用的时间变少了许多&#xff0c;可是偶尔有工作需求或是别有任务等&#xff0c;所以大家依然是不会让电脑远离的。…

Redis集合深入

Redis 的集合不是一个线性结构&#xff0c;而是一个哈希表结构&#xff0c;它的内部会根据 hash 分子来存储和查找数据&#xff0c;理论上一个集合可以存储 2 的 32 次方减 1 个节点&#xff08;大约 42 亿&#xff09;个元素&#xff0c;因为采用哈希表结构&#xff0c;所以对…

达尔豪西大学 计算机科学,达尔豪西大学计算机科学硕士专业.pdf

达尔豪西大学计算机科学硕士专业.pdf留学监理服务网达尔豪西大学计算机科学 - Computer Science基本信息所 达尔豪西大 所属 学 - 在计算机科学学院学 Dalhousie 院校 University 系专 学计算机科学业 历- Computer 硕士名 层Science称 次授 专予 计算机科学 业计算机与信息科学…

Redis有序集合详解

有序集合和集合类似&#xff0c;只是说它是有序的&#xff0c;和无序集合的主要区别在于每一个元素除了值之外&#xff0c;它还会多一个分数。分数是一个浮点数&#xff0c;在 Java 中是使用双精度表示的&#xff0c;根据分数&#xff0c;Redis 就可以支持对分数从小到大或者从…

如何为你的网站启用HTTPS

步骤一&#xff1a;获取SSL/TLS证书 选择SSL证书提供商&#xff1a; 选择一家可信赖的SSL证书提供商。对于小型网站&#xff0c;JoySSL提供的免费证书是一个不错的选择。购买或申请证书&#xff1a; 根据你的网站需求&#xff0c;购买相应类型的SSL证书。证书的类型包括单域、…

紫金计算机网络,南京理工大学紫金学院《计算机网络技术》考试复习题集试题(卷)(含答案解析)2.doc...

一、选择题&#xff1a;(每题2分&#xff0c;共40分)1&#xff0e;在TCP/IP参考模型中&#xff0c;TCP协议工作在( )。A、应用层 B、传输层 C、互联网层 D、网络接口层2&#xff0e;下列( )是合法的E-mail地址。A、mnetwork B、mnetworkC、mnetwork.ecjtu.jxonline D、3&#x…

Redis HyperLogLog常用命令

基数并不是存储元素&#xff0c;存储元素消耗内存空间比较大&#xff0c;而是给某一个有重复元素的数据集合&#xff08;一般是很大的数据集合&#xff09;评估需要的空间单元数&#xff0c;所以它没有办法进行存储&#xff0c;加上在工作中用得不多&#xff0c;我们要介绍一下…

大学计算机课程第六章答案,大学计算机网络课程第六章.ppt

大学计算机网络课程第六章.ppt第6章 文件管理 6.1 文件的概念 6.1 文件的概念 6.1 文件的概念 6.1 文件的概念 6.1 文件的概念 6.1 文件的概念 6.1 文件的概念 6.1 文件的概念 6.1 文件的概念 6.1 文件的概念 6.1 文件的概念 6.2 目录结构 6.2 目录结构 6.2 目录结构 6.2 目录结…

德州计算机速成班培训,德州办公软件培训速成班

德州办公软件培训速成班&#xff1f;公文管理主要负责公文的发送与接收工作&#xff0c;发送流程按照流程定制来完成&#xff0c;所以还包括流程定制功能。这三大块是OA的核心部分&#xff0c;实现也为复杂&#xff0c;特别是流程定制功能&#xff0c;是一个非常灵活的模块&…

Redis的基础事务

Redis 存在事务&#xff0c;尽管它没有数据库那么强大&#xff0c;但是它还是很有用的&#xff0c;尤其是在那些需要高并发的网站当中。 使用 Redis 读/写数据要比数据库快得多&#xff0c;如果使用 Redis 事务在某种场合下去替代数据库事务&#xff0c;则可以在保证数据一致性…

音乐美术计算机在中考,2022年音乐、美术进中考?教育部最新回应...

原标题&#xff1a;2022年音乐、美术进中考&#xff1f;教育部最新回应...国务院日前印发《关于全面加强和改进新时代学校体育工作的意见》和《关于全面加强和改进新时代学校美育工作的意见》。10月16日&#xff0c;在教育部新闻发布会上&#xff0c;教育部体育卫生与艺术教育司…