我的业务场景

系统管理员要给维护员分配巡查路口设施的工作,由于路口比较多,管理员不知道哪些路口已经被分配了,况且过了一个时间周期后,所有的路口要再次被巡查。

思路

我建立了一个表,里面是所有路口和是否已经分配的状态

利用redis的键过期事件来做这个业务。

  1. 管理员给维护员分配了路口的时候把那些路口状态修改为不可分配,然后把路口添加到redis,以intersection:开头+id作为key,value为"",设置上过期时间(这个过期时间就是那个时间周期)。
  2. 管理员查询路口时默认只查看可分配状态的路口。
  3. 利用redis的键过期事件通知得到key,再把路口id解析出来,然后修改该路口状态为可分配。

修改redis配置文件,以windows版本为例

notify-keyspace-events的值修改 Ex ,默认的可能是**notify-keyspace-events "" **,然后重启redis

测试

开一个redis客户端1

#redis目录下 注意__是由两个下划线组成的 127.0.0.1:6379> psubscribe __keyevent@0__:expiredReading messages... (press Ctrl-C to quit)1) "psubscribe"2) "__keyevent@0__:expired"3) (integer) 1

再开一个redis客户端2

127.0.0.1:6379> set a 111 ex 5

客户端1的结果

1) "pmessage"2) "__keyevent@0__:expired"3) "__keyevent@0__:expired"4) "a"

keyevent@0:expired解析

key 键

event 事件

@0 第0个数据库

expired 过期

不懂的可以多搜搜相关资料,我也是第一次弄! 坐标

上代码

添加依赖 不贴版本了

      org.apache.commonscommons-pool2      org.springframework.bootspring-boot-starter-data-redis      

redis配置 redis的database要和下面的Java代码里写的一样!!!!!!

spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    password: 123456    url: jdbc:mysql://localhost:3306/zhjtyw-dev?characterEncoding=UTF8&useSSL=false&serverTimezone=GMT%2B8    username: root  redis:    database: 0    host: 127.0.0.1    lettuce:      pool:        max-active: 8        max-idle: 8        max-wait: -1        min-idle: 0    port: 6379    password: 123456  cache:    type: redis

配置redis监听器

/** * @author: taoym * @date: 2020/7/23 9:34 * @desc: redis监听器 */@Configurationpublic class RedisListenerConfig {    @Bean    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {        RedisMessageListenerContainer container = new RedisMessageListenerContainer();        container.setConnectionFactory(connectionFactory);        return container;    }}

配置

