Redis sortedset實現元素自動過期

丶木葉發表於2017-07-25

Redis sortedset實現元素自動過期


這裡的自動過期,Redis並沒有提供相應的api,但是可以使用一下方法來實現。

需求背景

給使用者返回的文章要求七日內不能重複;文章是存放在java list裡邊;(這一塊就是從db將文章拿出來,然後放入list,放入java記憶體中)。

分析

一開始我的做法是這樣:

當使用者第一次訪問的時候,建立一個key值為userId的快取,value為title列表(文章標題,文章唯一標識),然後給這個key值設定過期時間。
但是這樣,到過期時,整個列表都會被清掉。原則上,只應該清除掉到達過期時間的元素,未過期的元素則應該保持。這種方法不能實現預期效果。

可實現方案:

使用redis有序集合==sorted Set== 以及對應的==ZREMRANGEBYLEX key min max==命令
移除有序集合中給定的字典區間的所有成員;

redis提供了響應的資料結構和api可以實現:

ZADD key score1 member1 [score2 member2]  
向有序集合新增一個或多個成員,或者更新已存在成員的分數

通過使用 ZREMRANGEBYSCORE key min max 命令刪除有序集合儲存在key的最小值和最大值(含)之間的分數的所有元素。 

通過定時去呼叫此命令,即可實現list元素自動過期;

對應相應的實現方案:
使用redis來儲存給每個使用者下發的文章,對應的key值為userId(使用者唯一標識),value為title列表加上相關聯的score。

zadd userId score title 這裡的score為當前時間的時間戳; 

ZREMRANGEBYSCORE key 0 score  
這裡的score設為當前時間前7天對應的時間的時間戳;(具體時間戳可以用java Calander類計算得到)

這裡可以啟動一個定時任務去定時呼叫這個命令即可

想要了解更多Redis 有序集合的資料。可參考以下資料:
Redis Zremrangebyscore 命令詳解
Redis 有序集合(sorted set)

相關文章