首页 > 数据库 >监听redis过期的key

监听redis过期的key

时间:2023-10-22 15:25:36浏览次数:36  
标签:RedisMessageListenerContainer template redis public key import 监听 redisTemplate

    package com.ccxgf.configuration;


import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
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.*;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
* redis配置
*/
@Configuration
@RequiredArgsConstructor
public class RedisConfig {

private final RedisConnectionFactory factory;

@Bean
public RedisTemplate<String, Object> redisTemplate() {
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.setDefaultSerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}

/**
* 监听redis的过期事件
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}

@Bean
public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForHash();
}

@Bean
public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
return redisTemplate.opsForValue();
}

@Bean
public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForList();
}

@Bean
public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForSet();
}

@Bean
public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForZSet();
}


}
---------------------
设置监听器
@Component
@Slf4j
public class RedisKeyExpirationHandler extends KeyExpirationEventMessageListener {

@Autowired
private RedisService redisService;

public RedisKeyExpirationHandler(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}

@Override
public void onMessage(Message message, byte[] pattern) {
String expiredKey = message.toString(); // 获取过期的key
log.info("移除过期redis key:{}", expiredKey);
String id = expiredKey.substring(expiredKey.lastIndexOf(",")+1);
redisService.del(id);
}
}

---------------------------------------------------------------------------
具体安装redis步骤:
1、springboot程序添加依赖


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

 2、redis配置

@Configuration
public class RedisConfig {
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
return redisMessageListenerContainer;
}
}

 3、application.xml

spring:
redis:
host: 39.102.60.114
port: 6379
database: 0
password: password
timeout: 1000s

 4、配置类

@Slf4j
@Component
public class RedisKeyExpireListener extends KeyExpirationEventMessageListener {

public RedisKeyExpireListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}

@Override
public void onMessage(Message message, byte[] pattern) {
log.info("接受到消息:{},{}",message,new String(pattern));
}
}

 
 

标签:RedisMessageListenerContainer,template,redis,public,key,import,监听,redisTemplate
From: https://www.cnblogs.com/wlwtop/p/17780467.html

相关文章

  • Redis和Spring Boot:如何协作提高您的应用程序性能
    环境说明:Windows10+Idea2021.3.2+Jdk1.8+SpringBoot2.3.1.RELEASE前言Redis是一种高效的非关系型数据库,能够支持复杂的数据结构和操作。在SpringBoot应用中,集成Redis可以提供更好的性能和扩展性。本文将介绍如何在SpringBoot应用中集成Redis并使用其基本功能......
  • Spring Boot中的过滤器、拦截器、监听器技巧汇总:让你快速成为大神
    环境说明:Windows10+Idea2021.3.2+Jdk1.8+SpringBoot2.3.1.RELEASE前言在Web应用程序中,我们经常需要处理请求和响应。有时,我们需要应用于所有请求和响应的通用逻辑。这就是过滤器、拦截器和监听器的用武之地。它们可以帮助我们在请求和响应被处理之前或之后执行一些通用逻......
  • Redis的速度不够用?为什么你应该考虑使用 KeyDB,一个更快、更强大、更灵活的开源数据库
    https://www.cnblogs.com/anech/p/17776855.html KeyDB 一个由 Snap 提供支持、专为扩展而构建的开源数据库。它是 Redis 的高性能分支,专注于多线程、内存效率和高吞吐量。KeyDB 采用 MVCC 体系结构,允许您执行 KEYS 和 SCAN 等查询,而不会阻塞数据库并降低性能。Key......
  • Redis 命令操作
    一、连接命令ping通常用于测试与服务器的连接是否仍然生效,或者用于测量延迟值。如果连接正常就返回一个PONG,否则返回一个连接错误。127.0.0.1:6379>pingPONGechom打印一个特定的信息m,测试时使用。127.0.0.1:6379>echo'helloworld'"helloworld"selecti切换......
  • Redis 哨兵模式
    哨兵是一个分布式系统,你可以在一个架构中运行多个哨兵进程,这些进程使用流言协议来接收关于Master主服务器是否下线的信息,并使用投票协议来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。一、哨兵模式概述1.1、为什么要启动哨兵模式当我们的主服务器宕机后,要手动的......
  • Redis 集群
    sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数......
  • Redis服务器部署
    Redis(全称:RemoteDictionaryServer远程字典服务)是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Redis是一个开源的......
  • Redis 主从复制
    Redis有两种不同的持久化方式,Redis服务器通过持久化,把Redis内存中持久化到硬盘当中,当Redis宕机时,我们重启Redis服务器时,可以由RDB文件或AOF文件恢复内存中的数据。不过持久化后的数据仍然只在一台机器上,因此当硬件发生故障时,比如主板或CPU坏了,这时候无法重启服务器,有什么办法可以......
  • Redis 数据持久化
    Redis支持两种数据持久化方式:RDB方式和AOF方式。前者会根据配置的规则定时将内存中的数据持久化到硬盘上,后者则是在每次执行写命令之后将命令记录下来。两种持久化方式可以单独使用,但是通常会将两者结合使用。一、持久化1.1、什么是持久化持久化功能有效地避免因进程退出造成的......
  • Spring Boot中的过滤器、拦截器、监听器技巧汇总:让你快速成为大神
    环境说明:Windows10+Idea2021.3.2+Jdk1.8+SpringBoot2.3.1.RELEASE前言在Web应用程序中,我们经常需要处理请求和响应。有时,我们需要应用于所有请求和响应的通用逻辑。这就是过滤器、拦截器和监听器的用武之地。它们可以帮助我们在请求和响应被处理之前或之后执行一些通用逻......