实际在我们开发过程中,有一些业务场景需要能够在一段时间之后能自动变更数据状态,如优惠券,特价商品,购物车等,这个时候如果实现基于redis,就可以使用下面的方案。
一,在系统添加配置类
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.RedisMessageListenerContainer;
@Configuration
public class RedisExpirationConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
二,添加对应的业务实现监听器
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
import java.io.File;
/**
* redis 消息过期异步通知监听器
*
* */
@Component
public class RedisMessageListener extends KeyExpirationEventMessageListener {
private static Logger logger = LoggerFactory.getLogger(RedisMessageListener.class);
@Autowired
private RedisTemplate<String, String> redisTemplate;
public RedisMessageListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
logger.info("收到 redis 过期异步通知:{}", message.toString());
String redisKey = (String) redisTemplate.getValueSerializer().deserialize(message.getBody());
logger.info("redisKey : {}", redisKey);
//针对特定的key进行处理
if (redisKey.startsWith("rediskey")){
try {
//TODO
}catch (Exception exp){
logger.info("业务处理失败:" + exp.getMessage());
}
}
}
}
三,针对业务实现对应过期消息的处理
在TODO的标识上面,针对不同业务设置的redis key,分成多个业务处理。建议key的设置使用 XXX:XXX:XXX 这种模式 eg:saas:file:key:业务参数,效果如图所示:
上述方法若有错误问题,请给我留言一下。