Heim > Datenbank > Redis > Wie überwacht Redis abgelaufene Schlüssel?

Wie überwacht Redis abgelaufene Schlüssel?

silencement
Freigeben: 2019-06-06 15:15:29
Original
6627 Leute haben es durchsucht

Wie überwacht Redis abgelaufene Schlüssel?

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”意味着所有事件。
Nach dem Login kopieren

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
Nach dem Login kopieren

Öffnen Sie eine andere Redis-CLI und Senden Sie geplante abgelaufene Schlüssel

127.0.0.1:6379> setex test_key 3 test_value
Nach dem Login kopieren

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"
Nach dem Login kopieren

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>
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren

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,进行处理
        }
    }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage