1、简介
Spring Boot Data Redis中提供了RedisTemplate
和StringRedisTemplate
,其中StringRedisTemplate是RedisTemplate的子类,两个方法基本一致,不同之处主要体现在操作的数据类型不同,RedisTemplate中的两个泛型都是Object,意味着存储的key和value都可以是一个对象,而StringRedisTemplate的两个泛型都是String,意味着StringRedisTemplate的key和value都只能是字符串。
注意:使用RedisTemplate默认是将对象序列化Redis中,所以放入的对象必须实现对象序列化接口
2、环境准备
2.1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2、配置application.properties
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=0
2.3、StringRedisTemplate
@SpringBootTest
class RedisApplicationTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void contextLoads() {
//操作redis中字符串 opsForValue实际操作就是redis中String类型
stringRedisTemplate.opsForValue().set("k1","asd");
}
//操作redis中key相关
@Test
public void testKey(){
// stringRedisTemplate.delete("k1"); 删除一个key
Boolean name = stringRedisTemplate.hasKey("name");//判断某个key是否存在
System.out.println(name);
DataType type = stringRedisTemplate.type("name");//判断key所对应值的类型
System.out.println(type);
Set<String> keys = stringRedisTemplate.keys("*");//获取redis中所有key
keys.forEach(s -> System.out.println(s));
Long expire = stringRedisTemplate.getExpire("name");//获取key的超时时间
System.out.println(expire);
//还有需要的常用命令具体参考: https://blog.youkuaiyun.com/qq_45632660/article/details/113827804
}
//操作redis中list类型 opsForList实际操作就是redis中的list类型
@Test
public void testList(){
Long push = stringRedisTemplate.opsForList().leftPush("name", "张安");//创建一个列表并放入一个元素
System.out.println(push);
}
//set相关操作 opsForSet
@Test
public void testSet(){
stringRedisTemplate.opsForSet().add("sets","xiaosan","xiaosi","xiaowu");
Set<String> sets = stringRedisTemplate.opsForSet().members("sets");
sets.forEach(value-> System.out.println(value));
}
//zset相关操作 opsForZSet
@Test
public void testZSet(){
stringRedisTemplate.opsForZSet().add("zsets","小黑",10);
Set<String> zsets = stringRedisTemplate.opsForZSet().range("zsets", 0, -1);
zsets.forEach(value-> System.out.println(value));
}
//hash相关操作 opsForHash
@Test
public void testHash(){
stringRedisTemplate.opsForHash().put("maps","name","小黑");
Object o = stringRedisTemplate.opsForHash().get("maps", "name");
System.out.println(o);
}
}
2.4、RedisTemplate
准备工作
- User实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private String id;
private String name;
private Integer age;
private Date date;
}
- 测试
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test(){
/*
redisTemplate对象中的key和value的序列化都是JdkSerializationRedisSerializer
key:String
value: Object
修改默认key序列化方案: key StringRedisSerializer
*/
/*
修改key序列化方案 String类型序列
修改了key那么下面的"user"就不会在经过序列化了
*/
redisTemplate.setKeySerializer(new StringRedisSerializer());
//修改hash key序列化方案
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.opsForValue().set("user",new User("1","张三",15,new Date()));//redis进行设置,对象需要经过序列化
System.out.println(redisTemplate.opsForValue().get("user"));
}
注意:
因为对象实现了序列化,所以我们设置的key和value都会以序列化的形式存储,如图示
这样对我们读取数据是非常不友好的,所以我们不能把key序列化,而是以普通字符串存储,所以我们使用
redisTemplate.setKeySerializer(new StringRedisSerializer());
不把key进行序列化,hash采用redisTemplate.setHashKeySerializer(new StringRedisSerializer());
。
命令参考
redis四大数据类型命令参考:https://blog.youkuaiyun.com/qq_45632660/article/details/113827804
3、项目开发中常用
@Autowired
private StringRedisTemplate stringRedisTemplate;
//Spring data为了方便我们对redis进行更友好的操作,因此提供了bound api简化操作
@Test
public void testBound(){
//我们对同一个key进行频繁的操作,可以通过bound绑定key简化开发
stringRedisTemplate.opsForValue().set("name","zhangsan");
stringRedisTemplate.opsForValue().append("name","你是一个好人");
stringRedisTemplate.opsForValue().get("name");
//对字符串类型key进行绑定 后续所有操作都是基于这个key操作
BoundValueOperations<String, String> nameValue = stringRedisTemplate.boundValueOps("name");
//省略了key,因为绑定了key下面所有的key都是name
nameValue.set("张三");
nameValue.append("你是一个好人");
//其它类型也是一样
}
4、总结
- 针对于日后处理key value都是String使用StringRedisTemplate
- 针对于日后处理的key value存在对象 使用RedisTemplate
- 针对于同一个key多次操作可以使用boundXXXOps() value List Set Hash Zset的api简化书写