>  기사  >  데이터 베이스  >  Redis는 만료된 키를 어떻게 모니터링합니까?

Redis는 만료된 키를 어떻게 모니터링합니까?

silencement
silencement원래의
2019-06-06 15:15:296581검색

Redis는 만료된 키를 어떻게 모니터링합니까?

먼저 질문을 살펴보겠습니다.

주문이 30분 동안 결제되지 않으면 주문 상태가 자동으로 변경되는 등 만료된 주문의 자동 취소를 처리하는 방법은 무엇입니까?

해결책:

주문할 때 주문 ID를 redis에 기록하세요. 만료 시간은 30분 후 주문 상태를 확인하세요. 지불되면 처리되지만 키가 만료되었습니다. Redis에 대한 알림이 있습니까? 대답은 '예'입니다.

redis 키 만료 알림 활성화

redis 관련 이벤트 구성을 수정합니다. redis 구성 파일 redis.conf를 찾아 "notify-keyspace-events"의 구성 항목을 확인하고, 값이 있으면 "notify-keyspace-events Ex"를 추가합니다. 관련 매개 변수는 다음과 같습니다. 다음:

K:keyspace事件,事件以__keyspace@<db>__为前缀进行发布;         
E:keyevent事件,事件以__keyevent@<db>__为前缀进行发布;         
g:一般性的,非特定类型的命令,比如del,expire,rename等;        
$:字符串特定命令;         
l:列表特定命令;         
s:集合特定命令;         
h:哈希特定命令;         
z:有序集合特定命令;         
x:过期事件,当某个键过期并删除时会产生该事件;         
e:驱逐事件,当某个键因maxmemore策略而被删除时,产生该事件;         
A:g$lshzxe的别名,因此”AKE”意味着所有事件。

redis 테스트:

redis-cli를 열고 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

다른 redis-cli를 열고 정기적으로 만료된 키 보내기

127.0.0.1:6379> setex test_key 3 test_value

이전 redis-cli를 관찰하고 만료된 keytest_key가 수신되었지만 만료된 값을 받을 수 없습니다. test_value

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"

springboot에서

pom을 사용하여 종속성을 추가하세요

<!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

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;
    }
}

리스너를 정의하고 KeyExpirationEventMessageListener 인터페이스를 구현하세요. 소스 코드를 확인하고 이 인터페이스가 모든 dbs의 만료를 모니터링하는지 확인하세요. 이벤트 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,进行处理
        }
    }
}

또는 컨테이너를 엽니다.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired")); RedisListenerConfig에 주석을 추가한 다음 리스너와 모니터 __keyevent@0__:expired 이벤트, 즉 db0 만료 이벤트를 정의하면 더 유연하며 직접 모니터링할 이벤트를 정의할 수 있습니다.

위 내용은 Redis는 만료된 키를 어떻게 모니터링합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.