Redis sortedset實現元素自動過時

Redis sortedset實現元素自動過時


這裏的自動過時,Redis並無提供相應的api,可是能夠使用一下方法來實現。html

需求背景java

給用戶返回的文章要求七日內不能重複;文章是存放在java list裏邊;(這一塊就是從db將文章拿出來,而後放入list,放入java內存中)。redis

分析api

一開始個人作法是這樣:

當用戶第一次訪問的時候,建立一個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。code

zadd userId score title 這裏的score爲當前時間的時間戳; 

ZREMRANGEBYSCORE key 0 score  
這裏的score設爲當前時間前7天對應的時間的時間戳;(具體時間戳能夠用java Calander類計算獲得)

這裏能夠啓動一個定時任務去定時調用這個命令便可

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

相關文章
相關標籤/搜索