未来数据定时刷新——从zset中获取预设时间内的任务添加到list中

发布时间 2023-07-05 10:42:28作者: 佛系粥米

未来数据定时刷新——实现步骤:

定时任务/每分钟————》未来数据的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);
            }
        }

    }