当前位置: 首页 > news >正文

Redis - SpringDataRedis - RedisTemplate

目录

概述

创建项目

引入依赖

配置文件

测试代码

测试结果

数据序列化器

自定义RedisTemplate的序列化方式

测试报错

添加依赖后测试

存入一个 String 类型的数据

测试存入一个对象

优化 -- 手动序列化

测试存入一个Hash

总结:


概述

SpringDataSpring数据操作的模块,包含对各种数据库的集成,其中对 Redis 的集成模块就叫做 SpringDataRedis

官网地址:Spring Data Redis

  • 提供了对不同 Redis 客户端的整合(Lettuce 和 Jedis)。
  • 提供了 RedisTemplate 统一 API 来操作 Redis。
  • 支持 Redis 的 发布订阅模型
  • 支持 Redis 哨兵和 Redis 集群
  • 支持基于 Lettuce 的响应式编程
  • 支持基于 JDK.JSON 字符串 Spring 对象的数据序列化及反序列化
  • 支持基于 Redis 的 JDKCollection 实现

SpringDataRedis 中提供了 RedisTemplate 工具类,其中封装了各种对 Redis 的操作。并且将不同数据类型的操作 API 封装到了不同的类型中:

创建项目

引入依赖

       <!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--common-pool--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

配置文件

spring:redis:host: 192.168.50.130port: 6379password: 123456database: 1  # 选择了1号库lettuce:pool:max-active: 8  #最大连接max-idle: 8   #最大空闲连接min-idle: 0   #最小空闲连接max-wait: 100ms #连接等待时间

测试代码

    @Autowiredprivate RedisTemplate redisTemplate;@Testvoid testString() {// 写入一条String数据redisTemplate.opsForValue().set("name","luyuan");// 获取String数据Object name = redisTemplate.opsForValue().get("name");System.out.println("name == " + name);}

测试结果

数据序列化器

但是可视化软件里面显示的值是一长串 -- 这是因为序列化的问题,

这是Redis的几个序列化器

我们debug一下刚刚的程序

F7 步入

F7 步入

可以见到这个是默认的 JdkSerializationRedisSerializer

使用 JdkSerializationRedisSerializer 缺点:

  • 可读性差
  • 内存占用较大 --- 很长一大段

自定义RedisTemplate的序列化方式

    @Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {// 创建RedisTemplate对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置 Key 的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置 Value 的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);return template;}

测试报错

报错原因:少了一个jackson序列化的依赖,springmvc中会有这个依赖,但是本项目中没有添加

        <!--Jackson依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>

添加依赖后测试

存入一个 String 类型的数据

Redis可视化端查看数据正常插入,对比没有自定义序列化器 ,现在序列化正常。

未定义序列化器 使用默认的序列化器的结果

定义了序列化器 后的结果

测试存入一个对象
@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testvoid testString() {redisTemplate.opsForValue().set("user",new User("luyuan", 18));User user = (User) redisTemplate.opsForValue().get("user");System.out.println("user == " + user);}

"@class": "com.lhd.demo.pojo.User" 这一段完全是多余的,如果数据量很大,那这个属性会占用很多额外空间,为了避免这个空间浪费,那我们可以做个优化!!!

优化 -- 手动序列化

使用 RedisTemplate 自带的 StringRedisTemplate

    @Autowiredprivate StringRedisTemplate stringRedisTemplate;// 这个是SpringMVC自带的序列化工具 也可以使用fastJson Gson 来序列化private static final ObjectMapper mapper = new ObjectMapper();@Testvoid testSaveUser() throws JsonProcessingException {// 创建user对象User user = new User("Marry", 22);// 手动序列化String json = mapper.writeValueAsString(user);// 写入数据stringRedisTemplate.opsForValue().set("user", json);// 获取数据String json1 = stringRedisTemplate.opsForValue().get("user");	// 手动反序列化User user1 = mapper.readValue(json1, User.class);System.out.println("User == " + user1) ;}	

测试结果

可视化端:

测试存入一个Hash

跟 Java 中的 map 有点像

    @Testvoid testHash(){stringRedisTemplate.opsForHash().put("user:1","name","lhd");stringRedisTemplate.opsForHash().put("user:1","age","11");Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:1");System.out.println("entries == " + entries);}

总结:

RedisTemplate 的两种序列化实践方案:

  • 方案一:
    • 自定义RedisTemplate
    • 修改 RedisTemplate 的序列化器为 GenericJackson2JsonRedisSerializer

优点:更加方便

缺点:占用额外内存

  • 方案二:
    • 使用 StringRedisTemplate
    • 写入 Redis 时,手动把对象序列化为JSON
    • 读取 Redis 时,手动把读取到的JSON反序列化为对象

优点:不占用额外空间,数据更加纯正

缺点:需要手动操作

总的来说根据需求使用合适的方式是最好的。

 干货满满的文章:

Redis (常用数据结构和命令)-CSDN博客

Redis Java客户端(带示例代码)-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • QT Creator下载安装详细教程(保姆级教程)
  • NCRE3 2-1 网络总体设计基本方法
  • 如何使用 API 查看极狐GitLab 镜像仓库中的镜像?
  • Flutter Geocoding插件使用指南:简化地理编码与逆地理编码
  • Redis与MySQL数据一致性问题的策略模式及解决方案
  • 如何从网站获取表格数据
  • 第四十八天 第十章 单调栈part01 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II
  • TypeScript通过MsgPack发送数组到C++反序列化失败
  • 前端播放rtsp视频流(最后使用WebRtc)
  • MySQL环境的配置文件json
  • Redis zset 共享对象
  • OpenSNN推文:百度沈抖:深度拥抱人工智能+,加速发展新质生产力,共创智能时代新未来
  • 故障诊断 | 基于Transformer故障诊断分类预测(Matlab)
  • Godot入门 03世界构建1.0版
  • 【.NET 6 实战--孢子记账--从单体到微服务】--开发环境设置
  • [译]如何构建服务器端web组件,为何要构建?
  • 【node学习】协程
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Babel配置的不完全指南
  • Bytom交易说明(账户管理模式)
  • CAP 一致性协议及应用解析
  • Druid 在有赞的实践
  • express.js的介绍及使用
  • interface和setter,getter
  • Java IO学习笔记一
  • Javascript编码规范
  • JavaScript实现分页效果
  • java第三方包学习之lombok
  • k8s如何管理Pod
  • KMP算法及优化
  • Koa2 之文件上传下载
  • Linux快速复制或删除大量小文件
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • mysql外键的使用
  • PAT A1120
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • vue-cli在webpack的配置文件探究
  • WePY 在小程序性能调优上做出的探究
  • 分享一份非常强势的Android面试题
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 开源SQL-on-Hadoop系统一览
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 如何使用 JavaScript 解析 URL
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 我从编程教室毕业
  • 我看到的前端
  •  一套莫尔斯电报听写、翻译系统
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 【干货分享】dos命令大全
  • ​TypeScript都不会用,也敢说会前端?
  • ​补​充​经​纬​恒​润​一​面​
  • # AI产品经理的自我修养:既懂用户,更懂技术!