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