redis队列list时效性过期解决方案
redis的list可以用作队列,效率高,好用,但是有个缺点就是队列的时效性只能统一设置,一个list一个,要过期只能批量过期,不能达到只过旧的数据,新数据保留的情况。
网上解决方法是换成sring,每个单个项目单独设置ttl,不用list ,批量用keys + * 正则表表达式过滤,可以批量pos数据出来达到队列效果,但是redis官网上描述有keys只能用作debug模式,性能上会产生比较大的影响。
另一种解决方案就是采用多个list,分时间片段做队列,取队列优先按照到期时间近的队列取,队列分别过期方式,大概实现方法如下
规则:
(1) 设置两个list --> parta , partb
(2) 时限分为 2个区域 【总ttl】 = 【可写入】 + 【不可写入等待期】
比如: ttl = 48小时 , 写入list队列规则为 0~24 小时可写, 24~48 小时队列不再写入,等到ttl到期销毁 , ttl=24+24
(3)两个 parta , partb 分别轮流时间写入
创建parta--->写入parta队列--->parta到了等待期 ---> 创建partb 写入 ---->写入partb队列--->partb到了等待期---->创建parta写入(此时前一个parta应该已经销毁)
代码:
long expire_a = redisUtil.getExpire(parta_list);long expire_b = redisUtil.getExpire(partb_list);//(24小时等待过期)long expire_out = 24;//两个分区时间间隔大小long expire = 24 * 2;if (expire_a > expire_out && expire_a>=expire_b-100) {//队列a还有剩余时间 ,且 a >= b (100秒作为误差)redisUtil.ListSet("parta", ob);//不设置ttl} else if (expire_b > expire_out && expire_a<=expire_b) {//队列b还有剩余时间 ,且 b >= aredisUtil.ListSet("partb", ob);//不设置ttl} else if ((expire_a < 0 && expire_b < 0) || (expire_a < 0 && expire_b <= expire_out)) { //队列a ,b 不存在,新建队列a//队列a(a可能-1,-2)没有剩余时间且<0, 队列b没有剩余时间(b可能>0,=0,=-1,=-2),新建队列aredisUtil.ListSet("parta", ob, expire);//设置ttl} else if (expire_a <= expire_out && expire_b < 0) {//队列a(a可能-2,-1,0,>0)没有有剩余时间 且 队列b(b可能-2,-1)没有剩余时间且<0,新建队列bredisUtil.ListSet("partb", ob, expire);//设置ttl}else{//此处属于意外情况,理论上不存在,比如 a和b 几乎相同(不可能)//或者 a|b消亡一瞬间的,由于物理原因延迟几秒,还存在0状况,或未被及时销毁不为-2 ,造成 a|b 两个不可写入时间重叠,两个都无法写入//谁剩余时间大,写谁,不设置ttlif (expire_a >= expire_b)redisUtil.ListSet("parta", ob);//不设置ttl;elseredisUtil.ListSet("partb", ob);//不设置ttl}
redis队列list时效性过期解决方案相关推荐
- php中redis设置队列过期时间,如何在php中使用redis队列操作
如何在php中使用redis队列操作 发布时间:2021-02-04 18:36:00 来源:亿速云 阅读:90 作者:Leah 这篇文章给大家介绍如何在php中使用redis队列操作,内容非常详细, ...
- Laravel/Lumen 使用 Redis队列
一.概述 在Web开发中,我们经常会遇到需要批量处理任务的场景,比如群发邮件.秒杀资格获取等,我们将这些耗时或者高并发的操作放到队列中异步执行可以有效缓解系统压力.提高系统响应速度和负载能力. 二.配 ...
- redis队列缓存 + mysql 批量入库 + php离线整合
需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框 ...
- 高性能分布式缓存redis(持久化原理 安全策略 过期删除内存淘汰策略 性能压测 高可用 Redis Cluster)
redis redis(持久化原理 安全策略 过期删除&内存淘汰策略 性能压测 高可用 Redis Cluster) 1. 持久化原理 1.1 持久化流程(落盘) 1.2 RDB详解 1.2. ...
- Redis队列实现Java版秒杀系统(无脚本、可用于生产)
本文系转载,原作者:控场的朴哥 原文地址:blog.csdn.net/weixin_43074462/article/details/103756536 写在前面 需求是做一个秒杀系统,比如大家来抢1 ...
- Thinkphp5中使用redis队列发送消息
文章目录 前言 一.php中怎么安装redis? 二.windows中安装redis 三.Thinkphp5中安装think-queue扩展 四.在项目中实际使用. 总结 前言 REmote DIct ...
- Redis 队列和MQ 对比
简介 为了保障基础服务的稳定,需要对MQ进行灾备,这个灾备主要是防患MQ突然不可能,基础服务依然可以调用其他队列来继续正常运行.第一想法是引入其他MQ中间件来做灾备,这样只需要实现一套生产者消费者就好 ...
- redis缓存穿透问题及解决方案代码实现
1.定义及解决方案 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库. 常见的解决方案有两种: 缓存空对象 优点:实现简单,维护方便 缺 ...
- Redis 队列实现Java版秒杀系统(无脚本、可用于生产)
写在前面 需求是做一个秒杀系统,比如大家来抢100台手机,先到先得. 查阅了网上很多用redis实现秒杀的demo(java语言),竟然没一个能用的!!! 有些是php的,没闲心研究了,现在说说为什么 ...
最新文章
- keras lastm循环神经网络训练验证测试
- 文巾解题 面试题 01.06. 字符串压缩
- 【⚠️阴沟里翻船,这题都做错了!⚠️】C语言宏定义
- C++设计模式--命令模式(Command)
- PAT (Basic Level) Practice (中文)1007 素数对猜想 (20 分)
- Dijkstra解决POJ 2263
- 71万买玛莎拉蒂,手续竟然全是假的:71万或打水漂
- mysql 数据库日志管理工具_mysql mysqlbinlog日志管理工具使用教程
- python画简便的图-python的pyecharts绘制各种图表详细(附代码)
- 暂停按钮_洗衣机在运转时可以按暂停吗
- git 远程仓库 remote 使用总结
- mysql replication(主从复制)(二)MSS模式
- Word中输入10以上带圈数字
- 各种编程语言的适用范围
- conda 解决An HTTP error occurred when trying to retrieve this URL.
- p2p打洞之nat分类
- 详图讲解U盘安装windows8系统
- 48V锂电池如何充电?48V锂电池如何初步充电?
- 深度学习和计算机视觉相关总结
- Linux下串口编程
热门文章
- linux 部署java的胡那就,心得之:linux下安装jdk tomcat oracle10g
- java适配器模式火鸡变凤凰是,结合案例深入解析适配器模式(一)
- 如何用AXURE制作QQ登录
- 理想汽车被“放弃”:高瓴资本、美银清仓,李想承认车辆存在缺陷
- 自学Java的十条建议(值得收藏)
- chatgpt帮助你完成五个工作,提高效率
- 路由器与静态路由配置命令(基础)
- c# 定位内存快速增长_C#和halcon的混编程序出现序内存泄露、句柄持续增加、视觉程序运行越来越慢等问题的处理...
- Linux命令——uname
- [译] 2019 前端性能优化年度总结 — 第三部分