转载自:https://blog.csdn.net/w05980598/article/details/80264568

众所周知,当redis中key数量越大,keys 命令执行越慢,而且最重要的会阻塞服务器,对单线程的redis来说,简直是灾难,终于找到了替代命令scan。

SCAN cursor [MATCH pattern] [COUNT count]

SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements):

  • SCAN 命令用于迭代当前数据库中的数据库键。
  • SSCAN 命令用于迭代集合键中的元素。
  • HSCAN 命令用于迭代哈希键中的键值对。
  • ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

以上列出的四个命令都支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像 KEYS命令、 SMEMBERS 命令带来的问题 —— 当 KEYS 命令被用于处理一个大的数据库时, 又或者 SMEMBERS 命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。

不过, 增量式迭代命令也不是没有缺点的: 举个例子, 使用 SMEMBERS 命令可以返回集合键当前包含的所有元素, 但是对于 SCAN 这类增量式迭代命令来说, 因为在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证 (offer limited guarantees about the returned elements)。

因为 SCAN 、 SSCAN 、 HSCAN 和 ZSCAN 四个命令的工作方式都非常相似, 所以这个文档会一并介绍这四个命令, 但是要记住:

  • SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个数据库键。
  • 而 SCAN 命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。
scan 0 默认返回10条数据。
127.0.0.1:6379> scan 0
1) "81920"
2)  1) "CMD:1000004739:4"
    2) "CMD:1000010475:2"
    3) "CMD:380071400001208:766"
    4) "CMD:1000006866:LIST"
    5) "CMD:380071400001208:20415"
    6) "CMD:380071400001231:21530"
    7) "CMD:380071400001208:21780"
    8) "CMD:7485630165:LIST"
    9) "CMD:1000001545:2"
   10) "CMD:380071400001231:4387"
可以用count 参数指定返回数据量:
127.0.0.1:6379> scan 0 count 100
1) "104448"
2)   1) "CMD:1000004739:4"
     2) "CMD:1000010475:2"
     3) "CMD:380071400001208:766"
     4) "CMD:1000006866:LIST"
     5) "CMD:380071400001208:20415"
     6) "CMD:380071400001231:21530"
     7) "CMD:380071400001208:21780"
     8) "CMD:7485630165:LIST"
     9) "CMD:1000001545:2"
    10) "CMD:380071400001231:4387"
    ......
    94) "CMD:201610200062:6"
    95) "CMD:VF3748211006:3"
    96) "CMD:1000009121:4"
    97) "CMD:380071400001231:6563"
    98) "CMD:1000010252:ID"
    99) "CMD:1000005261:5"
   100) "SERVER:45568_0"
使用match 参数来匹配模式:
127.0.0.1:6379> scan 0 match CMD* count 100
1) "104448"
2)  1) "CMD:1000004739:4"
    2) "CMD:1000010475:2"
    3) "CMD:380071400001208:766"
    4) "CMD:1000006866:LIST"
    5) "CMD:380071400001208:20415"
    6) "CMD:380071400001231:21530"
    7) "CMD:380071400001208:21780"
    8) "CMD:7485630165:LIST"
    9) "CMD:1000001545:2"
   10) "CMD:380071400001231:4387"
   ......
   86) "CMD:201610200062:6"
   87) "CMD:VF3748211006:3"
   88) "CMD:1000009121:4"
   89) "CMD:380071400001231:6563"
   90) "CMD:1000010252:ID"
   91) "CMD:1000005261:5"
