RedisTemplate操作Redis详解之连接Redis及自定义序列化

连接到Redis


使用Redis和Spring时的首要任务之一是通过IoC容器连接到Redis。为此,需要java连接器(或绑定)。无论选择哪种库,你都只需要使用一组Spring Data Redis API(在所有连接器中行为一致):org.springframework.data.redis.connection软件包及其RedisConnection与RedisConnectionFactory接口,用于处理和检索与Redis的活动连接。

RedisConnection和RedisConnectionFactory

RedisConnection提供了Redis通信和核心构建块,因为它处理与Redis后端的通信。它还会自动将基础链接库异常转换为Spring一致的DAO异常层次结构,以便您可以在不更改任何代码的情况下切换连接器,因为操作语义保持不变。

当按照上篇文档配置好Redis后,IOC会加载ConnectionFactory,我们可以直接注入,然后创建连接操作Redis。

RedisConnection提供了Redis 各大数据类型的操作API:

public interface RedisConnection extends RedisCommands, AutoCloseable {default RedisGeoCommands geoCommands() {return this;}default RedisHashCommands hashCommands() {return this;}default RedisHyperLogLogCommands hyperLogLogCommands() {return this;}default RedisKeyCommands keyCommands() {return this;}default RedisListCommands listCommands() {return this;}default RedisSetCommands setCommands() {return this;}default RedisScriptingCommands scriptingCommands() {return this;}default RedisServerCommands serverCommands() {return this;}default RedisStreamCommands streamCommands() {return this;}default RedisStringCommands stringCommands() {return this;}default RedisZSetCommands zSetCommands() {return this;}
}
    @AutowiredLettuceConnectionFactory lettuceConnectionFactory;@Testvoid lettuceConnectionFactoryTest() {RedisConnection connection = lettuceConnectionFactory.getConnection();Boolean result = connection.set("k".getBytes(), "1".getBytes());System.err.println(result);byte[] bytes = connection.get("k".getBytes());assert bytes != null;System.err.println("k:" + new String(bytes));}

RedisTemplate简介

大多数用户可能会使用RedisTemplate及其相应的软件包org.springframework.data.redis.core。实际上,由于模版具有丰富的功能集,因此它是Redis模块的中心类。该模板为Redis交互提供了高级抽象,虽然RedisConnection提供了接受和返回二进制值(byte数组)的低级方法,但是模板负责序列化和连接管理,使用户无需处理此类细节。

此外,该模板提供了操作视图(根据Redis命令参考进行分组),提供了丰富的,通用的接口,用于针对某种类型或某些键(通过keyBound接口),如下表所述:

界面 描述
按键类型操作
GeoOperationsRedis的地理空间操作的,比如GEOADD,GEORADIUS...
HashOperationsRedis哈希操作
HyperLogLogOperationsRedis的HyperLogLog操作,例如PFADD,PFCONT,...
ListOperationsRedis列表操作
SetOperationsRedis设置操作
ValueOperationsRedis字符串(或值)操作
ZSetOperationsRedis zset(或排序集)操作
关键绑定操作
BoundGeoOperationsRedis键绑定地理空间操作
BoundHashOperationsRedis哈希键绑定操作
BoundKeyOperationsRedis按键绑定操作
BoundListOperationsRedis列表键绑定操作
BoundSetOperations

Redis设置键绑定操作

BoundValueOperationsRedis字符串(或值)键绑定操作
BoundZSetOperationsRedis zset(或排序集)键绑定操作

序列化器

自带序列化器

RedisTemplate大多数操作都使用基于Java的序列化器。这意味着模板编写或读取的任何对象都将通过Java进行序列化和反序列化。你可以在模板上更改序列化机制,Redis模块提供了几种实现,可在org.springframework.data.redis.serializer软件包中找到,您还可以将任何序列化器设置为null,并通过将enableDefaultSerializer属性设置为来将RedisTemplate与原始字节数组一起使用False。请注意,模板要求所有键都不为空。但是,只要基础串行器接受这些值,它们就可以为空。

从框架的角度来看,Redis中存储的数据仅为字节。尽管Redis本身支持各种类型,但在大多数情况下,它们是指数据的存储方式而不是数据的表示方式。由用户决定是否将信息转换为字符串或任何其他对象。

在Spring Data中,用户(自定义)类型和原始数据之间的转换(反之亦然)在org.springframework.data.redis.serializer包中的Redis中进行处理。

该软件包包含两种类型的序列化器,它们负责序列化过程:

  • 基于的两路串行器RedisSerializer。
  • 使用RedisElementReader和的元素读取器和写入器RedisElementWriter。

框架自带各种序列化器:

