http://kaito-kidd.com/2016/12/26/delay-queue-based-on-redis/背景在后端服务中,经常有这样一种场景,写数据库操作在异步队列中执行,且这个异步队列是多进程运行的,这时如果对同一资源进行写库操作,很有可能产生数据被覆盖等问题,于是就需要业务层在更新数据库之前进行加锁,这样保证在更改同一资源时,没有其他更新操作干涉,保证数据一致性。但如果在更新前
转载 2020-09-07 13:47:35
454阅读
# 基于Redis的Zset实现延迟队列 ## 引言 延迟队列是一种常见的应用场景,用于处理需要延时执行的任务。在分布式系统中,基于消息队列延迟队列是一种常见的实现方式。本文将介绍如何使用Redis的Zset数据结构来实现一个简单的延迟队列。 ## 整体流程 下面是实现延迟队列的整体流程: | 步骤 | 描述 | | ---- | ---- | | 1. 创建Zset | 创建一个Zset
原创 2024-01-19 03:56:04
73阅读
Redis除了做缓存,还能做什么分布式锁 : 可以基于 Redisson 来实现分布式锁。限流 :可以通过 Redis + Lua 脚本的方式来实现限流。消息队列Redis 自带的 list 数据结构可以作为一个简单的队列使用,Redis5.0 中增加的 Stream 类型的数据结构更加适合用来做消息队列。复杂业务场景 :通过 Redis 以及 Redis 扩展提供的数据结构,可以很方便地完成
延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢?一、背景先看看一下业务场景:1.会员过期前3天发送召回通知2.订单支付成功后,5分钟后检测下游环节是否都正常,比如用户购买会员后,各种会员状态是否都设置成功3.如何定期检查处于退款状态的订单是否已经退款成功?4.实现通知失败,1,3,5,7分钟重复通知,直到对方回复?通常解决以上问题,最简单直接的办法就是
转载 2024-07-31 16:23:31
71阅读
Redis 队列与 StreamRedis5.0 最大的新特性就是多出了一个数据结构 Stream,它是一个新的强大的支持多播的可持久化的消息队列,作者声明 Redis Stream 地借鉴了 Kafka 的设计。 Redis Stream 的结构如上图所示,每一个Stream都有一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容。消息是持久化的,Redis 重启后
转载 2023-07-17 16:20:26
243阅读
1点赞
分布式锁目标:解决并发的问题 分布式锁本质上就是在 Redis 里面占一个“坑”,当别的进程也要来占时,发现坑位被占了,就只好放弃或者稍后再试。 使用 setnx(set if not exists) 指令,来实现占坑, del 指令释放坑位redis 分布式锁演进直接加锁,释放锁。(存在的问题:释放异常了,造成锁一直存在,导致死锁)加锁,锁过期时间,释放锁。(存在的问题:加锁和锁过期时间之间失败
业务背景在平时的业务中我们可能会碰到这样的需求,用户A将任务分配给用户B,如果30天后用户B还没有处理这个任务,那么系统自动将这个任务转发给用户C,或者将任务退回给任务A。这里我们就可以使用延迟队列,我们写好转发方法或者退回方法,用户A分配任务时将时间记录放入延迟队列。当30天后用户B没有处理,我们获取从延迟队列里面获取这个记录,能获取得到,就执行转发方法或退回方法。如果30天内用户B处理了任务,
业务场景我们常会遇见这样的一些业务场景:在延迟的一段时间后执行某个任务:当用户报名了某项活动,在活动开始的前一天自动发送短信提醒用户。当用户下了订单,如果超过半小时还未支则将订单设置成取消状态,不再让用户进行支付。…方案设计1、最简单的做法是用定时任务扫描业务表,发现符合相关的条件,则执行相关的业务逻辑。但是这样做的缺点是: (1)、需要不断的去查询数据库,频繁的进行IO。比如:要将超过半小时还未
转载 2023-07-13 15:49:40
205阅读
1、延迟队列工厂 package cn.xs.qishi.micro.plan.common.queue; import cn.xs.ambi.bas.util.StringUtils; import cn.xs.ambi.mgt.redis.RedisManager; import lombok. ...
转载 2021-10-11 17:15:00
432阅读
2评论
# Redis延迟队列实现 ## 简介 延迟队列是一种常见的消息处理方式,它允许将消息延迟发送到指定的时间。Redis是一个流行的内存数据库,它提供了丰富的数据结构和功能,可以很方便地实现延迟队列。 本文将介绍如何使用Redis的有序集合(sorted set)和定时任务来实现一个简单的延迟队列。 ## 基本原理 Redis的有序集合(sorted set)是一种有序的字符串集合,每个元
原创 2023-08-15 13:44:22
147阅读
什么是延迟队列所谓的延迟队列就是,生产者的消息推送到队列中,消费者不会马上消费,而是到了设置的指定的时间才消费。可以采用Redis的zset来实现。将消息序列化成一个字符串作为zset的value。这个消息的到期处理时间作为score,然后用一个线程去轮询zset到期的任务处理,建议使用多线程,为了保障任务消费的可用性。不过多线程就要考虑并发抢任务。废话不多说直接上代码。  代码逻辑将任务放到队列
原创 2021-04-12 14:06:09
1176阅读
Redis实现简单延队列, 利用zset有序的数据结构, score设置为延时的时间戳. 实现思路:1、使用命令 [zrangebyscore keyName socreMin socreMax] 会返回已score排序由小到大的一个list2、list非空则使用[zrem keyName value]  删除第一个元素, 删除成功即代表消费成功, 可以解决多线程并发消费的问题
转载 2023-05-25 17:24:55
536阅读
实现Redis延时队列:使用sortedset(有序集合) ,拿时间戳作为 score ,消息内容作为key 调用 zadd 来生产消息,消费者用zrangebyscore 指令获取 N 秒之前的数据轮询进行处理。实现思路Java实现Redis延时队列,首先要了解何为延时队列,即可以将消息存储在队列中,并在指定的延时时间后再将消息出队。这种队列在很多场景下都非常有用,例如消息延时处理,延时确认(订
原创 精选 2024-03-23 15:13:42
745阅读
天一起学 Go大家好,本文来自 Go 爱好
转载 2022-11-14 13:14:35
2698阅读
在后端服务中,经常有这样一种场景,写数据库操作在异步队列中执行,且这个异步队列是多进程运行的,这时如果对同一资源进行写库操作,很有可能产生数据被覆盖等问题,于是就需要业务层在更新数据库之前进行加锁,这样保证在更改同一资源时,没有其他更新操作干涉,保证数据一致性。但如果在更新前对数据库更新加锁,那此时又来了新的更新数据库的请求,但这个更新操作不能丢弃掉,需要延迟执行,那这就需要添加到延迟队列中,延迟
Redisson实现延迟队列1.场景介绍假设有这样一个场景,我们有一个订单,或者工单等等。需要在超时30分钟后进行关闭。这个时候我们最先想到的应该是采用定时任务去进行轮训判断,但是呢,每个订单的创建时间是不一样的,这个时间怎么确定才好呢,5分钟。。1分钟。。执行一次吗。这样就会非常影响性能。且时间误差很大。基于以上业务需要我们想到了有以下解决方案。JDK延迟队列,但是数据都在内存中,重启后什么都没
原创 精选 5月前
303阅读
Redisson实现延迟队列1.场景介绍假设有这样一个场景,我们有一个订单,或者工单等等。需要在超时30分钟后进行关闭。这个时候我们最先想到的应该是采用定时任务去进行轮训判断,但是呢,每个订单的创建时间是不一样的,这个时间怎么确定才好呢,5分钟。。1分钟。。执行一次吗。这样就会非常影响性能。且时间误差很大。基于以上业务需要我们想到了有以下解决方案。JDK延迟队列,但是数据都在内存中,重启后什么都没
原创 3月前
259阅读
redis实现普通消息队列延迟消息队列1.redis实现普通消息队列1.1 实现原理1.2 pom.xml1.3 JedisUtils工具类1.4 消息类1.4 消息队列类1.5 消息入队测试1.5 消息出队测试2.redis实现延迟消息队列2.1 实现原理2.2 pom.xml2.2 JedisUtils工具类2.3 消息类2.4 延迟消息队列类2.5 消息入队测试2.6 消息出队测试 1.
转载 2023-09-23 09:09:24
126阅读
前序提到redis,更多的可能想到用作缓存的用途,其实redis也可以实现一些简单的消息队列用途,我们可以使用 list 数据结构实现队列。 list的几个命令lpush (left push)由队列的左边存放进去 rpush (right push)由队列的右边存放进去 lpop  (left pop)由队列的左边取出来rpop (right pop)由队列的右边取出来以上的四个命令,
Redisson实现延迟队列1.场景介绍假设有这样一个场景,我们有一个订单,或者工单等等。需要在超时30分钟后进行关闭。这个时候我们最先想到的应该是采用定时任务去进行轮训判断,但是呢,每个订单的创建时间是不一样的,这个时间怎么确定才好呢,5分钟。。1分钟。。执行一次吗。这样就会非常影响性能。且时间误差很大。基于以上业务需要我们想到了有以下解决方案。JDK延迟队列,但是数据都在内存中,重启后什么都没
原创 精选 2024-03-05 11:18:30
387阅读
  • 1
  • 2
  • 3
  • 4
  • 5