Wir verwenden SpringBoot 2.2.1.RELEASE
, um die Projektumgebung direkt zu erstellen pom.xml hinzufügen2.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:
redis 的发布/订阅,主要就是利用两个命令publish/subscribe
; 在 SpringBoot 中使用发布订阅模式比较简单,借助 RedisTemplate 可以很方便的实现
@Service public 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; } }); } }
消息订阅这里,需要注意我们借助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; } }); }
写一个简单的测试 case,来验证一下上面的发布订阅,顺带理解一下这个MessageListener
@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"; } }
notify-keyspace-events Ex
subscribe __keyevent@0__:expired
Nachrichtenabonnement hier, bitte beachten Sie, dass wir org.springframework.data.redis.connection.MessageListener
verwenden, um die Verbrauchslogik zu implementieren
Schreiben Sie einen einfachen Testfall, um das obige Veröffentlichen und Abonnieren zu überprüfen und die Nutzungssituation dieses MessageListener
zu verstehen Projektieren und zwei weitere Schnittstellen bereitstellen#🎜 🎜#rrreee
Verbraucher können eine Nachricht nur einmal erhalten
Die nächste Frage lautet, unter welchen Umständen dies möglich ist Was ist mit dem Veröffentlichen und Abonnieren mit Redis?
Speicherbasierte Cache-UngültigmachungDie Verwendung von Reids + Speicher für sekundären Cache kann mit Hilfe von als relativ üblich angesehen werden Speicherbasierter Cache Der Cache kann die Systemlast effektiv erhöhen, aber das Problem ist auch, dass zwischengespeicherte Daten im Speicher ungültig werden, insbesondere wenn eine Anwendung auf mehreren Servern bereitgestellt wird Für alle Server gleichzeitig ist die Verwendung von Redis Publish/Subscribe eine bessere Wahl In einem Konfigurationscenter kann dieses Problem häufig auftreten. Die dynamische Aktualisierung nach einer Konfigurationsänderung ist ein Problem (natürlich besteht die offizielle Unterstützung darin, die Synchronisierung über den Bus über mq durchzuführen, und Sie können die Aktualisierung auch über den Spring-Boot-Administrator erzwingen)
# 🎜🎜#Mit Redis veröffentlichen/abonnieren, die Implementierung einer dynamischen Aktualisierung der Konfiguration ist ebenfalls eine gute Alternative (eine spezifische Implementierungsdemo wird später gegeben, wenn Sie interessiert sind, folgen Sie bitte weiterhin dem Yihuihui-Blog) # 🎜🎜#Redis-Schlüssel abgelaufenes Abonnement# 🎜🎜#Wenn wir Redis zum Caching verwenden, stellen wir normalerweise eine Ablaufzeit ein, die natürlich nicht standardmäßig aktiviert ist Abonnieren Sie auch die Cache-Ungültigmachung über das AbonnementereignisÄndern Sie die Konfiguration und aktivieren Sie das Schlüsselfehlerereignisrrreee
Nach dem Neustart von Redis abonnieren Sie das Fehlerereignisrrreee
Das obige ist der detaillierte Inhalt vonSo implementieren Sie mit der Redis-Publish-and-Subscribe-Methode ein einfaches Nachrichtensystem. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!