SpringDataRedis
- SpringDataRedis简介
- RedisTemplate对Redis操作类型
- SpringDataRedis快速入门
- 1、引入spring-boot-starter-data-redis依赖
- 2、在application.properties配置Redis信息
- 3、注入RedisTemplate并测试
- SpringDataRedis的序列化方式
- 现象分析
- SpringDataRedis的序列化方式
- redisTemplate保存对象测试
- 实际开发中使用redis方式(重要)
- 项目源码
SpringDataRedis简介
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址
- 提供了对不同Redis客户端的整合(Lettuce和Jedis)
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的响应式编程
- 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于Redis的JDKCollection实现
RedisTemplate对Redis操作类型
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
SpringDataRedis快速入门
SpringDataRedis的使用步骤:
1、引入spring-boot-starter-data-redis依赖
2、在application.yml配置Redis信息
3、注入RedisTemplate
1、引入spring-boot-starter-data-redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--jedis或者redis底层都会基于commons库来实现连接池效果-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2、在application.properties配置Redis信息
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并测试
@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);
}
}
SpringDataRedis的序列化方式
现象分析
在控制台能够看见正常的key和value,但是我们通过redis客户端查看时发现结果是这样的。
RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化;
缺点:
- 可读性差
- 内存占用较大
查看源码RedisTemplate可以发现默认是采用JDK序列化;
通过debug观察redisTemplate.opsForValue().set(“name”,“李四”);怎样将name进行jdk序列化的
SpringDataRedis的序列化方式
我们希望在redis中存的,所见及所得,而不是进行jdk序列化之后的样子,所以我们需要改变序列化方式。
StringRedisSerializer
如果key 或者hashkey都是字符串一般用它
GenericJackson2JsonRedisSerializer
value有可能是对象就用他,转json字符串的序列化方式
@Configuration
public class RedisConfig {
/**
* 描述信息: key和hashKey采用string序列化方式 alue和hashValue采用Json序列化方式
*
* @date 2023/05/17
* @param redisConnectionFactory
* @return org.springframework.data.redis.core.RedisTemplate<java.lang.String,java.lang.Object>
**/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//创建Template
RedisTemplate<String, Object> 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
<!--json序列化依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
再次测试
redisTemplate保存对象测试
@Test
void testSaveUser() {
redisTemplate.opsForValue().set("user:100",new User("小红",29));
User user = (User) redisTemplate.opsForValue().get("user:100");
System.out.println("user = " + user);
}
分析
尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图:
为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
实际开发中使用redis方式(重要)
为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。
详细使用在以下博客中说明,里面包含了生产项目中使用的工具类
springBoot整合redis使用介绍(详细案例)
项目源码
源码地址