Redis和DelayQueue设计具有过期时间的缓存

本文介绍了如何使用Redis和DelayQueue设计具有过期时间的缓存。通过Redis的HSET命令设置哈希表的值,并在缓存过期后使用HDEL删除相应条目。编码设计中,缓存操作与删除操作在不同线程执行,以storm为例,prepare方法在工程启动后仅执行一次,execute方法则持续运行。同时展示了如何进行缓存添加和删除访客记录的线程操作。
摘要由CSDN通过智能技术生成


1、场景:

有一款APP,用户登陆后。会将用户的用户号,手机号、以及设备号等上报给后台的清洗程序(这里设备号是唯一的)。后台因为需要根据这三个做一定的运算。所以希望
对于每一个访客-用户关系进行缓存,并只缓存10分钟,并且缓存使用redis。注意,是每一条记录都只缓存10分钟。而不是一批记录!

2、解决方案
1、在redis里有个函数,hset(String key,String field ,String value),也有对应的hexpire(String key,int second),但是这里如果以设备号为key的话,
field和value要怎么设置??因为缓存进去后,因为我们取的时候是不知道设备号的,只能说一条记录10分钟到了,就应该从redis取出来。并删除redis的记录。
这里笔者还注意到有另一个函数,删除函数为hdel(String key,String ..fields).如果将设备号放到hset的field 字段,key为一个固定的字符串。但是还是那一个问题
怎么知道有一个设备号已缓存10分钟了?反复思考,想到Java的一个类,叫DelayQueue。就是它。

DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。我们可以将DelayQueue运用在以下应用场景:
其主要有以下两种使用场景:
缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue&#x
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值