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中的自动过期机制怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡编程网网站,小编将为大家输出更多高质量的实用文章!
推荐阅读
-
php如何让Swoole/Pool进程池实现Redis持久连接
php如何让Swoole/Pool进程池实现Redis持久连接本篇...
-
php操作redis大全记录
php连接redis测试˂?php$redis=newRedis();$redis-˃conne...
-
PHP经典高级工程师面试题
1.PHP如何实现不用自带的cookie函数为客户端下发cookie。对于分布式系统,如何来保存session值...
-
PHP操作Redis数据库
-
php利用redis防止商品超发来限制抢购,简单又实用
-
php如何实现秒杀功能?php+redis模拟简单抢购场景,快来看看吧
-
PHP高级工程师面试题
-
Laravel结合Redis发送邮箱验证码
-
使用redis缓存实现多服务器PHP sessions共享
-
PHP用redis的有序集合zset实现延迟队列