spring中redis scan的使用涉及到的几个点

  1. ScanOptions有两个参数count及match。其中match为匹配规则。count为每次扫描key的数量,而不是一次扫描返回结果集的数量。keys的时间复杂度是O(n),scan命令是为了避免堵塞,分批扫描,所以别指望性能上的提升。redis底层默认count是10,建议设置大一点,毕竟多次的往返开销是不容忽视的。而太大的话,又失去分批扫描的意义。具体数量要根据实际权衡,大致1000~10000?存疑,有经验的可以解答下
  2. Cursor为scan扫描初次后返回的结果ScanCursor,其中包含关键的游标cursorId(<=0后则扫描结束),以及一次扫描的结果集等。ScanCursor中的hasNext经过重写,所以一次扫描的结果遍历后并不代表结束,还要看CursorState是否为FINISHED状态。如果当前批次已遍历完,但是状态还是OPEN的,则进行下一批次的scan,获取该批结果后更新cursorId、state、delegate。这边贴出部分编译后的源码:
        public boolean hasNext() {
            this.assertCursorIsOpen();
    
            while(!this.delegate.hasNext() && !ScanCursor.CursorState.FINISHED.equals(this.state)) {
                this.scan(this.cursorId);
            }
    
            if (this.delegate.hasNext()) {
                return true;
            } else {
                return this.cursorId > 0L;
            }
        }

     

  3. 每批次scan的结果集可能重复,去要去重。原因与scan过程redis底层数据的hash扩容/缩容过程有关
  4. 'SCAN' cannot be called in pipeline / transaction mode.   需要做其他处理的,可以在扫描都完成后,再开启

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值