redis在java日常操作中是必不可少的工具了,但其中也會有一些不容易避免的錯誤,所以一旦遇到,即在本帖記錄,大家有遇到其他問題,歡迎評論討論。
一、使用redis的Set數據結構,設置過期時間未生效
// 獲取reidsKey的Set結構redis操作類
String redisKey = "key";
BoundSetOperations bso = redisTemplate.boundSetOps(redisKey);
// 在操作該key之前,設置這個key的過期時間
bso.expire(20, TimeUnit.SECONDS);
// 初始化值
List<String> valueList = Arrays.asList("value1", "value2", "value3");
// 初始化key,設置key的過期時間后,往key中添加元素
bso.add(valueList .toArray());
現象:程序執行完成后,查看redis的過期時間,結果是-1---永不過期
結論:在操作redis時,在無key的情況下設置過期時間是無效的,必須得首先保證redis中存在key后,然后設置該key的過期時間才行。反之則無效
二、通過redisTemplate的multiGet方法進行key的批量查詢,即使沒有key,返回的List也不會為空。
測試代碼:
// 從緩存中批量獲取數據
List<String> queryKeys= Arrays.asList("key1", "key2", "key3");
List<Object> objectsInRedis = redisTemplate.opsForValue().multiGet(queryKeys);
log.debug("批量獲取redis中的數據,keys:{}, data:{}", queryKeys, objectsInRedis);
打印結果
2021-08-05 16:35:48.079 INFO 13248 --- [nio-1024-exec-2] com.feiGieGie.demo.controller.DemoController : 批量獲取redis中的數據,keys:[key1, key2, key3], data:[null, null, null]
現象:待查詢的queryKeys,實際在redis中不存在這些key,按理來說查出來的List中應該是空集合,亦或是List為null,但實際是List並不為null也不為空,而是無論待查詢的keys是否存在,返回的List中的元素個數就是key的個數,每個元素都是null。
結論:通過redisTemplate的multiGet方法進行key的批量查詢,結果返回的List都要對每個元素進行null值過濾。實際也不難理解,因為批量查詢的key,確實可能會存在部分key存在,部分key不存在,所以會將每個key的查詢結果放入List中,這樣返回的List便不可能為null或空集合。
