今天遇到了一個前同事挖的坑,刷新緩存中商品信息時先讓key過期,然后從數據庫里取最新數據然后再放到緩存中,他是這樣寫的
redisTemplate.expire(CacheConst.GOOGS_PREFIX,1,TimeUnit.MILLISECONDS);
設置key過期為一毫秒,導致緩存中有時沒有商品信息,因為在這一毫秒內有可能已經從數據庫中取到了最新數據,並且又放到了緩存中,一毫秒過后key過期了,緩存中就沒了商品信息。
正確的應該這樣寫redisTemplate.expire(CacheConst.GOOGS_PREFIX,-1,TimeUnit.MILLISECONDS)立馬讓key過期。
redis中對於有設置過期的key有三種處理方式
- 被動刪除:這個key下一次被訪問到的時候才會刪除。
- 主動刪除:Redis會定期主動淘汰一批已過期的key
- 當前已用內存超過maxmemory限定時,觸發主動清理策略
直接刪除大key是有風險的,key過大,直接刪除時會導致Redis阻塞,不同類型的大key有不同的刪除方式,
Large Hash Key 可使用hscan命令,每次獲取500個字段,再用hdel命令,每次刪除1個字段。
Large Set Key 可使用sscan命令,每次掃描集合中500個元素,再用srem命令每次刪除一個鍵。
Large List Key可通過ltrim命令每次刪除少量元素
Large Sorted Set Key使用sortedset自帶的zremrangebyrank命令,每次刪除top 100個元素