名称说明
OxmSerializer通过Spring OXM支持将其用于对象/XML映射
ByteArrayRedisSerializerByte数组序列化
GenericJackson2JsonRedisSerializer以JSON格式去存储数据,会保存序列化的对象的包名和类名,反序列化时以这个作为标示就可以反序列化成指定的对象。效率低,占用内存高
GenericToStringSerializer可以将任何对象泛化为字符串并序列化
StringRedisSerializer简单的字符串序列化
JdkSerializationRedisSerializerJDK序列化,默认用于RedisCache和RedisTemplate
Jackson2JsonRedisSerializer以JSON格式去存储数据,需要指明序列化的类Class,可以使用Object.class
自定义序列化器

RedisTemplate默认使用JDK序列化,可以使用自带其他的序列化,或者自己实现第三方序列化方式,比如:

  • google:Protobuf
  • faceBook:Thrift
  • kryo
  • hessian
  • fst
  • Jackson
  • Gson
  • FastJson
Protobuf序列化

ProtoBuf(Google Protocol Buffer)是由Google公司用于数据交换的序列结构化数据格式,具有跨平台、跨语言、可扩展特性,类型于常用的XML及JSON,但具有更小的传输体积、更高的编码、编码能力,特别适合于数据存储、网络数据传输等对存储体积、实时性要求高的领域。

优点:性能好,效率高。支持向后兼容和向前兼容。支持多种编程语言(Java,C++,python);

缺点:二进制格式导致可读性差(二进制格式)

RedisTemplate使用Protobuf

1、添加POM;

  <dependency><groupId>io.protostuff</groupId><artifactId>protostuff-runtime</artifactId><version>1.7.4</version></dependency><dependency><groupId>io.protostuff</groupId><artifactId>protostuff-core</artifactId><version>1.7.4</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

1、 实现RedisSerializer接口;

@Slf4j
public class ProtoStuffRedisSerializer<T> implements RedisSerializer<T> {// RuntimeSchema是一个包含业务对象所有信息的类,包括类信息、字段信息private static final Schema<ProtoStuffWrapper> schema = RuntimeSchema.getSchema(ProtoStuffWrapper.class);/*** 序列化:对象=》字节数组** @param t 需要序列化的对象t* @return 二进制* @throws SerializationException 序列化异常*/@Overridepublic byte[] serialize(T t) throws SerializationException {if (t == null) {return null;}// 开辟了512字节缓存,用来存放业务对象序列化之后存放的地方,如果空间不足,会自动扩展扩展LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);byte[] bytes;try {// 序列化bytes = ProtostuffIOUtil.toByteArray(new ProtoStuffWrapper<>(t), schema, buffer);} finally {buffer.clear();}return bytes;}/*** 反序列化 字节数组=》对象** @param bytes 字节数组* @return 对象* @throws SerializationException 序列化异常*/@Overridepublic T deserialize(byte[] bytes) throws SerializationException {if (bytes == null || bytes.length == 0) {return null;}try {ProtoStuffWrapper<T> protoStuffWrapper = new ProtoStuffWrapper<>();// 反序列ProtostuffIOUtil.mergeFrom(bytes, protoStuffWrapper, schema);return protoStuffWrapper.getT();} catch (Exception e) {throw new RuntimeException(e);}}/*** 序列化包装类,深度克隆,避免无法获取schema** @param <T> 业务对象*/public static class ProtoStuffWrapper<T> implements Cloneable {private T t;ProtoStuffWrapper() {}ProtoStuffWrapper(T t) {this.t = t;}public T getT() {return t;}public void setT(T t) {this.t = t;}@Override@SuppressWarnings("unchecked")public ProtoStuffWrapper<T> clone() {try {return (ProtoStuffWrapper<T>) super.clone();} catch (CloneNotSupportedException e) {return new ProtoStuffWrapper<T>();}}}
}

1、 创建RedisTemplate,设置序列化;

 /*** 创建RedisTemplate** @param redisConnectionFactory 连接工厂* @param <T>                    值类型* @return RedisTemplate*/@Bean(name = "redisTemplate")public <T> RedisTemplate<String, T> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, T> redisTemplate = new RedisTemplate<>();// 设置连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);// String序列化对象RedisSerializer<String> stringRedisSerializer = RedisSerializer.string();// ProtoStuff序列化ProtoStuffRedisSerializer<T> protoStuffRedisSerializer = new ProtoStuffRedisSerializer<>();// 序列化配置=>KeyredisTemplate.setKeySerializer(stringRedisSerializer); // 所有Key都设置为字符串,方便阅读redisTemplate.setHashKeySerializer(protoStuffRedisSerializer); //  设置Hash数据结构中的Key// 序列化配置=>ValueredisTemplate.setValueSerializer(protoStuffRedisSerializer); // 所有ValueredisTemplate.setHashValueSerializer(protoStuffRedisSerializer);  //  Hash数据结构中的ValueredisTemplate.afterPropertiesSet();return redisTemplate;}

1、 添加测试实体类;

@ToString
@Data
public class User {String userName;String password;int age;
}

1、 添加测试类测试;

