我们的目的是在用户下单后,规定指定时间后自动将订单设置为“已过期”,不能再发起支付。
(学习视频分享:redis视频教程)
思路:
结合redis的订阅、发布和键空间通知机制(keyspace notifications)进行实现。
配置redis.confg
notify-keyspace-events选项默认是不启用,改为notify-keyspace-events “ex”。重启生效,索引位i的库,每当有过期的元素被删除时,向**keyspace@:expired**频道发送通知。
e表示键事件通知,所有通知以__keyevent@__:expired为前缀;
x表示过期事件,每当有过期被删除时发送。
与springboot进行集成
1、注册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;@configurationpublic 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); }}
2、注册监听器
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) { // 过期事件处理流程 }}
3、配置订阅对象
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实现订单自动过期功能的源码分享的详细内容。
