springboot+redis做事件过期通知业务
springboot+redis做事件过期通知
博主也是初次体验,不足之处多多指教
我的业务场景
系统管理员要给维护员分配巡查路口设施的工作,由于路口比较多,管理员不知道哪些路口已经被分配了,况且过了一个时间周期后,所有的路口要再次被巡查。
思路
我建立了一个表,里面是所有路口和是否已经分配的状态
利用redis的键过期事件来做这个业务。
- 管理员给维护员分配了路口的时候把那些路口状态修改为不可分配,然后把路口添加到redis,以intersection:开头+id作为key,value为"",设置上过期时间(这个过期时间就是那个时间周期)。
- 管理员查询路口时默认只查看可分配状态的路口。
- 利用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做事件过期通知业务的更多相关文章
- springboot redis 监听过期key值事件
redis 中的key值过期后,触发通知事件 1.创建springboot工程,创建监听类 maven配置 <dependencies> <dependency> <gr ...
- redis中key过期事件
刚到新公司一个月左右,有个新需求,想做定时任务,比如在用户注册时间的3天后推送用户一条消息. 从刚开始脑子里面闪现的数据库轮询,立马否定掉(浪费资源),再到linux系统的定时任务,但是当用户量过大时 ...
- Redis 的安装 使用 通知事件
Redis 的安装 使用 介绍: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string.list.set.zset(sorted ...
- Redis Key过期通知
概述 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件.如Redis数据库中键的过期事件也是通过订阅功能实现.本文主要基于Azure PaaS Red ...
- spring中订阅redis键值过期消息通知
1.首先启用redis通知功能(ubuntu下操作):编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知): notify-keyspace-events Ex 或者登陆 ...
- SpringBoot之Mybatis操作中使用Redis做缓存
上一博客学习了SpringBoot集成Redis,今天这篇博客学习下Mybatis操作中使用Redis做缓存.这里其实主要学习几个注解:@CachePut.@Cacheable.@CacheEvict ...
- spring-boot集成mybatis,用redis做缓存
网上有很多例子了,执行源码起码有3个,都是各种各样的小问题. 现在做了个小demo,实现spring-boot 用redis做缓存的实例,简单记录下思路,分享下源码. 缓存的实现,分担了数据库的压力, ...
- Redis 中的过期元素是如何被处理的?视频+图文版给你答案——面试突击 002 期
本文以面试问题「Redis 中的过期元素是如何被处理的?」为切入点,用视频加图文的方式和大家聊聊 Redis 过期元素被处理的相关知识点. 涉及的知识点 过期删除策略有哪些? 这些过期策略有哪些优缺点 ...
- 使用过redis做异步队列么,你是怎么用的?有什么缺点?
Redis设计主要是用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列. 它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列: 另外,做消息队列的其他特性例如FIF ...
随机推荐
- android屏幕适配的全攻略2--支持手机各种屏幕密度dpi
如何为不同密度的屏幕提供不同的资源和使用密度独立的单位. 1 使用密度无关像素 坚决杜绝在布局文件中使用绝对像素来定位和设置大小.因为不同的屏幕有不同的像素密度,所以使用像素来设置控件大小是有问题的, ...
- layer.open弹框中的表单数据无法获取
layer.open弹框中的表单数据无法获取 表单数据模板 layer.open() 页面效果: 当点击确定后,radio和textarea获取的值总是为空,解决办法: var setPriCustB ...
- Python 简明教程 --- 12,Python 字典
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 代码写的越急,程序跑得越慢. -- Roy Carlson 目录 Python 字典是另一种非常实用 ...
- 02 . Shell变量和逻辑判断及循环使用
Shell变量 系统变量 在命令行提示符直接执行 env.set 查看系统或环境变量.env 显示用户环境变量,set 显示 Shell预先定义好的变量以及用户变量.可以通过 export 导出成用户 ...
- 【FastDFS】FastDFS 分布式文件系统的安装与使用,看这一篇就够了!!
写在前面 有不少小伙伴在实际工作中,对于如何存储文件(图片.视频.音频等)没有一个很好的解决思路.都明白不能将文件存储在单台服务器的磁盘上,也知道需要将文件进行副本备份.如果自己手动写文件的副本机制, ...
- 查看笔记本SN序列号
https://www.pstips.net/getting-computer-serial-number.html $ComputerName = $env:COMPUTERNAME $serial ...
- abp + vue 模板新建页面
新建页面 创建按对应的模块和实体 新建的模块需要进行注册
- 一个ioc例子jdk和spring版本导致问题
今天橘子松在做一个简单例子的时候,出现bug让我久久找了半小时... 天啊 不会吧 错误如下: java.lang.NoSuchMethodError: org.springframework.a ...
- 跟着阿里学JavaDay07——Java基础语法(五)
我们后面的笔记我,打算直接用程序,加注释进行记录.日后若本人有疑问,可进行网络查询加以整理回复 package com.cionda.JavaDemo.dept; public class JavaD ...
- 使用原生js来控制、修改CSS伪元素的方法总汇, 例如:before和:after
在网页中,如果需要使用辅助性/装饰性的内容的时候,我们不应该直接写在HTML中,这样会影响真正的内容,这就需要使用伪元素了,这是由于css的纯粹语义化是没有意义的.在使用伪元素的时候,会发现js并不真 ...