您好,欢迎访问一九零五行业门户网

怎么用redis发布订阅方式实现简易的消息系统

i. 基本使用1. 配置我们使用 springboot 2.2.1.release来搭建项目环境,直接在pom.xml中添加 redis 依赖
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-redis</artifactid></dependency>
如果我们的 redis 是默认配置,则可以不额外添加任何配置;也可以直接在application.yml配置中,如下
spring: redis: host: 127.0.0.1 port: 6379 password:
2. 使用姿势redis 的发布/订阅,主要就是利用两个命令publish/subscribe; 在 springboot 中使用发布订阅模式比较简单,借助 redistemplate 可以很方便的实现
a. 消息发布@servicepublic class pubsubbean { @autowired private stringredistemplate redistemplate; public void publish(string key, string value) { redistemplate.execute(new rediscallback<object>() { @override public object doinredis(redisconnection redisconnection) throws dataaccessexception { redisconnection.publish(key.getbytes(), value.getbytes()); return null; } }); }}
b. 订阅消息消息订阅这里,需要注意我们借助org.springframework.data.redis.connection.messagelistener来实现消费逻辑
public void subscribe(messagelistener messagelistener, string key) { redistemplate.execute(new rediscallback<object>() { @override public object doinredis(redisconnection redisconnection) throws dataaccessexception { redisconnection.subscribe(messagelistener, key.getbytes()); return null; } });}
c. 测试 case写一个简单的测试 case,来验证一下上面的发布订阅,顺带理解一下这个messagelistener的使用姿势;我们创建一个简单的 web 工程,提供两个 rest 接口
@restcontroller@requestmapping(path = "rest")public class demorest { @autowired private pubsubbean pubsubbean; // 发布消息 @getmapping(path = "pub") public string pubtest(string key, string value) { pubsubbean.publish(key, value); return "over"; } // 新增消费者 @getmapping(path = "sub") public string subscribe(string key, string uuid) { pubsubbean.subscribe(new messagelistener() { @override public void onmessage(message message, byte[] bytes) { system.out.println(uuid + " ==> msg:" + message); } }, key); return "over"; }}
我们先创建了两个消费者,然后发送消息时,两个都收到;再新增一个消费者,发送消息时,三个都能收到
3. 使用说明与应用场景redis 的发布订阅,只适用于比较简单的场景,从上面的使用说明也能看出,它就是一个简单的发布订阅模型,支持 1 对 n,而且发送的消息,只有在线的消费者才能 get 到(至于不在线的,那就只能说遗憾了)而且对于 redis 而言,消息推出去之后就完事了,至于消费者能不能正常消费,那就不 care 了
划重点:
只有在线的消费者能接收到消息
对于消费者一个消息只能拿到一次
接下来的问题就来了,什么样的场景下可以使用 redis 的发布订阅呢?
基于内存的缓存失效
利用 reids + 内存做二级缓存,可以说是比较常见的方式了,借助基于内存的缓存,可以有效的提高系统的负载,但是问题也很明显,内存中缓存数据失效是个问题,特别是当一个应用部署多台服务器时,如果我希望同时失效所有服务器的某个内存缓存,使用 redis 的发布/订阅就是一个比较好的选择
springcloud config 配置刷新
使用 springcloud config 做配置中心的小伙伴可能会经常遇到这个问题,配置修改之后的动态刷新是个问题(当然官方是支持通过 mq 走 bus 总线来同步,也可以通过 spring boot admin 来强刷)
借助 redis 发布/订阅,实现配置动态刷新也是一个不错的备选方案(后面给出一个具体的实现 demo,如有兴趣请持续关注一灰灰 blog)
redis key 失效订阅
我们在使用 redis 做缓存时,通常会设置一个过期时间,redis 提供了一个过期的事件,当然默认是不开启的;我们也是可以通过 subscribe 来订阅缓存失效的事件
修改配置,开启 key 失效事件
notify-keyspace-events ex
重启 redis 之后,订阅失效事件即可
subscribe __keyevent@0__:expired
以上就是怎么用redis发布订阅方式实现简易的消息系统的详细内容。
其它类似信息

推荐信息