@Testvoid protoStuffTest() {User user = new User();user.setAge(20);user.setUserName("韩梅梅");user.setPassword("123456");redisTemplate.boundValueOps("k").set(user);User user1 = redisTemplate.boundValueOps("k").get();redisTemplate.boundHashOps("hash").putIfAbsent("kkk","vvv");System.err.println(user1.toString());}

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

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

相关文章

商务分析方法与工具(十):Python的趣味快捷-公司财务数据最炫酷可视化

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

无尘室手套的选定标准

无尘室手套的选定标准主要包括以下几个方面&#xff1a; 材料选择&#xff1a; 考虑与应用的相容性&#xff0c;例如某些化学品可能对某些材料产生反应。是否存在乳胶过敏也是一个重要的考虑因素。常见的选择包括丁腈手套&#xff0c;它们通常比乳胶手套更耐用且化学稳定性更…

01-02-5

1、单链表中按位置查找 a.原理 通过传递的位置&#xff0c;返回该位置对应的地址&#xff0c;放到主函数定义的指针变量中。 我们认为位置从&#xff1a;有数据的节点开始计数 即如下结构&#xff1a; 查找位置&#xff0c;就是返回该位置对应的空间地址。 b.代码说明 Ⅰ…

【送书福利第七期】你好!Java(文末送书)

文章目录 编辑推荐内容简介作者简介目录前言/序言 编辑推荐 适读人群 &#xff1a;程序员;相关院校师生 本书以轻松幽默的语言&#xff0c;从零开始介绍Java语言。书名来源于编程语言中最经典的Hello World程序&#xff0c;寓意带读者从入门到精通。 书中每章都设有总结与扩展…

triton之gemm

一 原理 如果不采用group gemm的话,采用单流执行,则具体的硬件执行调度如下所示: gemm0,gemm1,gemm2同时分配任务给sm做 第一轮:gemm0、gemm1和gemm2的0-4分给4个sm去做,都计算完成 第二轮:gemm0在上一轮已经计算完毕,gemm1和gemm2的45分给sm0,sm1去做,在这一轮…

react18【系列实用教程】JSX (2024最新版)

为什么要用 JSX&#xff1f; JSX 给 HTML 赋予了 JS 的编程能力 JSX 的本质 JSX 是 JavaScript 的语法扩展&#xff0c;浏览器本身不能识别&#xff0c;需要通过解析工具&#xff08;如babel&#xff09;解析之后才能在浏览器中运行。 bable 官网可以查看解析过程 JSX 的语法 …

NeurIPS‘24 截稿日期逼近 加拿大温哥华邀你共赴盛会

会议之眼 快讯 第38届NeurIPS24(Conference and Workshop on Neural Information Processing Systems)即神经信息处理系统研讨会将于 2024 年 12月9日-15日在加拿大温哥华会议中心举行&#xff01; NeurIPS 每一年都是全球AI领域的一场盛宴&#xff0c;吸引着来自世界各地的顶…

上位机图像处理和嵌入式模块部署(树莓派4b 应用的注意事项)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 树莓派系列开发板最早的时候&#xff0c;价格还是比较高的。不过由于它生态比较丰富&#xff0c;使用起来比较方便&#xff0c;所以大家都默认了它…

《intel开发手册卷3》读书笔记1

1、CPU工作模式 1&#xff09;实模式&#xff1a;8086的寄存器只有16位&#xff0c;我们也习惯于称8086的工作模式为16位模式。后续的CPU为了保持兼容性&#xff0c;在芯片上了电以后&#xff0c;还必须运行于16位模式之下。这种模式还有个正式的名字叫做实模式。在实模式下&am…

【6D位姿估计】FoundationPose 跑通demo 训练记录

前言 本文记录在FoundationPose中&#xff0c;跑通基于CAD模型为输入的demo&#xff0c;输出位姿信息&#xff0c;可视化结果。 然后分享NeRF物体重建部分的训练&#xff0c;以及RGBD图为输入的demo。 1、搭建环境 方案1&#xff1a;基于docker镜像&#xff08;推荐&#xf…

良心实用的电脑桌面便利贴,好用的便利贴便签小工具

在日常办公中&#xff0c;上班族经常需要记录临时任务、重要提醒或者突发的灵感。比如&#xff0c;在紧张的项目会议中&#xff0c;忽然想到一个改进的点子&#xff0c;或者是在处理邮件时&#xff0c;需要记下对某个客户的回复要点。在这些场景下&#xff0c;如果能直接在电脑…

电商平台接口自动化框架实践||电商API数据采集接口

电商数据采集接口 语言&#xff1a;python 接口自动化实现流程 红色为可实现/尚未完成 绿色为需要人工干预部分 自动生成测试用例模板&#xff08;俩种方式二选一&#xff09;&#xff1a; mimproxy&#xff0c;通过浏览器代理抓包方式&#xff0c;访问 H5 或者 web 页面&a…