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

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

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

    }
复制代码

 

posted @   佛系粥米  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示