一、pom文件添加
<!--redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
</dependency>
二、redis信息配置
spring:
redis:
host: reids的ip
port: 端口
password: 密码
database: 指定redis数据库 (0,1,2...)
三、config处理
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 30) //指定session失效时间 单位是s
public class monitorRedisSessionConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.port}")
private int port;
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisMessageListenerContainer MonitorredisListenerContainer() {
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
return redisMessageListenerContainer;
}
@Bean
public DmsRedisSessionListener keyExpiredListener() {
return new DmsRedisSessionListener(this.MonitorredisListenerContainer(),host,password,port);
}
}
四、监听类
@Slf4j
public class DmsRedisSessionListener extends KeyExpirationEventMessageListener {
private String host;
private String password;
private int port;
public DmsRedisSessionListener(RedisMessageListenerContainer listenerContainer, String host, String password, int port) {
super(listenerContainer);
this.host = host;
this.password = password;
this.port = port;
log.info("redis session 监听器已启动");
}
/**
* 针对redis数据失效时间,进行数据处理
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
//Map<Long, Long> cpIdConnIdMap = connectionNodeStatusManager.getCpIdConnIdMap();
//过期的key
String key = new String(message.getBody(),StandardCharsets.UTF_8);
//if(!StringUtil.isEmpty(key)) {
try {
getSessionInfo(key.replace("expires:", ""));
} catch (Exception e) {
e.printStackTrace();
}
//}
}
public void getSessionInfo(String key) throws Exception {
Jedis jedis = new Jedis(host,port);
jedis.auth(password);
String cpIdConnId = jedis.hget(key, "sessionAttr:redis1"); //可以通过具体的键获取需要的信息 redis1是set的指定的key
System.out.println("获取的信息为:"+cpIdConnId);
}
}
五 结果展示
-
1 通过接口访问设置session
setRediSsesion.jpg
-
2 session 失效结果输出
result.jpg
从结果中也可以看到redissession的失效进行监听
六、总结
通过以上操作,我们可以对redis中session失效进行监听。同时在获取需要的信息后可以做一下业务处理。
网友评论