延迟处理是一个非常常用的一个功能;

例如, 下单成功后,在30分钟内没有支付,自动取消订单;

延迟队列便是延迟处理中最常见的实现方式;

先一起看下JDK中延迟队列是如何实现的.

JUC的DelayQueue

在JDK中, 提供了一套延迟队列的实现, 是JUC包中DelayQueue类.

在使用时只需要让处理的元素对象实现Delayed接口, 就可以根据延迟时间实现延迟处理了.

DelayQueue队列内部是用优先队列实现的, 优先队列的实现原理可以参考小顶堆.

public class DelayQueue<E extends Delayed> extends AbstractQueue<E>implements BlockingQueue<E> {private final transient ReentrantLock lock = new ReentrantLock();private final PriorityQueue<E> q = new PriorityQueue<E>();
}

元素对象需要实现Delayed接口的两个方法

(1) compareTo()

元素自定义方法实现, 根据延时时间, 确定元素在队列中的位置; 元素剩余延时时间越小排列越靠前, 反之越靠后;

(2) getDelay()

元素自定义方法实现, 判断元素剩余延时时间;

public interface Delayed extends Comparable<Delayed> {long getDelay(TimeUnit unit);
}

弹出元素时, 会根据元素对象的剩余延时方法getDelay(), 判断元素是否应该被弹出; 后续逻辑可以根据业务需要继续轮询或休眠等待一段时间.

public E poll() {
E first = q.peek();if (first == null || first.getDelay(NANOSECONDS) > 0)return null;elsereturn q.poll();
}

虽然DelayQueue不能满足分布式要求, 但它却提供了一个很好的延迟处理框架, 可以根据不同的底层存储介质替换PriorityQueue实现.

例如, Redis中的Zset.

Redis Zset

在上述DelayQueue框架的基础上, 使用zset代替PriorityQueue存储, 并用延迟时间作为zset的score项, 很容易就能实现一个分布式的高性能延迟队列.

Redis过期事件监听

利用Redis的事件监听机制, 还有另外一种方式实现延迟处理.

Redis可以根据需要, 修改redis.conf配置, 实现对一些事件的监听, 其中就包括key过期事件.

redis.conf 配置

notify-keyspace-events Ex

这个事件监听是通过pubsub机制实现的, 所以业务代码中实现对事件的订阅, 就可以知道哪个key过期了.

PUBSUB 主题:

<db>是指redis的database

__keyevent@<db>__:expired

有了上述事件监听基础, 将延期事件对应key存入Redis, 并根据延迟时间设置key过期时间, 当key过期时, 便能触发监听事件, 完成延迟处理逻辑.

当然, 除了上述方式之外, 还可以使用定时任务轮询, 死信队列等等方式实现延迟处理

redis过期监听性能_基于Redis的延迟处理相关推荐

  1. 监听返回app_基于 Redis 消息队列实现 Laravel 事件监听及底层源码探究

    在 Laravel 中,除了使用 dispatch 辅助函数通过 Illuminate\Bus\Dispatcher 显式推送队列任务外,还可以通过事件监听的方式隐式进行队列任务推送,在这个场景下,事 ...

  2. redis分布式锁java代码_基于redis实现分布式锁

    " 在上一篇文章中介绍了动态配置定时任务,其中的原理跟spring 定时任务注解@Scheduled一样的,都是通过线程池和定义执行时间来控制.来思考一个问题,如果我们的定时任务在分布式微服 ...

  3. redis缓存原理与实现_基于Redis实现范围查询的IP库缓存设计方案

    点击上方"码农沉思录"  发现更多精彩我先说下结果.我现在还不敢放线上去测,这是本地测的数据,我4g内存的电脑本地开redis,一次都没写完过全部数据,都是写一半后不是redis挂 ...

  4. springboot集成redis,及过期监听

    redis配置 package cn.jianml.redis.config;import cn.jianml.redis.listener.RedisMessageListener; import ...

  5. redis依赖_请勿过度依赖 Redis 的过期监听

    阅读本文大概需要 5 分钟. 来自:http://juejin.im/post/6844904158227595271 Redis 过期监听场景 业务中有类似等待一定时间之后执行某种行为的需求 , 比 ...

  6. Springboot redis多数据源过期监听案例

    在上一篇Springboot redis多数据源案例中,我们实现了springboot下多数据源的案例. 本篇博客在此基础上,实现多数据源过期监听事件: 监听器配置类: package com.xin ...

  7. redis开启过期监听

    java项目中,场景:订单没有付款到期取消订单,使用的是redis过期监听来做的,做个笔记!首先使用该功能需要下载2.8.0及以上的版本,这一部分详细内容可以访问redis官网:http://redi ...

  8. redistemplate hash 过期时间_Redis过期监听——订单超时-取消

    最近在做电商项目,涉及支付超时处理的几种方式.[记录哈使用redis监听处理] 提交订单的时候,支付-超过了有效时间则支付状态自动更新为已取消. 欢迎交流 redis过期监听的实现: 1.修改redi ...

  9. Redis key过期监听

    RedisKey超时监听 Key过期会不会立即删除? 不会立即删除:由于Redis属于单线程,主服务不会第一时间删除Key.所有Key不会在第一时间被删除. 删除机制: (1)定期删除:Redis每一 ...

最新文章

  1. NPM酷库:dotenv,从文件加载环境变量
  2. Js的Url中传递中文参数乱码的解决
  3. POSIX 消息队列基础知识复习,以及相关例程
  4. mysql my.cnf key_buffer_size_优化mysql之key_buffer_size设置
  5. 非常精确的测试运行时间(比clock()更精确些)
  6. 不可不知的Oracle常用技巧
  7. Linux 用C/C++创建新文件并写入内容
  8. java excutorthread_JAVA 线程池ThreadPoolExcutor原理探究
  9. 在新项目中使用 Vue3 使用总结
  10. 机器手六维坐标怎么定义_机器人学——2.4-坐标系的旋转和运动增量
  11. python经典书 豆瓣_入门,,豆瓣高分推荐的Python书籍
  12. python typing optional_python类型检测最终指南--Typing模块的使用
  13. “亚马逊与开源彻底决裂”
  14. 2012年4月份第2周51Aspx源码发布详情
  15. Java/JDK下载安装与环境配置(Windows 10 超详细的图文版教程 )
  16. SLAM领域著名实验室及大牛、SLAM领域大佬(不定期更新)
  17. (待补充)【读书笔记】20190816《码农翻身》——刘欣
  18. 求不规则立方体表面积java_求立方体的体积、表面积(c++)
  19. 计算机毕业优秀作品展观后感,毕业设计作品展观后感
  20. matplotlib绘制3D图像

热门文章

  1. Android之项目中调用已有.so库
  2. Android之解决远程拍照不打开activity用其它方式获取surfaceView
  3. Android之封装支付宝支付
  4. linux系统中scanf函数,Linux下scanf宽度控制问题
  5. Hadoop完全分子式环境搭建—问题及解决办法
  6. 世界上最热的地方在哪里?原来火焰山不是第一...
  7. 他是绝世天才,却只开了半辈子的挂!死后惨遭封号200年,这就是和牛顿抬杠的下场.........
  8. 商业项目中最受欢迎的 7 种编程语言
  9. 有效处理 Java 异常三原则
  10. 秋招面试我去了拼多多,直接被问JVMGC底层原理和算法,我吊打面试官