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類型也要特殊處理