# redisTemplate **Repository Path**: wl8888/redisTemplate ## Basic Information - **Project Name**: redisTemplate - **Description**: SpringDataRedis简介 SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,[官网地址](https://spring.io/projects/spring-data-redis) - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-05-17 - **Last Updated**: 2023-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README @[TOC](SpringDataRedis) # SpringDataRedis简介 SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,[官网地址](https://spring.io/projects/spring-data-redis) - 提供了对不同Redis客户端的整合(Lettuce和Jedis) - 提供了RedisTemplate统一API来操作Redis - 支持Redis的发布订阅模型 - 支持Redis哨兵和Redis集群 - 支持基于Lettuce的响应式编程 - 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化 - 支持基于Redis的JDKCollection实现 # RedisTemplate对Redis操作类型 SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中: ![在这里插入图片描述](https://img-blog.csdnimg.cn/106dc6258007411884dd6923279b6266.png) # SpringDataRedis快速入门 **SpringDataRedis的使用步骤:** > 1、引入spring-boot-starter-data-redis依赖 2、在application.yml配置Redis信息 3、注入RedisTemplate ## 1、引入spring-boot-starter-data-redis依赖 ```xml org.springframework.boot spring-boot-starter-data-redis org.apache.commons commons-pool2 ``` ## 2、在application.properties配置Redis信息 ```java server.port=8087 spring.redis.host=127.0.0.1 #Redis服务器连接端口 spring.redis.port=6379 #Redis服务器连接密码(默认为空) spring.redis.password=123456 #连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=8 #连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 #连接池中的最大空闲连接 spring.redis.pool.max-idle=8 #连接池中的最小空闲连接 spring.redis.pool.min-idle=0 #连接超时时间(毫秒) spring.redis.timeout=30000 ``` ## 3、注入RedisTemplate并测试 ```java @SpringBootTest class RedisTemplateApplicationTests { @Autowired private RedisTemplate redisTemplate; @Test void testString() { redisTemplate.opsForValue().set("name","李四"); Object name = redisTemplate.opsForValue().get("name"); System.out.println("name = " + name); } } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/31082b2678f54f7dbba92aef199c8b6a.png) # SpringDataRedis的序列化方式 ## 现象分析 在控制台能够看见正常的key和value,但是我们通过redis客户端查看时发现结果是这样的。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/98069040d6904f1297f98dcf37aa23c1.png) ==RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化;== **缺点:** - 可读性差 - 内存占用较大 查看源码RedisTemplate可以发现默认是采用JDK序列化; ![在这里插入图片描述](https://img-blog.csdnimg.cn/125d0ffe19d347b08eb0b1bedf41cf02.png) 通过debug观察redisTemplate.opsForValue().set("name","李四");怎样将name进行jdk序列化的 ![在这里插入图片描述](https://img-blog.csdnimg.cn/598203df9c8749d3a4bdb355e4246dd1.png) ## SpringDataRedis的序列化方式 我们希望在redis中存的,所见及所得,而不是进行jdk序列化之后的样子,所以我们需要改变序列化方式。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/21f82eae4b0b4eea8c9b1ef8c1f3bac9.png) StringRedisSerializer >如果key 或者hashkey都是字符串一般用它 GenericJackson2JsonRedisSerializer >value有可能是对象就用他,转json字符串的序列化方式 ```java @Configuration public class RedisConfig { /** * 描述信息: key和hashKey采用string序列化方式 alue和hashValue采用Json序列化方式 * * @date 2023/05/17 * @param redisConnectionFactory * @return org.springframework.data.redis.core.RedisTemplate **/ @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { //创建Template RedisTemplate redisTemplate = new RedisTemplate<>(); //设置连接工厂 redisTemplate.setConnectionFactory(redisConnectionFactory); //设置序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); //key和hashKey采用string序列化方式 redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setHashKeySerializer(RedisSerializer.string()); //value和hashValue采用Json序列化方式 redisTemplate.setValueSerializer(jsonRedisSerializer); redisTemplate.setHashValueSerializer(jsonRedisSerializer); return redisTemplate; } } ``` 平时开发中不用单独引入jackson依赖,springmvc自带jackson依赖;现在demo中没有引入mvc,需要手动添加一下jsckson ```xml com.fasterxml.jackson.core jackson-databind ``` 再次测试 ![在这里插入图片描述](https://img-blog.csdnimg.cn/32f8440e8a8c423c9d6cc7a4032811dd.png) ## redisTemplate保存对象测试 ```java @Test void testSaveUser() { redisTemplate.opsForValue().set("user:100",new User("小红",29)); User user = (User) redisTemplate.opsForValue().get("user:100"); System.out.println("user = " + user); } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/a94b7ff1e8654292843646bc2bde67e4.png) **分析** 尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图: ![在这里插入图片描述](https://img-blog.csdnimg.cn/33bbb3d673f547f38218c75237494908.png)为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。 # 实际开发中使用redis方式(重要) 为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/435f8ae0a8ad4efc945fa41c9d8429f9.png) 详细使用在以下博客中说明,里面包含了生产项目中使用的工具类 [springBoot整合redis使用介绍(详细案例)](https://blog.csdn.net/weixin_43811057/article/details/120382906)