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

相关文章
相关标签/搜索