Redis中的自动过期机制怎么使用

Redis中的自动过期机制怎么使用

本篇内容介绍了“Redis中的自动过期机制怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Redis中的自动过期机制

实现需求:处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态

1.使用Redis Key自动过期出发事件通知
2.使用定时任务30分钟后检查
3.按照每分钟轮训检查

CREATETABLE`order_number`(`id`int(11)NOTNULLAUTO_INCREMENT,`order_name`varchar(255)DEFAULTNULL,`order_status`int(11)DEFAULTNULL,`order_token`varchar(255)DEFAULTNULL,`order_id`varchar(255)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=20DEFAULTCHARSET=utf8;

一、使用Redis Key自动过期机制

当我们的key失效时,可以执行我们的客户端回调监听的方法。
需要在Redis中配置:

1.打开redis.conf配置文件

viredis.conf

2. 在配置文件中查找notify-keyspace-events

/notify-keyspace-events

3. 修改为notify-keyspace-events Ex

4.重启redis

二、SpringBoot整合key失效监听

@ConfigurationpublicclassRedisListenerConfig{@BeanRedisMessageListenerContainercontainer(RedisConnectionFactoryconnectionFactory){RedisMessageListenerContainercontainer=newRedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);returncontainer;}}
@ComponentpublicclassRedisKeyExpirationListenerextendsKeyExpirationEventMessageListener{publicRedisKeyExpirationListener(RedisMessageListenerContainerlistenerContainer){super(listenerContainer);}@ResourceprivateOrderMapperorderMapper;/***待支付*/privatestaticfinalIntegerORDER_STAYPAY=0;/***失效*/privatestaticfinalIntegerORDER_INVALID=2;/***使用该方法监听当我们的key失效的时候执行该方法**@parammessage*@parampattern*/@OverridepublicvoidonMessage(Messagemessage,byte[]pattern){StringexpiraKey=message.toString();System.out.println("该key:expiraKey:"+expiraKey+"失效啦~");//前缀判断orderTokenOrderEntityorderNumber=orderMapper.getOrderNumber(expiraKey);if(orderNumber==null){return;}//获取订单状态IntegerorderStatus=orderNumber.getOrderStatus();//如果该订单状态为待支付的情况下,直接将该订单修改为已经超时if(orderStatus.equals(ORDER_STAYPAY)){orderMapper.updateOrderStatus(expiraKey,ORDER_INVALID);//库存加上1}}}
@RestControllerpublicclassMemberController{@AutowiredprivateUserMapperuserMapper;/****@return*/@RequestMapping("/getListMember")@Cacheable(cacheNames="member",key="'getListMember'")publicList<MemberEntity>getListMember(){returnuserMapper.findMemberAll();}}
@DatapublicclassOrderEntity{privateLongid;privateStringorderName;/***0待支付1已经支付*/privateIntegerorderStatus;privateStringorderToken;privateStringorderId;publicOrderEntity(Longid,StringorderName,StringorderId,StringorderToken){this.id=id;this.orderName=orderName;this.orderId=orderId;this.orderToken=orderToken;}}
publicinterfaceOrderMapper{@Insert("insertintoorder_numbervalues(null,#{orderName},0,#{orderToken},#{orderId})")intinsertOrder(OrderEntityOrderEntity);@Select("SELECTIDASID,order_nameASORDERNAME,order_statusASorderstatus,order_tokenasordertoken,order_idasorderidFROMorder_number\n"+"whereorder_token=#{orderToken};")OrderEntitygetOrderNumber(StringorderToken);@Update("\n"+"\n"+"updateorder_numbersetorder_status=#{orderStatus}whereorder_token=#{orderToken};")intupdateOrderStatus(StringorderToken,IntegerorderStatus);}

1.访问addOrder接口

2.查看数据库数据

3. 10s后redis过期,执行回调机制

4.再次查看数据库,状态已被修改

“Redis中的自动过期机制怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡编程网网站,小编将为大家输出更多高质量的实用文章!

发布于 2022-05-19 10:35:26
收藏
分享
海报
0 条评论
24
上一篇:php如何检查数组内值是否互不相等 下一篇:Python字符串中怎么去除数字之间的逗号
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码