redis中的自动过期机制实现需求:处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态
1.使用redis key自动过期出发事件通知
2.使用定时任务30分钟后检查
3.按照每分钟轮训检查
create table `order_number` ( `id` int(11) not null auto_increment, `order_name` varchar(255) default null, `order_status` int(11) default null, `order_token` varchar(255) default null, `order_id` varchar(255) default null, primary key (`id`)) engine=innodb auto_increment=20 default charset=utf8;
一、使用redis key自动过期机制当我们的key失效时,可以执行我们的客户端回调监听的方法。
需要在redis中配置:
1.打开redis.conf配置文件
vi redis.conf
2. 在配置文件中查找notify-keyspace-events
/notify-keyspace-events
3. 修改为notify-keyspace-events ex
4.重启redis
二、springboot整合key失效监听@configurationpublic class redislistenerconfig { @bean redismessagelistenercontainer container(redisconnectionfactory connectionfactory) { redismessagelistenercontainer container = new redismessagelistenercontainer(); container.setconnectionfactory(connectionfactory); return container; }}
@componentpublic class rediskeyexpirationlistener extends keyexpirationeventmessagelistener { public rediskeyexpirationlistener(redismessagelistenercontainer listenercontainer) { super(listenercontainer); } @resource private ordermapper ordermapper; /** * 待支付 */ private static final integer order_staypay = 0; /** * 失效 */ private static final integer order_invalid = 2; /** * 使用该方法监听 当我们的key失效的时候执行该方法 * * @param message * @param pattern */ @override public void onmessage(message message, byte[] pattern) { string expirakey = message.tostring(); system.out.println("该key:expirakey:" + expirakey + "失效啦~"); // 前缀判断 ordertoken orderentity ordernumber = ordermapper.getordernumber(expirakey); if (ordernumber == null) { return; } // 获取订单状态 integer orderstatus = ordernumber.getorderstatus(); // 如果该订单状态为待支付的情况下,直接将该订单修改为已经超时 if (orderstatus.equals(order_staypay)) { ordermapper.updateorderstatus(expirakey, order_invalid); // 库存加上1 } }}
@restcontrollerpublic class membercontroller { @autowired private usermapper usermapper; /** * * @return */ @requestmapping("/getlistmember") @cacheable(cachenames = "member", key = "'getlistmember'") public list<memberentity> getlistmember() { return usermapper.findmemberall(); }}
@datapublic class orderentity { private long id; private string ordername; /** * 0 待支付 1 已经支付 */ private integer orderstatus; private string ordertoken; private string orderid; public orderentity(long id, string ordername, string orderid, string ordertoken) { this.id = id; this.ordername = ordername; this.orderid = orderid; this.ordertoken = ordertoken; }}
public interface ordermapper { @insert("insert into order_number values (null,#{ordername},0,#{ordertoken},#{orderid})") int insertorder(orderentity orderentity); @select("select id as id ,order_name as ordername ,order_status as orderstatus,order_token as ordertoken,order_id as orderid from order_number\n" + "where order_token=#{ordertoken};") orderentity getordernumber(string ordertoken); @update("\n" + "\n" + "update order_number set order_status=#{orderstatus} where order_token=#{ordertoken};") int updateorderstatus(string ordertoken, integer orderstatus);}
1.访问addorder接口
2.查看数据库数据
3. 10s后redis过期,执行回调机制
4.再次查看数据库,状态已被修改
以上就是redis中的自动过期机制怎么使用的详细内容。