SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
SpringDataRedis的使用步骤:
1、引入spring-boot-starter-data-redis依赖
2、在application.yml配置Redis信息
3、注入RedisTemplate
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
dependency>
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
@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);
}
}
在控制台能够看见正常的key和value,但是我们通过redis客户端查看时发现结果是这样的。
RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化;
缺点:
查看源码RedisTemplate可以发现默认是采用JDK序列化;
通过debug观察redisTemplate.opsForValue().set(“name”,“李四”);怎样将name进行jdk序列化的
我们希望在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
**/
@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
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
dependency>
@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,会带来额外的内存开销。
那为了节约内存,我们在处理Value
时不使用GenericJackson2JsonRedisSerializer序列化器
,使用RedisSerializer.string序列化器
。这样一下,我们只需要在存入数据时,手动的把JAVA对象转变为JSON格式字符串,然后取数据时,再把JSON转回JAVA对象就好了。
而StringRedisTemplate它的key和Value默认就是String方式,我们不用自己再去定义RedisTemplate的配置类。
使用StringRedisTemplate详细案例,里面包含了生产项目中使用的工具类
StringRedisTemplate详细案例
源码地址
案例来源
黑马程序员Redis入门到实战教程,深度透析redis底层原理
下一篇:springBoot整合redis使用介绍