/** * @author: taoym * @date: 2020/7/23 9:38 * @desc: 监听器 */@Component@Slf4jpublic class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {    @Autowired    private IntersectionPatrolStatusService intersectionPatrolStatusService;    // 配置监听哪个频道    private static final Topic KEYEVENT_EXPIRED_TOPIC = new PatternTopic("__keyevent@0__:expired");    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {        super(listenerContainer);    }    @Override    protected void doRegister(RedisMessageListenerContainer listenerContainer) {        // 频道可以是多,多个传list        listenerContainer.addMessageListener(this,KEYEVENT_EXPIRED_TOPIC);    }    /**     * @author: taoym     * @date: 2020/7/17 16:12     * @desc: redis失效事件     */    @Override    public void onMessage(Message message, byte[] pattern) {        // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key        String expiredKey = message.toString();        expiredKey = expiredKey.substring(1,expiredKey.length()-1);        if(expiredKey.startsWith("intersection"+ RegexConstant.COLON)){            String[] split = expiredKey.split(RegexConstant.COLON);            Integer id = Integer.valueOf(split[1]);            ReqUpdateIntersectionPatrolStatusDTO data = new ReqUpdateIntersectionPatrolStatusDTO();            data.setId(id);            data.setStatus(IntersectionPatrolStatusEnum.CAN_DISTRIBUTION.getCode());            int i = intersectionPatrolStatusService.updateIntersectionPatrolStatus(data);            log.info("巡查路口的周期已经过,可以开始下次巡查");        }    }}

结束语

利用redis的键过期事件能做很多事,多多探索,多从网上查查资料!

来源:https://www.tuicool.com/articles/jmMf2iA

windows事件id大全_技术转载 || springboot+redis做过期事件通知业务相关推荐

  1. Redis key过期事件监听实现 - 30分钟自动取消未支付订单

    目录 一.前言 二.实现方案分析 三.Redis key过期事件方案实现步骤 3.1 Redis 安装步骤详见 3.2 修改 Redis 配置 3.3 在获取支付链接视图中设置key过期事件 3.4 ...

  2. Springboot+redis 做实时在线人数统计

    Springboot+redis 做实时在线人数统计 介绍 实现 介绍 利用redis 有序集合实现. Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员. 不同的是 ...

  3. onpaste事件不生效_从实际开发中来看JavaScript事件循环的使用场景

    前言: 本文是介绍结合DOM事件流和JavaScript事件循环解决一个工作中的实际问题的过程,很多东西不只是面试的时候才会用得到 文中涉及到的代码demo地址:drag-and-eventloop ...

  4. 在没有任何数据时进行无效的读取尝试。_技术转载——JVM运行时内存是怎么分布的?...

    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/ ...

  5. springboot幂等性_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题

    前言: 在实际的开发项目中,一个对外暴露的接口往往会面临,瞬间大量的重复的请求提交,如果想过滤掉重复请求造成对业务的伤害,那就需要实现幂等! 我们来解释一下幂等的概念: 任意多次执行所产生的影响均与一 ...

  6. redistemplate使用_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题

    # 前言 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同.按照这个含义,最终的含义就是 对数据库的影响只能是一次性 ...

  7. python电子相册制作代码大全_用Python和Conky做个电子相册,美化你的Linux桌面

    现在手机的拍照功能日趋强大,每个人电脑上想必都至少有几十个G的照片吧.全打印出来实在是太费钱了.而闲置的旧电脑完全可以利用起来播放这些照片.下面就介绍利用Conky和Python实现随机播放相片的功能 ...

  8. springboot redis做缓存

    一.配置好redis,不做赘述,只需要连接成功就好,有复杂需求请自行搜索redis 缓存相关策略配置 二.springboot pom引入cache <!-- https://mvnreposi ...

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

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

最新文章

  1. python文件句柄_Python文件操作
  2. 那些在学习iOS开发前就应该知道的事(part 1)
  3. 推荐个Spring Boot实现的开源公众号管理系统,当学习案例也不错!
  4. 死链对网站优化排名有哪些不利作用?
  5. python监控进程状态_python监控进程脚本
  6. 八、马科维茨投资组合
  7. C#心得与经验(二)
  8. python3基础知识二
  9. 图片相册社区类型小程序模板
  10. [转载] 使用python 中的numpy创建数组
  11. sql语句分组mysql_MySQL GROUP BY 语句_sql语句group by_分组
  12. day-15 磁盘挂载 磁盘格式化
  13. html鼠标移动图片自动放大,当鼠标移动到图片上时跟随鼠标显示放大的图片效果...
  14. python爬取付费音乐包_Python 收费、高品质无损音乐下载【开源】
  15. ECharts学习--雷达图
  16. PS制作搞笑印章 - 仿真印章 - 水印滤色
  17. Ubuntu安装开发版pidgin支持lwqq插件
  18. php getimagesize 导致系统变慢
  19. poj 1125 Stockbroker(多源最短路径)
  20. GBase XDM初识

热门文章

  1. Python绘制匀加速运动质点的速度-时间图像与位移-时间图像
  2. 图论知识总结(简易)
  3. 帝国cms 留言板html,帝国CMS留言板加字段和验证码
  4. 力扣438.找到字符串中所有字母异位词(JavaScript)
  5. mysql 5.6.31 配置_MySQL5.6.31 winx64.zip 安装配置教程详解
  6. pycharm和mysql_数据库 mysql 和 pycharm交互
  7. u盘解密软件_企业都使用哪些数据防泄密软件
  8. nvarchar转换为int类型失败_2.2 C++强制类型转换 | 将3.3转换为整型输出
  9. controller接收json数据_这篇SpringBoot整合JSON的学习笔记,建议收藏起来,写的太细了
  10. C++之new和delete探究