먼저 질문을 살펴보겠습니다.
주문이 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!