最重要的是scan不会阻塞服务器,现网环境也可以用,真方便。
官方文档:http://redisdoc.com/key/scan.html#scan
上java 代码 
    /***  * HSCAN 命令用于迭代哈希键中的键值对。* @Title: getSortedSetSize* @Description:* @param key* @return* @return long* @author   2019-1-16 上午10:17:03*/public static Map<String, String> hscan(int dbIndex,String key,int pageSize){Map<String, String> map = new HashMap<String, String>();Jedis jedis = null;        try {jedis = getJedis();jedis.select(dbIndex);ScanParams sp = new ScanParams();sp.count(pageSize);//每次多少条  //可以设置模糊查询             loop(map, key, jedis, "0", sp);    } catch (Exception e) {logger_xt_err.error(e.getMessage());return null;}finally{// 返还到连接池if(jedis!=null)close(jedis); }return map;} public static Map<String, String> loop(Map<String, String> mapList, String key, Jedis jedis, String cursor,ScanParams sp) {try {ScanResult<Entry<String, String>> map = jedis.hscan(key, cursor, sp);cursor = map.getStringCursor();for (Entry<String, String> en : map.getResult()) {mapList.put(en.getKey(), en.getValue());}System.out.println("cursor:" + cursor);} catch (Exception e) {e.printStackTrace();return null;}if (!"0".equals(cursor)) {loop(mapList, key, jedis, cursor, sp);}return mapList;}

使用的jar包:jedis-2.9.0.jar,commons-pool2-2.4.2.jar

转载于:https://www.cnblogs.com/yangyang2018/p/10275671.html

redis 用scan 代替keys,hgetAll相关推荐

  1. redis 用scan 代替keys 解决百万数据模糊查询超时问题

    redis 用scan 代替keys 解决百万数据模糊查询超时问题 参考文章: (1)redis 用scan 代替keys 解决百万数据模糊查询超时问题 (2)https://www.cnblogs. ...

  2. 采坑记录-Redis使用scan代替keys

    [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! spark代码案例地址: https://github.com/Mydreaman ...

  3. Redis - 使用scan代替keys与hgetall操作

    1.scan前言 当我们使用 keys * 或 hgetall 进行查询的时候会进行堵塞,导致 redis 整体不可用(因为redis是单线程的),而使用 scan 命令则不会. 从Redis v2. ...

  4. redis sscan java_redis 用scan 代替keys,hgetAll

    转载自:https://blog.csdn.net/w05980598/article/details/80264568 众所周知,当redis中key数量越大,keys 命令执行越慢,而且最重要的会 ...

  5. SpringBoot Redis使用scan扫描keys出前诡异的乱码前缀

    在使用SpringBoot Redis里的scan方法扫描匹配的keys时出现了诡异的乱码前缀,类似如下截图: 字符串如下: ��t�online-token-eyJhbGciOiJIUzUxMiJ9 ...

  6. Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)

    1. keys Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key. 127.0.0.1:6379> keys * (empty array) 127. ...

  7. php?redis的scan用法实例分析

    更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 茂名一技http://www.enechn.com ppt制作教程步骤 http://www.tpyjn.c ...

  8. redis使用scan模糊匹配key

    在redis实际使用中,会遇到一个问题:如何从海量的key中找出满足特定前缀的key列表? 1.不要使用keys* redis提供了一个简单包里的指令keys用来列出所有满足特定正则字符串规则的key ...

  9. redis的scan命令的源码分析,实现原理

    简言 1. 线上环境keys命令不可用,会导致redis卡死.scan命令因为可以分批遍历,比较实用 2. scan命令包括多个 遍历整个数据库的scan命令,处理函数 scanCommand(),最 ...

最新文章

  1. mysql索引图文操作_图文并茂,说说MySQL索引
  2. html 如何让div刷新页面,页面刷新.html
  3. cad线加粗怎么设置_原来CAD的线条还可以这样加粗!还能修改初始单位!太实用了...
  4. P5056-[模板]插头dp
  5. (一)Neo4j在Centos7虚拟机上的安装
  6. 第一次软工作业展示——潘学
  7. Python编写只允许实例化一个对象的类
  8. meteor 结合mysql_Meteor集合
  9. Atitit.实现继承的原理and方法java javascript .net c# php ...
  10. Python2.7打包的exe文件反编译成py文件
  11. PL/SQL 连接mysql步骤
  12. Linux系统并搭建Sip server平台
  13. 开源软件之screen的第一次使用
  14. 如何进行代理上网以及ccproxy设置
  15. 快速区分AR VR MR 全息 3D
  16. 瑞格科技IPO被终止:曾拟募资5.6亿 江振翔三兄弟为实控人
  17. SVM算法教科书(一)
  18. 卡梅隆对话刘慈欣:想看《三体》拍成电影
  19. oracle 280000,续-实例恢复- ORACLE instance shut down
  20. rust三人服_rust怎么设置第三人视角 | 手游网游页游攻略大全

热门文章

  1. matlab奇异矩阵高效求逆,奇异矩阵求逆问题!!!
  2. scroller类的用法完全解析以及带源码分析
  3. 弘辽科技:如何快速提升抖音小店
  4. python入门小程序之列表练习
  5. “在朋友圈晒了五年加班,才知道老板早就把我屏蔽了”
  6. 生活中的哈哈语录和顺口溜。
  7. 生兔子c语言递归的方法,经典的兔子生兔子问题(C#递归解法)
  8. JAVA 间隔 时间 计算器
  9. 轻量级过程改进之绩效管理
  10. 练习:银行复利计算(用 for 循环解一道初中小题)