RedisTemplate
是什么
spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作。spring-data-redis封装了RedisTemplate对象来进行对Redis的各种操作,它支持所有的Redis原生的api。
为什么需要使用
最常用的场景:缓存,常常使用redis来存取缓存
如何使用
依赖
redis依赖
<!--Redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置
主要是application.properties里的reids配置,例如端口、地址、密码之类
使用示例
首先需要@Autowired注入RedisTemplate
@Configuration
public class RedisConfig {
@Autowired
private RedisTemplate redisTemplate;
}
API
//新增一个字符串类型的值,key是键,value是值。常用
set(K key, V value)
redisTemplate.opsForValue().set("stringValue","bbb");
//获取key键对应的值。常用
get(Object key)
redisTemplate.opsForValue().get("stringValue");
//在原有的值基础上新增字符串到末尾
append(K key, String value)
redisTemplate.opsForValue().append("stringValue","aaa");
//截取key键对应值得字符串,从开始下标位置开始到结束下标的位置(包含结束下标)的字符串
get(K key, long start, long end)
redisTemplate.opsForValue().get("stringValue",0,3);
//设置变量值的过期时间
set(K key, V value, long timeout, TimeUnit unit)
redisTemplate.opsForValue().set("timeOutValue","timeOut",5,TimeUnit.SECONDS);
//覆盖从指定位置开始的值
set(K key, V value, long offset)
redisTemplate.opsForValue().set("absentValue","dd",1);
//设置map集合到redis
multiSet(Map<? extends K,? extends V> map)
Map valueMap = new HashMap(){{//匿名内部内
put("valueMap1","map1");
put("valueMap2","map2");
put("valueMap3","map3");
}};
redisTemplate.opsForValue().multiSet(valueMap);
opsForValue()、opsForList、opsForHash区别
主要区别是操作value类型的区别
-
opsForValue比较常用
key:字符串,value:可以是任意对象Object(例如String、具体对象如自定义类Student等),一个key只能对应一个value。 -
opsForList
key:字符串,value:可以是任意对象Object(例如String、具体对象如自定义类Student等),一个key可以分别先后添加多个value。
redisTemplate.opsForList().rightPush("user_list","wangxinli");
redisTemplate.opsForList().rightPush("user_list","yanxiaotang");
//push时value传的是什么类型,range方法后接受的list<>中就传什么类型
List<String> lists = redisTemplate.opsForList().range("user_list",0,-1);
for(String str:lists){
System.out.println(str);
}
- opsForHash
put的参数有三个
//put的参数有三个,分别是key、hashKey、value
put(H key, HK hashKey, HV value)
比较适合存储对象,例如
redisTemplate.opsForHash().put("user","age",18);
redisTemplate.opsForHash().put("user","name","Lisa");
观察以上用法,和直接命令行 hset user age 18 无异,相当于是对象是user,age是属性,18是属性值
//设置过期时间,key,时间,单位(例如TimeUnit.SECONDS)
redisTemplate.expire(key, timeout, unit);
但是另外一种写法就是另一番景象了
RedisTemplate和StringRedisTemplate的区别
序列化方式不同
- StringRedisTemplate默认采用的是String的序列化策略(StringRedisSerializer),保存的key和value都是采用此策略序列化保存的。
public StringRedisTemplate() {
setKeySerializer(RedisSerializer.string());
setValueSerializer(RedisSerializer.string());
setHashKeySerializer(RedisSerializer.string());
setHashValueSerializer(RedisSerializer.string());
}
- RedisTemplate默认采用的是JDK的序列化策略(JdkSerializationRedisSerializer),保存的key和value都是采用此策略序列化保存的。 因此,StringRedisTemplate存储的值用RedisTemplate是get不到的 例如,存入(SringKey,StringValue)
- RedisTemplate存入的数据
- StringRedisTemplate存入的数据
也就是说,RedisTemplate存入的数据(key,value),如果用StringRedisTemplate.get(key)读是读不到,并且使用redis客户端查看也会乱码
附:spring-data-redis的特点
- 自动管理连接池,提供了一个高度封装的RedisTemplate类,把同一类型的操作封装成了operation接口.支持redis中的五种数据类型的操作.
- 针对数据的"序列化与反序列化"]提供了多种可以选择的策略(RedisSerializer)
- JdkSerializationRedisserializer:当需要存储java对象时使用.
- stringRedisSerializer:当需要存储string类型的字符串时使用.
- JacksonJsonRedisSerializer:将对象序列化成json的格式存储在redis中,需要jackson-json工具的支持(没用过)
实际使用建议
- 避免乱码key、野key
- 乱码key通常是序列化方式为非string序列化方式
- 野key通常是命名不规范
- 尽量避免大key、久key
- 大key: 值空间超过100K
- 久key: 永久或失效时间超过30天
1.统一序列化方式。
- 建议使用StringRedisTemplate,方便使用redis客户端直接查看。并且如果序列化方式不同,例如RedisTemplate存入的数据(key,value),如果用StringRedisTemplate.get(key)读是读不到 2.key命名规范
- redis毕竟是分布式中间件,多个中台可能使用同一个redis集群,key命名规范有利于定位来源。好的命名,有业务含义,能够溯源。命名示例:服务名+业务前缀,根据需要也可加其它信息,如订单号、用户号、手机号等。