redis 用scan 代替keys,hgetAll
转载自: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 命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。
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"
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"
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"
/*** * 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;}
转载于:https://www.cnblogs.com/yangyang2018/p/10275671.html
redis 用scan 代替keys,hgetAll相关推荐
- redis 用scan 代替keys 解决百万数据模糊查询超时问题
redis 用scan 代替keys 解决百万数据模糊查询超时问题 参考文章: (1)redis 用scan 代替keys 解决百万数据模糊查询超时问题 (2)https://www.cnblogs. ...
- 采坑记录-Redis使用scan代替keys
[提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! spark代码案例地址: https://github.com/Mydreaman ...
- Redis - 使用scan代替keys与hgetall操作
1.scan前言 当我们使用 keys * 或 hgetall 进行查询的时候会进行堵塞,导致 redis 整体不可用(因为redis是单线程的),而使用 scan 命令则不会. 从Redis v2. ...
- redis sscan java_redis 用scan 代替keys,hgetAll
转载自:https://blog.csdn.net/w05980598/article/details/80264568 众所周知,当redis中key数量越大,keys 命令执行越慢,而且最重要的会 ...
- SpringBoot Redis使用scan扫描keys出前诡异的乱码前缀
在使用SpringBoot Redis里的scan方法扫描匹配的keys时出现了诡异的乱码前缀,类似如下截图: 字符串如下: ��t�online-token-eyJhbGciOiJIUzUxMiJ9 ...
- Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)
1. keys Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key. 127.0.0.1:6379> keys * (empty array) 127. ...
- php?redis的scan用法实例分析
更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 茂名一技http://www.enechn.com ppt制作教程步骤 http://www.tpyjn.c ...
- redis使用scan模糊匹配key
在redis实际使用中,会遇到一个问题:如何从海量的key中找出满足特定前缀的key列表? 1.不要使用keys* redis提供了一个简单包里的指令keys用来列出所有满足特定正则字符串规则的key ...
- redis的scan命令的源码分析,实现原理
简言 1. 线上环境keys命令不可用,会导致redis卡死.scan命令因为可以分批遍历,比较实用 2. scan命令包括多个 遍历整个数据库的scan命令,处理函数 scanCommand(),最 ...
最新文章
- mysql索引图文操作_图文并茂,说说MySQL索引
- html 如何让div刷新页面,页面刷新.html
- cad线加粗怎么设置_原来CAD的线条还可以这样加粗!还能修改初始单位!太实用了...
- P5056-[模板]插头dp
- (一)Neo4j在Centos7虚拟机上的安装
- 第一次软工作业展示——潘学
- Python编写只允许实例化一个对象的类
- meteor 结合mysql_Meteor集合
- Atitit.实现继承的原理and方法java javascript .net c# php ...
- Python2.7打包的exe文件反编译成py文件
- PL/SQL 连接mysql步骤
- Linux系统并搭建Sip server平台
- 开源软件之screen的第一次使用
- 如何进行代理上网以及ccproxy设置
- 快速区分AR VR MR 全息 3D
- 瑞格科技IPO被终止:曾拟募资5.6亿 江振翔三兄弟为实控人
- SVM算法教科书(一)
- 卡梅隆对话刘慈欣:想看《三体》拍成电影
- oracle 280000,续-实例恢复- ORACLE instance shut down
- rust三人服_rust怎么设置第三人视角 | 手游网游页游攻略大全