未来数据定时刷新——实现步骤:
定时任务/每分钟————》未来数据的keys————》按照分值查询zset,判断数据是否到期——到期》同步到Redis中的list
1、如何获取zset中所有的key?
keys 模糊匹配,future。效率低
SCNA命令:SCAN 命令是一个基于游标的迭代器,SCAN命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为SCAN命令的游标参数, 以此来延续之前的迭代过程。
2、数据如何同步?
第一:从zset中查出数据,并删除
第二:把数据存入到list中
普通redis客户端和服务端交互模式:客户端向服务端建立连接发送请求,获取返回结果。问题:不断建立连接请求
优化:redis管道 Pipeline请求模型:把所有的操作指令放入通道,在通道中执行完成再返回。一次请求获取最终结果
启动类上开启定时任务 @EnableScheduling
/** * 未来数据定时刷新、每分钟执行一次 */ @Scheduled(cron = "0 */1 * * * ?") public void refresh(){ log.info("未来数据定时刷新-----定时任务"); //获取所有未来数据的集合key Set<String> futureKeys = cacheService.scan(ScheduleConstants.FUTURE + "*"); //按照key和分值查询符合条件的数据 for (String futureKey : futureKeys) { //获取当前数据的key topic String topicKey = ScheduleConstants.TOPIC + futureKey.split(ScheduleConstants.FUTURE)[1]; Set<String> tasks = cacheService.zRangeByScore(futureKey, 0, System.currentTimeMillis()); //同步数据 if(!tasks.isEmpty()){ //将tasks添加到list中, 从redis中删除tasks, cacheService.refreshWithPipeline(futureKey, topicKey, tasks); log.info("成功的将" + futureKey + "刷新到了" + topicKey); } } }
标签:tasks,zset,list,预设,定时,futureKey,数据 From: https://www.cnblogs.com/fxzm/p/17527875.html