RedisTemplate放入对象的时候,对象应该序列化。取出对象的时候,也会自动进行反序列化
/
/
/
/
一、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
二、编写配置文件
我们启动springboot后,会自动给我们创建RedisTemplate和StringRedisTemplate,我们可以直接在工厂中使用他们。
三、编写代码
1、对stringRedisTemplate的测试
package com.study;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import java.util.*;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class SpringbootRedisApplicationTests {
//注入StringRedisTemplate
@Autowired
private StringRedisTemplate stringRedisTemplate; //key 和 value都是字符串
//操作redis中的key
@Test
public void testKey(){
/*
注意api与我们终端写的不一样,并且操作key不用在stringRedisTemplate后写opsForKey
*/
stringRedisTemplate.delete("name");//删除一个key
Boolean name = stringRedisTemplate.hasKey("name");//判断一个key是否存在
System.out.println(name);
stringRedisTemplate.type("name");//判断key所对应的类型
stringRedisTemplate.keys("*");//获取所有的key
Long name1 = stringRedisTemplate.getExpire("name");//获取key的超时时间 -1 永不超时 -2 key不存在
System.out.println(name1);
stringRedisTemplate.rename("age", "age1");//修改key的名字 要求key必须存在 不存在会报错
stringRedisTemplate.renameIfAbsent("age", "age1");//如果key存在才修改名字,否则不修改
stringRedisTemplate.move("name", 1);//移动key到指定库
}
//操作redis中字符串 opsForValue实际操作就是redis中的String类型
@Test
public void testString(){
stringRedisTemplate.opsForValue().set("name", "小陈");//set用来设置一个key value
String name = stringRedisTemplate.opsForValue().get("name");//用来获取一个key对应的value
System.out.println(name);
stringRedisTemplate.opsForValue().set("code", "2357", 120, TimeUnit.SECONDS);//设置一个key的超时时间(我们短信验证码的超时时间就是用这个做的)
stringRedisTemplate.opsForValue().append("name", "他是一个好人");//给key的value追加内容
}
//操作list stringRedisTemplate.opsForList()
@Test
public void testList(){
// stringRedisTemplate.opsForList().leftPush("names", "xiaochen");//创建列表,放入一个元素
// stringRedisTemplate.opsForList().leftPushAll("names", "xiaowang", "xiaoming", "xiaohei");//放入多个元素
// List<String> names = new ArrayList<>();
// names.add("aaa");
// names.add("bbb");
// stringRedisTemplate.opsForList().leftPushAll("names", names);//创建一个列表,放入多个元素
List<String> names = stringRedisTemplate.opsForList().range("names", 0, -1);//循环遍历
for (String name : names) {
System.out.println(name);
}
stringRedisTemplate.opsForList().trim("names", 1, 3);
}
//操作set stringRedisTemplate.opsForSet()
@Test
public void testSet(){
stringRedisTemplate.opsForSet().add("sets", "zhangsan", "lisi", "wangwu");//创建set,并放入多个元素
Set<String> sets = stringRedisTemplate.opsForSet().members("sets");
for (String name : sets) {
System.out.println(name);
}
Long sets1 = stringRedisTemplate.opsForSet().size("sets");
System.out.println(sets1);
}
//操作hash stringRedisTemplate.opsForHash()
@Test
public void tetstHash(){
stringRedisTemplate.opsForHash().put("maps", "name", "zhangsan");//创建一个hash类型
Map<String, String> map = new HashMap<>();
map.put("age", "12");
map.put("bir", "2012-12-12");
stringRedisTemplate.opsForHash().putAll("maps", map);
stringRedisTemplate.opsForHash().get("maps", "name");//获取hash中某个key的值
stringRedisTemplate.opsForHash().values("maps");//获取所有key的值
stringRedisTemplate.opsForHash().keys("maps");//获取所有keys
stringRedisTemplate.opsForHash().multiGet("maps", Arrays.asList("name", "age"));//获取多个key的value
}
//操作zset stringRedisTemplate.opsForZSet()
@Test
public void testZset(){
stringRedisTemplate.opsForZSet().add("zsets", "zhangsan", 100);//创建并放入元素
stringRedisTemplate.opsForZSet().add("zsets", "lisi", 90);//创建并放入元素
stringRedisTemplate.opsForZSet().add("zsets", "wangwu", 80);//创建并放入元素
// Set<String> zsets = stringRedisTemplate.opsForZSet().range("zsets", 0, -1);//获取所有元素
// for (String zset : zsets) {
// System.out.println(zset);
// }
//获取指定分数范围的值
Set<ZSetOperations.TypedTuple<String>> zsets = stringRedisTemplate.opsForZSet().rangeByScoreWithScores("zsets", 0, 100);
for (ZSetOperations.TypedTuple<String> zset : zsets) {
System.out.println(zset.getValue() + "::" + zset.getScore());
}
}
}
2、对RedisTemplate的测试
通过redisTemplate存入redis中的key和value都是经过序列化后的对象,如果我们存入的对象的实体类没有实现序列化接口,那么就会报错,如下
当我们实现序列化接口后,就可以正常存储。
圈中就是序列化的标记,并且我们不能通过redis客户端取,因为redis客户端不能实现序列化。
/
/
/
/
/
/
/
/
存储时不对key进行序列化
/
/
/
/
/
/
/
对于hash类型也要特殊处理