Redis实现订单自动过期功能的示例代码

用户下单后,规定XX分钟后自动设置为“已过期”,不能再发起支付。项目类似此类"过期"的需求,笔者提供一种使用Redis的解决思路,结合Redis的订阅、发布和键空间通知机制(Keyspace Notifications)进行实现。

Posted in Redis onMay 08, 2021

配置redis.confg

notify-keyspace-events选项默认是不启用,改为notify-keyspace-events “Ex”。重启生效,索引位i的库,每当有过期的元素被删除时,向**keyspace@:expired**频道发送通知。
E表示键事件通知,所有通知以__keyevent@__:expired为前缀;
x表示过期事件,每当有过期被删除时发送。

与SpringBoot进行集成

①注册JedisConnectionFactory

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

@Configuration
public class RedisConfig {
 
 @Value("${redis.pool.maxTotal}")
 private Integer maxTotal;
 
 @Value("${redis.pool.minIdle}")
 private Integer minIdle;
 
 @Value("${redis.pool.maxIdle}")
 private Integer maxIdle;
 
 @Value("${redis.pool.maxWaitMillis}")
 private Integer maxWaitMillis;
 
 @Value("${redis.url}")
 private String redisUrl;
 
 @Value("${redis.port}")
 private Integer redisPort;
 
 @Value("${redis.timeout}")
 private Integer redisTimeout;
 
 @Value("${redis.password}")
 private String redisPassword;
 
 @Value("${redis.db.payment}")
 private Integer paymentDataBase;
 
 private JedisPoolConfig jedisPoolConfig() {
  JedisPoolConfig config = new JedisPoolConfig();
  config.setMaxTotal(maxTotal);
  config.setMinIdle(minIdle);
  config.setMaxIdle(maxIdle);
  config.setMaxWaitMillis(maxWaitMillis);
  return config;
 }
 
 @Bean
 public JedisPool jedisPool() {
  JedisPoolConfig config = this.jedisPoolConfig();
  JedisPool jedisPool = new JedisPool(config, redisUrl, redisPort, redisTimeout, redisPassword);
  return jedisPool;
 }
 
 @Bean(name = "jedisConnectionFactory")
 public JedisConnectionFactory jedisConnectionFactory() {
  RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
  redisStandaloneConfiguration.setDatabase(paymentDataBase);
  redisStandaloneConfiguration.setHostName(redisUrl);
  redisStandaloneConfiguration.setPassword(RedisPassword.of(redisPassword));
  redisStandaloneConfiguration.setPort(redisPort);

  return new JedisConnectionFactory(redisStandaloneConfiguration);
 }
}

②注册监听器

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service(value ="paymentListener")
public class PaymentListener implements MessageListener {

 @Override
 @Transactional
 public void onMessage(Message message, byte[] pattern) {
  // 过期事件处理流程
 }
}

③配置订阅对象

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;

@Configuration
@AutoConfigureAfter(value = RedisConfig.class)
public class PaymentListenerConfig {
 
 @Autowired
 @Qualifier(value = "paymentListener")
 private PaymentListener paymentListener;
 
 @Autowired
 @Qualifier(value = "paymentListener")
 private JedisConnectionFactory connectionFactory;
 
 @Value("${redis.db.payment}")
 private Integer paymentDataBase;
 
 @Bean
 RedisMessageListenerContainer redisMessageListenerContainer(MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        // 监听paymentDataBase 库的过期事件
        String subscribeChannel = "__keyevent@" + paymentDataBase + "__:expired";
        container.addMessageListener(listenerAdapter, new PatternTopic(subscribeChannel));
        return container;
 }
 
 @Bean
    MessageListenerAdapter listenerAdapter() {
        return new MessageListenerAdapter(paymentListener);
    }
}

paymentDataBase 库元素过期后就会跳入PaymentListener 的onMessage(Message message, byte[] pattern)方法。

到此这篇关于Redis实现订单自动过期功能的示例代码的文章就介绍到这了,更多相关Redis 订单自动过期内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
基于Redis位图实现用户签到功能
May 08 Redis
Redis 彻底禁用RDB持久化操作
Jul 09 Redis
Redis源码阅读:Redis字符串SDS详解
Jul 15 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
Redis三种集群模式详解
Oct 05 Redis
linux下安装redis图文详细步骤
Dec 04 Redis
Redis之RedisTemplate配置方式(序列和反序列化)
Mar 13 Redis
Redis 哨兵机制及配置实现
Mar 25 Redis
Redis特殊数据类型Geospatial地理空间
Jun 01 Redis
Redis实现分布式锁的五种方法详解
Jun 14 Redis
关于Redis的主从复制及哨兵问题
Jun 16 Redis
redis 限制内存使用大小的实现
使用Redis实现秒杀功能的简单方法
Redis6.0搭建集群Redis-cluster的方法
May 08 #Redis
浅谈Redis存储数据类型及存取值方法
Redis IP地址的绑定的实现
May 08 #Redis
redis通过6379端口无法连接服务器(redis-server.exe闪退)
redis 查看所有的key方式
You might like
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
python取代netcat过程分析
2018/02/10 Python
浅析Python函数式编程
2018/10/06 Python
在python中实现对list求和及求积
2018/11/14 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
利用python进行文件操作
2020/12/04 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
美国家居装饰店:Pier 1
2019/09/04 全球购物
护理专科毕业推荐信
2013/11/10 职场文书
护理专业自荐信
2013/12/03 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
园林技术个人的自我评价
2014/02/15 职场文书
爱护草坪标语
2014/06/24 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
个人委托函范文
2015/01/29 职场文书
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技