接手一个商城项目,因第三方支付接口返回结果偶尔有延迟,造成用户重复支付,支付后显示未支付,支付后编辑丢失订单等情况,所以需要对成功支付的订单进行锁定,5分钟后判断是否支付成功,实现如下:
1.开启redis监听(该功能需 Redis 版本大于 2.8)
修改redis.conf中的notify-keyspace-events 为Ex
(这一步开启redis监听,但是我没有改也生效了,可能是之前人员部署的时候已经开启了)
notify-keyspace-events 的参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知:
字符 | 发送的通知 |
---|---|
K | 键空间通知,所有通知以__keyspace@__ 为前缀 |
E | 键事件通知,所有通知以 keyevent@ 为前缀 |
g | DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知 |
$ | 字符串命令的通知 |
I | 列表命令的通知 |
s | 集合命令的通知 |
h | 哈希命令的通知 |
z | 有序集合命令的通知 |
x | 过期事件,每当有过期键被删除时发送 |
e | 驱逐事件,每当有键因为maxmemory政策而被删除时发送 |
A | 参数 g$lshzxe 的别名 |
输入的参数中至少要有一个K或者E,否则其余参数不会有任何的通知生效。
如果想订阅所有的通知,直接设置为AKE。
2.将RedisMessageListenerContainer注册成为spring的bean(MessageListener也是可以的)
package com.rayeye.insurance.commons.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.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* redis配置类
* @author gitonline
*
*/
@Configuration
public class RedisConfiguration {
/**
* springboot2.x 使用LettuceConnectionFactory 代替 RedisConnectionFactory
* application.yml配置基本信息后,springboot2.x RedisAutoConfiguration能够自动装配
* LettuceConnectionFactory 和 RedisConnectionFactory 及其 RedisTemplate
*
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setKeySerializer