redis的hscan写法``

HSCAN key cursor [MATCH pattern] [COUNT count]

这里明明是有cursor参数,为何spring的redistemplate客户端中不提供该起始游标的参数?

     RedisTemplate rt;rt.opsForHash().scan("key", ScanOptions.scanOptions().count(100).match("*").build());

ScanOptions该方法只有两个参数:

public class ScanOptions {/*** Constant to apply default {@link ScanOptions} without setting a limit or matching a pattern.*/public static ScanOptions NONE = new ScanOptions(null, null);private final @Nullable Long count;private final @Nullable String pattern;

那么问题来了,开始的游标的参数在哪里呢?于是乎有人就这样误用这个方法了
错误使用示例:

     RedisTemplate rt;rt.opsForHash().scan("key", ScanOptions.scanOptions().count(Integer.MAX_VALUE).match("*").build());

一次拿完所有的的值,这样使用这个方法的意义就没有了,这个方法的本意是分批小段遍历,这样一次取出来和直接hkeys全部没有任何区别,时间复杂度都是O(n),那这个方法的count参数应该传什么值?答案就是一般传某一分页大小的值(其实这个值是不能用来分页的,因为这个值只是个大概值,redis不保证传回的数量是多少,这是另一个问题,不在这里引申出去了).
那疑问又来了,如果count传分页大小比如100,那他是怎么获取到这个hash结构下所有的field的?
答案是redisTemplate帮我们封装好了。其实你调用以下代码的时候

     Cursor cursor = rt.opsForHash().scan("key", ScanOptions.scanOptions().count(Integer.MAX_VALUE).match("*").build());while(cursor.hasNext()){cursor.next()}

驱动第二次调用底层原生scan代码的方法是cursor.hasNext,当发现上一次底层原生scan返回的值已经遍及完的时候,他会再次执行scan方法去redis获取数据,而起始的游标Id就是上一次scan返回的游标值,直到遍历结束,这样就达到了分批遍历的目的

redisTemplate的hscan方法中为何不需要指定游标开始地址的原因相关推荐

  1. vivado sdk中xil_out函数对指定的BRAM地址写数据为什么会导致程序挂起?

    是有关zynq芯片的网口程序调试的,我在例程lwip_echo_server程序中加入了往指定的bram地址写数据的语句,想要实现PS到PL数据的交互,但是程序执行到xil_out这块直接就运行不下去 ...

  2. 如何在庞大的ip地址库中快速定位到对应的ip地址所对应的归属地?

    通过ip地址查看 ip地址的归属地,这个功能实现起来并不复杂,它是通过维护一个很大的ip地址库来实现的,比如查找 202..133.3 该ip地址库,那便会在对应的ip地址库中找到 一个区间 如 [2 ...

  3. Spring中RedisTemplate方法中,redis相关操作笔记。[redis生成指定长度自增批次号,删除、设置过期时间等]

    Spring中RedisTemplate方法中,redis相关操作笔记. redis获取自增批次号 // opsForValue()生成long UUID = redisTemplate.opsFor ...

  4. redisTemplate Hash 使用方法

    redisTemplate Hash 使用方法 package com;import java.util.ArrayList; import java.util.Collection; import ...

  5. Mybatis 获取当前序列和下一个序列值 以及在一个方法中写多条SQL 语句

    目录 1.Mybatis 获取当前序列和下一个序列值 2.Mybatis 在一个方法中写多条SQL 语句 1.Mybatis 获取当前序列和下一个序列值 #获取当前序列值 select XXX_seq ...

  6. 因果图方法中的基本符号

    因果图方法中的基本符号 前言 基本符号 1.恒等 2.非 3.或 4.与 5.互斥 6.包含 7.唯一 8.要求 9.屏蔽 总结 前言 经过了春节假期,我们重新回到工作学习中.在学习因果图法前首先要学 ...

  7. 动态划分VLAN的方法中不包括(23)。【答案】C

    动态划分VLAN的方法中不包括(23). (23)A.网络层协议 B.网络层地址 C.交换机端口 D.MAC地址 [答案]C [解析] 在交换机上实现VLAN,可以采用静态的或动态的方法: ①静态分配 ...

  8. 在面向数据流的设计方法中,一般把数据流图中的数据流划分为 (16) 两种。 答案:C

    在面向数据流的设计方法中,一般把数据流图中的数据流划分为 (16) 两种. (16)A.数据流和事务流 B.变换流和数据流 C.变换流和事务流 D.控制流和事务流 数据流的类型决定映射的方法.数据流有 ...

  9. 局部内部类访问方法中的局部变量为什么加final

    1)从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的 ...

最新文章

  1. html 语言 gif 动画,动效篇(1)--从简单CSS3动画片段代码,到生成gif动图~
  2. cef使用缓存_CEF 文件下载功能实现
  3. Java如何通过WSDL文件来调用这些web service
  4. 回文数的个数、杨辉三角
  5. 8 大错误SQL用法,你肯定踩过坑!
  6. elementUI + vue 地址跳转:无法返回上一页 - 解决篇
  7. pytorch —— Batch Normalization
  8. 深度学习(四十)caffe使用点滴记录
  9. JS组件系列——Bootstrap Select2组件使用小结
  10. python init文件_Python __init__.py 作用详解
  11. 二维码识别超级解决方案,工业级别
  12. 李雅普诺夫稳定性理论 matlab,李雅普诺夫稳定理论的定义应用解析.ppt
  13. C#语言与三菱PLC串口通讯
  14. android实现QQ空间和QQ好友分享功能
  15. 刘强东的高调,给京东带来了流量,也给京东带来了灾难
  16. Ubuntu18中安装Nvidia驱动和CUDA和cuDNN库加速
  17. 一句话马密码暴力破解篇(黑吃黑)
  18. 实战PyQt5: 143-QChart图表之堆积柱状图
  19. 12-监听器实现统计网站当前在线人数
  20. 血压计 - 袖带血压计概念

热门文章

  1. @程序员,这份 2 万人收藏的计算机科学速成课速码!
  2. 与吴恩达并肩战斗,她是颜值爆表的 AI 科学家!
  3. 雷军这么努力,为什么还是干不过 OV?
  4. 如何将三万行代码从 Flow 移植到 TypeScript?
  5. Google 杀死了 160 个产品!
  6. 1024程序员节:除了高薪,你还有什么理由坚持做程序员?
  7. iOS 11.3 显示:Apple ID 或将实现微信式扫码登陆
  8. 12306再曝漏洞,一张身份证可买两张相同火车票
  9. k3s 卸载_Mac-Homebrew安装/卸载/更换国内镜像源
  10. java数组存入mysql_将数组存入数据库的解决方法及用VC与数据库交互