网站制作要用哪些软件,苏州网站制作的公司,电子商务网站建设实训论文,上海做网站比较好的公司有哪些两种方案#xff1a;
Redis 过期事件监听Redisson 内置的延时队列
Redis 过期事件监听这种方案存在很多问题#xff0c;建议使用 Redisson 内置的 DelayedQueue 方案。
Redis 过期事件监听实现延时任务原理
Redis 2.0 引入了发布订阅 (pub/sub) 功能。
在 pub/sub 模式下…两种方案
Redis 过期事件监听Redisson 内置的延时队列
Redis 过期事件监听这种方案存在很多问题建议使用 Redisson 内置的 DelayedQueue 方案。
Redis 过期事件监听实现延时任务原理
Redis 2.0 引入了发布订阅 (pub/sub) 功能。
在 pub/sub 模式下生产者需要指定消息发送到哪个 channel 中而消费者则订阅对应的 channel 以获取消息。
Redis 中有很多默认的 channel这些 channel 是由 Redis 本身向它们发送消息的而不是我们自己编写的代码。其中__keyevent0__:expired 就是一个默认的 channel负责监听 key 的过期事件。也就是说当一个 key 过期之后Redis 会发布一个 key 过期的事件到__keyeventdb__:expired这个 channel 中。
我们只需要监听这个 channel就可以拿到过期的 key 的消息进而实现了延时任务功能。
这个功能被 Redis 官方称为 keyspace notifications 作用是实时监控实时监控 Redis 键和值的变化。
Redis过期时间监听的缺陷
1.时效性差
过期事件消息在 Redis 服务器删除 key 时发布而不是在 key 过期之后直接发布。
常用过期数据删除策略
惰性删除只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好但是可能造成太多过期 key 没有被删除。定期删除每隔一段时间抽取一批 key 执行删除过期 key 操作。并且Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。
定期删除对内存更加友好惰性删除对 CPU 更加友好所以 Redis 采用的是 定期删除惰性/懒汉式删除 。
因此会存在设置了 key 的过期时间但到了指定时间 key 还未被删除进而没有发布过期事件的情况。
2.丢消息
与消息队列不同Redis 的 pub/sub 模式中的消息并不支持持久化。在 Redis 的 pub/sub 模式中发布者将消息发送给指定的频道订阅者监听相应的频道以接收消息。当没有订阅者时消息会被直接丢弃在 Redis 中不会存储该消息。
3.多服务实例下重复消费
Redis 的 pub/sub 模式目前只有广播模式这意味着当生产者向特定频道发布一条消息时所有订阅相关频道的消费者都能够收到该消息。
这个时候我们需要注意多个服务实例重复处理消息的问题这会增加代码开发量和维护难度。
Redisson延迟队列原理和优势
Redisson 是开源的 Java 语言 Redis 客户端提供很多开箱即用的功能比如多种分布式锁的实现、延时队列。可借助 Redisson 内置的延迟队列 RDelayedQueue 实现延时任务。
SortedSet 是有序集合其中的每个元素可设置分数代表该元素的权重。Redisson 利用这一特性将需要延迟执行的任务插入到 SortedSet 中并设置过期时间作为分数。
Redisson 使用 zrangebyscore 命令扫描 SortedSet 中过期的元素然后将这些过期元素从 SortedSet 中移除并将它们加入到就绪消息列表中。
就绪消息列表是一个阻塞队列有消息进入就会被监听到。避免对整个 SortedSet 进行轮询提高执行效率。
优势
减少丢消息的可能DelayedQueue 中的消息会被持久化即使 Redis 宕机了也只可能丢失一点消息影响不大。消息不存在重复消费问题每个客户端都是从同一个目标队列中获取任务的不存在重复消费的问题。
跟 Redisson 内置的延时队列相比消息队列可以通过保障消息消费的可靠性、控制消息生产者和消费者的数量等手段来实现更高的吞吐量和更强的可靠性实际项目中首选消息队列的延时消息这种方案。