Redis支持過期監聽,可以實現監聽過期數據,實現過程如下
1、pom依賴
<!-- Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
2、配置類
添加序列化及key過期事件監聽
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** @Author: best_liu* @Description:* @Date Create in 14:51 2023/12/11* @Modified By:*/
@Configuration
public class RedisListenerConfig {/*** 監聽key過期事件** @author ztt* @date 2023/10/24 15:01**/@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);return container;}/*** RedisTemplate序列化** @author ztt* @date 2023/10/24 15:00**/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setHashKeySerializer(stringRedisSerializer);Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}
}
3、配置監聽
設置超時監聽器:監聽Redis 中的訂單鍵是否已超時。如果超時,執行相應的處理邏輯。
import lombok.extern.slf4j.Slf4j;
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;/*** @Author: best_liu* @Description:* @Date Create in 14:53 2023/12/11* @Modified By:*/
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}/*** 針對redis數據失效事件,進行數據處理* @param message 失效的key*/@Overridepublic void onMessage(Message message, byte[] pattern) {log.info("過期redis數據:" + message.toString());try {String key = message.toString();//從失效key中篩選代表訂單失效的key// 超時處理邏輯log.info("訂單號為【" + key + "】超時未支付-*****");} catch (Exception e) {e.printStackTrace();log.error("【修改支付訂單過期狀態異常】:" + e.getMessage());}}
}
4、log輸出
5、優缺點
Spring Boot整合Redis監聽訂單超時主要的優缺點:
優點:
1)實時性:使用 Redis 來監聽訂單超時,可以實現實時性處理。當訂單超時時,處理操作可以立即觸發,而不需要定期輪詢數據庫或其他方式。
2)高性能:Redis 是一個內存數據庫,因此具有高性能。它能夠快速存儲和檢索數據,適合用于訂單超時處理。
3)可擴展性:Redis 支持分布式部署,因此您可以輕松擴展應用程序以處理更多訂單。您可以使用 Redis Sentinel 或 Redis Cluster 來實現高可用性和負載均衡。
4)減輕數據庫壓力:將訂單超時的檢查和處理從數據庫轉移到 Redis,可以減輕數據庫服務器的負載,因為不再需要頻繁地查詢數據庫。
5)簡化代碼:Redis 提供了內置的過期鍵和發布/訂閱功能,這些功能使訂單超時的處理邏輯更加簡單和可維護。
缺點:
1)單一點故障:如果 Redis 實例發生故障,可能導致訂單超時處理不可用。為了解決這個問題,您可以使用 Redis Sentinel 或 Redis Cluster 來提高可用性。
2)不適合持久性數據:Redis 是一個內存數據庫,不適合用于持久性數據存儲。如果訂單數據需要長期保留,您仍然需要在數據庫中保留訂單信息。
3)配置和維護:Redis 需要一些配置和維護工作,包括備份、監控、調整內存限制等。這可能需要額外的管理工作。
4)消息隊列的競爭條件:如果多個實例同時處理訂單超時,可能會引發競爭條件,需要在代碼中進行處理。
5)性能成本:雖然 Redis 具有高性能,但在大規模訂單處理時,可能需要更多的 Redis 實例和更強大的硬件,這可能帶來一些成本。
?