一:安装Redis
1. 新建挂载目录
mkdir -p /docker/redis-6379//data
mkdir -p /docker/redis-6379//conf
2. 在新建conf目录下增加配置文件 redis.conf,内容如下
允许远程连接
protected-mode no
# 持久化
appendonly yes
# 密码
requirepass 123456
# 开启事件通知
notify-keyspace-events Ex
3. 创建redis容器并启动
docker run --name redis-63791 -p 6379:6379 -v /docker/redis-6379/data:/data -v /docker/redis-6379/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf
释义如下:
–name:给容器起一个名
-p:端口映射 宿主机:容器
-v:挂载自定义配置 自定义配置:容器内部配置
-d:后台运行
redis-server --appendonly yes: 在容器执行redis-server启动命令,并打开redis持久化配置
4. 启动成功,查看状态
通过docker ps查看启动状态,是否成功
二:代码整合
1.开启事件通知,上面安装过程已经配置
notify-keyspace-events Ex
2. 在SpringBoot项目的pom.xml中导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3. 在项目中新建Listener 并继承自 KeyExpirationEventMessageListener
@Component
@Slf4j
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
@Autowired
private OrderService orderService;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
// 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
String expiredKey = message.toString();
log.info("------------------redis key 失效; key = " + expiredKey);
if (expiredKey.startsWith(GlobalConstant.RedisPrefixKey.ORDER_PREFIX)) {
// 获取订单orderNO
String orderNo = expiredKey.substring(expiredKey.lastIndexOf(":")+1);
// 将待支付的订单改为已取消(超时未支付)
orderService.orderPaidTimeout(orderNo);
}
}
}
4. 新建配置类 RedisListenerConfig
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}