赞
踩
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
springboot提供了spring-boot-starter-data-redis,里面也已经封装了spring中redis的配置spring-data-redis。
http请求访问时,service层函数内部调用redisTemplate在Redis里设置一个注销key
代码例子如下:
@Autowired
private RedisTemplate redisTemplate;
public void deleteUser(String key, String value){
// 关键代码
redisTemplate.opsForValue().set(key, value);
// 设置七天注销时间
redisTemplate.expire(key, DEFAULT_DELETE_TIME, TimeUnit.SECONDS);
// 监听过期key,获取value使用
String tempKey = key + "_2";
redisTemplate.opsForValue().set(tempKey, value);
}
注意: redis里面设置了两个key,原因在于:key过期之后,在ResdisExpirationListener 的 onMessage函数中 无法拿到key对应的value,所以设置两个,key不同但是value一样。这个value是为了key到期之后触发想要的任务函数。
public void withdrawDeleteUser(String key) {
redisTemplate.delete(key);
// 删除临时key
redisTemplate.delete(key + "_2");
}
注意: redis里面设置的两个key都必须删除
@Component
public class RedisListenerConfig {
@Bean
@Primary
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory){
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
@Slf4j @Component @Transactional public class ResdisExpirationListener extends KeyExpirationEventMessageListener { @Autowired UserService userService; @Autowired private RedisTemplate redisTemplate; public ResdisExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } @Override public void onMessage(Message message, byte[] pattern){ String messageKey = message.toString(); // 业务实现 if(messageKey.contains(RedisKey.DELETE_USER)){ String userKey = redisTemplate.opsForValue().get(messageKey + "_2").toString(); Long userId = Long.parseLong(userKey); // 触发定时任务 userService.deleteUserProcess(userId); // 删除临时key redisTemplate.delete(messageKey + "_2"); } } }
好了,可以跑跑看了。
说明:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。