springboot+redis做事件过期通知

博主也是初次体验,不足之处多多指教

我的业务场景

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

思路

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

利用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__:expired
Reading 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 过期

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

上代码

添加依赖 不贴版本了

<!-- apache-commons -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

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监听器
*/
@Configuration
public 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
@Slf4j
public 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的键过期事件能做很多事,多多探索,多从网上查查资料!

最后----【多读书、多看报、少吃零食、多睡觉0.0】

springboot+redis做事件过期通知业务的更多相关文章

  1. springboot redis 监听过期key值事件

    redis 中的key值过期后,触发通知事件 1.创建springboot工程,创建监听类 maven配置 <dependencies> <dependency> <gr ...

  2. redis中key过期事件

    刚到新公司一个月左右,有个新需求,想做定时任务,比如在用户注册时间的3天后推送用户一条消息. 从刚开始脑子里面闪现的数据库轮询,立马否定掉(浪费资源),再到linux系统的定时任务,但是当用户量过大时 ...

  3. Redis 的安装 使用 通知事件

    Redis 的安装 使用 介绍: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string.list.set.zset(sorted ...

  4. Redis Key过期通知

    概述 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件.如Redis数据库中键的过期事件也是通过订阅功能实现.本文主要基于Azure PaaS Red ...

  5. spring中订阅redis键值过期消息通知

    1.首先启用redis通知功能(ubuntu下操作):编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知): notify-keyspace-events Ex 或者登陆 ...

  6. SpringBoot之Mybatis操作中使用Redis做缓存

    上一博客学习了SpringBoot集成Redis,今天这篇博客学习下Mybatis操作中使用Redis做缓存.这里其实主要学习几个注解:@CachePut.@Cacheable.@CacheEvict ...

  7. spring-boot集成mybatis,用redis做缓存

    网上有很多例子了,执行源码起码有3个,都是各种各样的小问题. 现在做了个小demo,实现spring-boot 用redis做缓存的实例,简单记录下思路,分享下源码. 缓存的实现,分担了数据库的压力, ...

  8. Redis 中的过期元素是如何被处理的?视频+图文版给你答案——面试突击 002 期

    本文以面试问题「Redis 中的过期元素是如何被处理的?」为切入点,用视频加图文的方式和大家聊聊 Redis 过期元素被处理的相关知识点. 涉及的知识点 过期删除策略有哪些? 这些过期策略有哪些优缺点 ...

  9. 使用过redis做异步队列么,你是怎么用的?有什么缺点?

    Redis设计主要是用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列. 它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列: 另外,做消息队列的其他特性例如FIF ...

随机推荐

  1. Python三大器之生成器

    Python三大器之生成器 生成器初识 什么是生成器 生成器本身属于迭代器.继承了迭代器的特性,惰性求值,占用内存空间极小. 为什么要有生成器 我们想使用迭代器本身惰性求值的特点创建出一个可以容纳百万 ...

  2. NFC芯片选型及基本电路框架

    RFID作为一项专业度较高的技术,在一些公司,可能还会专门招聘专业的RFID工程师.本篇阐述的涉及到的只是基本选型设计.电路框架,关于RFID天线调试.低功耗检卡调试等,后续再其他篇章会继续更新! N ...

  3. 如何运用Linux进行查看tomcat日志

    第一步:进入tomcat目录下的logs.cd home /tomcat/logs 第二步:运行并查看日志:tail -f catalina.out 第三步:想终止查看:ctrl +c退出 第四步:比 ...

  4. Java基础:变量、常量、作用域

    JAVA基础:变量.常量.作用域 变量:可以变化的量.Java是强类型语言,每个变量都必须声明类型. Java变量是程序中最基本的存储单元,要素包括变量名,类型和作用域. //类变量 static s ...

  5. DOM-BOM-EVENT(4)

    4.dom操作 createElement 创建一个元素 <button id="btn">点击</button> <ul id="ul1& ...

  6. cbitmap 获取RGB

    CBitMap的用法   MFC提供了位图处理的基础类CBitmap,可以完成位图(bmp图像)的创建.图像数据的获取等功能.虽然功能比较少,但是在对位图进行一些简单的处理时,CBitmap类还是可以 ...

  7. html里输入框和密码框的提示文字怎么弄

    HTML5 新增属性,浏览器版本低于IE8应该不支持 placeholder 属性 placeholder 属性规定用以描述输入字段预期值的提示(样本值或有关格式的简短描述). 该提示会在用户输入值之 ...

  8. IdentityServer4 4.x版本 配置Scope的正确姿势

    前言 IdentityServer4 是为ASP.NET Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证的框架 IdentityServer4官方文档:ht ...

  9. 带大家认识CSS层叠上下文/层叠等级的区别和意义

    什么是“层叠上下文” 层叠上下文(stacking context),是HTML中一个三维的概念.在CSS2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的X轴,Y轴以及表示层叠的Z轴.一般情 ...

  10. Scrapy模拟登录赶集网

    1.打开赶集网登录界面,先模拟登录并抓包,获得post请求的request参数 2. 我们只需构造出上面的参数传入formdata即可 参数分析: setcookie:为自动登录所传的值,不勾选时默认 ...