SpringBoot + Redis 实现键空间通知(keyspace notification)
2021-08-25 14:08
751 查看
前言
SpringBoot + Redis 可以用 Redis 的键空间通知机制实现类似延迟消息队列的功能 ,Redis2.8 后可以通过键空间通知接收那些以某种方式改变了Redis数据空间的事件通知,关于 Redis 键空间通知的配置 Redis-x64-3.2 键空间通知(keyspace notification) 之前有介绍,这里只是介绍 SpringBoot 中的同理实现。
环境
SpringBoot2.5.3 + Redis-x64-3.2.1
具体实现
- 启动 redis,配置文件 redis.windows.conf 中设置键空间通知事件为Ex
notify-keyspace-events Ex
- application.yml
redis: localhost: localhost port: 6379 database: 7 password: # 过期事件订阅,接收7号数据库中所有key的过期事件 listen-pattern: __keyevent@7__:expired
- Redis 事件广播配置类
import com.coisini.springbootlearn.core.listener.RedisMessageListener; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.listener.Topic; @Configuration public class RedisListenerConfiguration { @Value("${spring.redis.listen-pattern}") public String pattern; @Bean public RedisMessageListenerContainer listenerContainer(RedisConnectionFactory redisConnection) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(redisConnection); /** * Topic是消息发布(Pub)者和订阅(Sub)者之间的传输中介 */ Topic topic = new PatternTopic(this.pattern); container.addMessageListener(new RedisMessageListener(), topic); return container; } }
- Redis 事件广播监听器
import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; public class RedisMessageListener implements MessageListener { /** * Redis 事件监听回调 * @param message * @param pattern */ @Override public void onMessage(Message message, byte[] pattern) { byte[] body = message.getBody(); String expiredKey = new String(body); System.out.println("监听到已过期的key:" + expiredKey); /** * 监听到过期事件回调 * TODO: */ } }
- 测试接口
@RestController @RequestMapping("/redis") public class RedisController { @Autowired private StringRedisTemplate redisTemplate; @GetMapping(value = "/setExpiredVal") public String setExpiredVal(@RequestParam String name) { // 设置 20s 后过期 redisTemplate.opsForValue().set("name", name, 20, TimeUnit.SECONDS); return "setVal is ok"; } }
- 访问接口
- 20s后控制台输出如下:
- 接下来就可以去处理相应的业务了。
相关文章推荐
- springboot中使用redis实现异步消息通知
- springboot2.x整合redis实现缓存(附github链接)
- SpringBoot集成redis实现秒杀
- springboot+redis实现分布式session共享
- spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
- springboot+redis实现session共享
- spring boot 整合shiro和redis实现权限管理和登录功能
- 35. Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
- SpringBoot集成Redis实现缓存处理(Spring AOP技术)
- SpringBoot整合阿里云SMS短信服务 并实现发送短信验证码的功能 Redis Java 短信验证码
- springboot项目使用redis实现唯一登录
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- SpringBoot整合NoSql(一)——Redis本地连接实现Session共享
- SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]
- springboot整合redis和登入功能相关实现重要步骤
- spring boot + redis 实现session共享
- SpringBoot 整合redis实现缓存 记录@CachePut值为1
- Spring Boot系列(七)Spring Boot使用Redis实现session共享
- spring boot redis session关闭Key Space 通知