Schauen wir uns zunächst eine Frage an:
Wie gehe ich mit der automatischen Stornierung einer abgelaufenen Bestellung um, z. B. mit der automatischen Änderung des Bestellstatus, wenn die Bestellung nicht bezahlt wird? für 30 Minuten?
Lösung:
Sie können den automatischen Ablaufmechanismus des Redis verwenden. Geben Sie bei der Bestellung die Ablaufzeit ein. Überprüfen Sie die Bestellung Status nach 30 Minuten. Wenn die Zahlung nicht erfolgt, wird sie verarbeitet, der Schlüssel ist jedoch abgelaufen. Gibt es eine Benachrichtigung von Redis? Die Antwort ist ja.
Erinnerung zum Ablauf des Redis-Schlüssels aktivieren
Redis-bezogene Ereigniskonfiguration ändern. Suchen Sie die Redis-Konfigurationsdatei redis.conf und überprüfen Sie das Konfigurationselement „notify-keyspace-events“. Wenn nicht, fügen Sie „notify-keyspace-events Ex“ hinzu folgt:
K:keyspace事件,事件以__keyspace@<db>__为前缀进行发布; E:keyevent事件,事件以__keyevent@<db>__为前缀进行发布; g:一般性的,非特定类型的命令,比如del,expire,rename等; $:字符串特定命令; l:列表特定命令; s:集合特定命令; h:哈希特定命令; z:有序集合特定命令; x:过期事件,当某个键过期并删除时会产生该事件; e:驱逐事件,当某个键因maxmemore策略而被删除时,产生该事件; A:g$lshzxe的别名,因此”AKE”意味着所有事件。
Redis-Test:
Öffnen Sie eine Redis-CLI und überwachen Sie das Schlüsselablaufereignis von db0
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
Öffnen Sie eine andere Redis-CLI und Senden Sie geplante abgelaufene Schlüssel
127.0.0.1:6379> setex test_key 3 test_value
Beobachten Sie die vorherige Redis-CLI und Sie werden feststellen, dass Sie den abgelaufenen Schlüsseltest_key erhalten haben, aber Sie können den abgelaufenen Wert test_value nicht empfangen
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 1) "pmessage" 2) "__keyevent@0__:expired" 3) "__keyevent@0__:expired" 4) "test_key"
Verwenden Sie
in springboot Fügen Sie die Abhängigkeit
<!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
zum POM hinzu, um die Konfiguration RedisListenerConfig
import edu.zut.ding.listener.RedisExpiredListener;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;/** * @Author lsm * @Date 2018/10/27 20:56 */@Configurationpublic class RedisListenerConfig { @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory);// container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired")); return container; } }
zu definieren, um den Listener zu definieren und die KeyExpirationEventMessageListener-Schnittstelle zu implementieren dass diese Schnittstelle alle DB-Ablaufereignisse überwacht keyevent@*:expired"
import edu.zut.ding.constants.SystemConstant;import edu.zut.ding.enums.OrderState;import edu.zut.ding.service.OrderService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;import org.springframework.data.redis.listener.RedisMessageListenerContainer;import org.springframework.stereotype.Component;/** * 监听所有db的过期事件__keyevent@*__:expired" * @author lsm */@Componentpublic class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } /** * 针对redis数据失效事件,进行数据处理 * @param message * @param pattern */ @Override public void onMessage(Message message, byte[] pattern) { // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key String expiredKey = message.toString(); if(expiredKey.startsWith("Order:")){ //如果是Order:开头的key,进行处理 } } }
Oder öffnen Sie den Container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired")); Kommentar in RedisListenerConfig, Definieren Sie dann den Listener und überwachen Sie das Ereignis __keyevent@0__:expired, bei dem es sich um das Ablaufereignis db0 handelt. Die Definition dieses Ortes ist relativ flexibel. Sie können definieren, welche Ereignisse überwacht werden sollen.
Das obige ist der detaillierte Inhalt vonWie überwacht Redis abgelaufene Schlüssel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!