Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1098|回复: 0
打印 上一主题 下一主题

redis数据库队列(list),集合(set)元素设置类似过期(expire)功能

[复制链接]

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
跳转到指定楼层
楼主
发表于 2020-4-22 10:00:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
**(2018-07-23更新:
本案例使用的解决方案以及代码,在较大数据量的操作情境下存在严重redis性能问题——大集合的一次性删除操作可能导致redis阻塞,正常业务将无法访问、操作redis。如果需要使用相关功能,请使用资料中的1方法或自行优化redis删除队列操作的执行时间)**

问题:

项目需要为每个用户维护一个列表,存放一些数据。列表中的值有过期时间,过期的值查询可以找到也可以找不到,还会有一个验证,所以无所谓。但是redis队列只有一个整体的过期功能,没有每个元素的单独过期功能,所以如果用户一直不停向队列塞东西,队列就会变的越来越大。这显然不合理。

资料:

https://stackoverflow.com/questi ... -child-key-in-redis

https://quickleft.com/blog/how-t ... ist-items-in-redis/

查了一下资料,目前给队列、集合元素单独设置过期不可能做到(redis4.0.2)。但是有其他方法可以做到类似功能。

参考的一篇文章提出两种方法:

1.使用SortedSet,使用score参数代表unix时间,程序定期使用ZRANGEBYSCORE清除过期项

2.将集合拆分成多个按时间排序、自动过期的小集合

1方法显然更方便、高效,但是项目必须跑程序为每个集合定期维护,可能产生很多不必要的麻烦,所以我选择2解决方法。

解决方案:

(重要的话说三遍:这个解决方案中过期的值有可能被返回,过期的值有可能被返回,过期的值有可能被返回。如果需要返回确定不过期的值,请在value中加unix时间作验证)

使用一个工具类封装redis操作,自动进行redis集合的拆分和查询。直接上代码:

必须获得redis读、写、设置过期、查询key是否存在 函数

expire表示过期时间(秒); blockSize表示分块大小(秒),不能大于expire
————————————————
版权声明:本文为CSDN博主「尤里安龙卷风」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leean950806/java/article/details/78669070

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-6 00:55 , Processed in 0.055930 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表