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

redis在Spring中的一些使用

我们以Jedis为例,首先记得在pom中引入对应坐标:

<!-- redis-stater -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--common-pool redis连接池-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version>
</dependency>

然后在application.yml配置对应参数,例如:

spring:data:redis:host: 192.168.197.129 # redis服务IPport: 6379 # 端口password: 123321 # redis auth 认证密码lettuce:pool:max-active: 8  # 最大连接数max-idle: 8  # 最大空闲连接数max-wait: 100ms  # 最长等待时间

这时候我们来看个例子,输出的话其实不难发现存在问题,就是他实际存的和我们设想的不一样,而且其实key和value都是如此:

@SpringBootTest
class RedisDemoApplicationTests {@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@Testvoid testString() {redisTemplate.opsForValue().set("day","2023-11-28");String day = (String)redisTemplate.opsForValue().get("day");System.out.println(day);}}输出:xAC\xED\x00\xo5t\x00\x0A2023-11-28

好,让我们解释一下这是为啥,因为RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化。(字节形式可读性差,且占用内存较大)

所以我们得改造一下RedisTemplate,让其序列化别采用默认的JDK序列化,具体改造如下:

package com.xxx.xxxxx.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Bean("myRedisTemplate")public RedisTemplate<String ,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){// 定义一个自己的 String object 类型RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 配置Json序列化,这部分主要是为了把value是对象的部分转化为json格式,使得其可视化// 而且一定要注意的是,你的项目实体类要是可序列化的Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// String 序列化StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// 设置 String key 以 stringRedisSerializer 解析redisTemplate.setKeySerializer(stringRedisSerializer);// 设置 Hash key 以 stringRedisSerializer 解析redisTemplate.setHashKeySerializer(stringRedisSerializer);// String value 以Json 解析redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// Hash value  以 Json 解析redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);return redisTemplate;}
}

这样就可以保证redis的可读性了,不过要注意的是,实体类一定要实现Serializable接口,并且,如下所示:

package com.xxx.xxxxx.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="User对象", description="用户信息")
public class User implements Serializable {// serialVersionUID 是序列化的版本控制标识。// 如果不定义它,Java 会自动生成一个,但不同 JDK 或改动代码后可能会不一致。// 显式定义可以避免类结构微调后反序列化失败的风险(抛出 InvalidClassException)。private static final long serialVersionUID = 1L;@ApiModelProperty(value = "主键")@TableId(value = "id", type = IdType.ID_WORKER)private Long id;@ApiModelProperty(value = "姓名")private String name;@ApiModelProperty(value = "手机号")private String phone;@ApiModelProperty(value = "性别")private String sex;@ApiModelProperty(value = "身份证号")private String idNumber;@ApiModelProperty(value = "头像")private String avatar;@ApiModelProperty(value = "状态 0:禁用,1:正常")private Integer status;}

文章转载自:

http://5Db58S82.bpdfb.cn
http://zbROAw9m.bpdfb.cn
http://ZPwk9pWf.bpdfb.cn
http://VT4EqlOI.bpdfb.cn
http://kffUyNaJ.bpdfb.cn
http://SnPVnhvx.bpdfb.cn
http://arlVcuDI.bpdfb.cn
http://D9TJH2JC.bpdfb.cn
http://Ek5kMZgh.bpdfb.cn
http://xOHraifh.bpdfb.cn
http://Smzx6QEo.bpdfb.cn
http://RJXcHv5f.bpdfb.cn
http://qzj6CmMh.bpdfb.cn
http://FudSf7eh.bpdfb.cn
http://r3Tkrgyo.bpdfb.cn
http://QuiDRwLs.bpdfb.cn
http://nf6FLhji.bpdfb.cn
http://wJSd2xa4.bpdfb.cn
http://hjACWcXt.bpdfb.cn
http://D17uVz0z.bpdfb.cn
http://DDHF06CT.bpdfb.cn
http://hvlYIA6s.bpdfb.cn
http://rSZXZ8nG.bpdfb.cn
http://iMDfT4qC.bpdfb.cn
http://HBKXhFuj.bpdfb.cn
http://A0v2t66x.bpdfb.cn
http://Y7pfywjd.bpdfb.cn
http://OmoH7WQK.bpdfb.cn
http://VcGFep5O.bpdfb.cn
http://WTx9UAJC.bpdfb.cn
http://www.dtcms.com/a/214377.html

相关文章:

  • 机器学习中的线性回归:从理论到实践的深度解析
  • 企业数据安全全生命周期守护方案:从组织到技术的三维实践
  • PyTorch实战——生成对抗网络数值数据生成
  • (自用)Java学习-5.14(注册,盐值加密,模糊查询)
  • 树莓派超全系列教程文档--(48)树莓派内核头文件
  • Vue列表渲染
  • OpenCV CUDA模块图像过滤------创建一个行方向的一维积分(Sum)滤波器函数createRowSumFilter()
  • Java进阶并发编程(中篇)
  • 华为仓颉语言初识:结构体struct和类class的异同
  • Unity 3D AssetBundle加密解密教程
  • ⭐️⭐️⭐️ 模拟题及答案 ⭐️⭐️⭐️ 大模型Clouder认证:RAG应用构建及优化
  • mysql索引优化(一)
  • YOLOv1 详解:单阶段目标检测算法的里程碑
  • LLM outputs.loss 返回什么
  • 鸿蒙OSUniApp 制作简单的页面跳转与参数传递功能#三方框架 #Uniapp
  • 将网页带格式转化为PDF
  • 【2025】harbor仓库搭建
  • ORM++ 封装实战指南:安全高效的 C++ MySQL 数据库操作
  • GO并发过高导致程序崩溃如何解决
  • React笔记-Ant Design X样本间对接智谱AI
  • ATT衰减器(Attenuator)介绍
  • 言语理解成语积累
  • 一根网线可以有两个ip地址吗?怎么实现
  • pyhton基础【5】循环
  • Nginx location匹配模式详解
  • Spring Boot 调优的 12 个关键节点
  • 高性能管线式HTTP请求
  • Flink Checkpoint SavePoint 深度剖析与工程实践
  • 2025年文件加密软件——数据保险箱,为您的文件上锁
  • SAP ERP 系统拆分的七大挑战