redis scan count的含义/二进制安全问题
redis是单线程的(4.0之前),keys查询键类似hbase的全表扫描(也可以理解为select *),大数据量时非常耗时,因此官方给出了scan,使用scan类似数据库分页,可以指定查询多少个元素,官网的说明是scan是一种遍历,只不过可以用count指定每次查询多少个元素
语法:scan cursor match pattern count num
cursor:游标,默认从0开始,每一次执行scan除了返回查询结果还会返回游标的位置,即便某次查询结果为空,并不能代表遍历结束,只有当返回的游标为0时,才能代表遍历结束
match:默认是 * ,匹配指定的元素
count:默认是10,redis的底层实现类似java的hashmap,都是hash表,所以真正存储数据的是数组,count指定的是每次查询数组多少个元素
综上:scan查询count数量的元素返回满足match条件的结果

使用Jedis来操作redis
@Test
public void test2() {
Jedis jedis = new Jedis("192.168.101.101");
System.out.println(jedis.ping()); // 0 单次返回的结果为0并不代表遍历结束,只有当返回的cursor为0时才代表遍历结束
String cursor = ScanParams.SCAN_POINTER_START; ScanParams params = new ScanParams();
//默认的count数量为10,count并非限定返回结果的数量,
// 而是单次遍历的数组元素数量(redis底层是hash表实现的,所以存放数据的是数组),返回其中匹配的元素
//当元素较多,而count设置的比较小时,此时会进行多次查询
params.count(10);
params.match("u*"); ScanResult<String> scanResult;
boolean flag = true;
while (flag) {
scanResult = jedis.scan(cursor, params);
cursor = scanResult.getCursor();
if (Integer.parseInt(cursor) == 0) {
flag = false;
}
System.out.println(cursor);
scanResult.getResult().forEach(i -> System.out.println(i));
} jedis.close();
}
类似的还有hscan(hash),zscan(zset),sscan(set),不再赘述
什么是二进制安全?比如你用word打开了一张图片,显示的是乱码,如果你修改了这些乱码,再用图片查看器打开图片时你会发现图片打不开了,这个操作就是非二进制安全的
还有一个例子,写入文件时如果写入的编码与文件编码不一致,写入之后会产生大量的无意义的乱码,很容易导致文件无法正常显示,c语言默认将空格作为字符串的结尾,这就导致c保存字符串时会出现内容丢失的问题,redis底层存储字符串的是sds,虽然使用的是char类型的数组,但里面保存的却是字节,此外redis没有对字符串设定任何的过滤及修改,从这点上看redis是二进制安全的,可以存储视频,音频,redis的字符串最大长度是512M,扩容的方式类似java中的hashmap,list等都是预先分配多余的空间,从而减少频繁的内存分配带来的性能开销
redis scan count的含义/二进制安全问题的更多相关文章
- Redis Scan迭代器遍历操作原理(一)
Redis在2.8.0版本新增了众望所归的scan操作,从此再也不用担心敲入了keys*, 然后举起双手看着键盘等待漫长的系统卡死了··· 命令的官方介绍在这里, 中文版由huangz同学细心翻译了, ...
- Redis Scan命令
原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUN ...
- Redis Scan迭代器遍历操作原理(二)
续上一篇文章 Redis Scan迭代器遍历操作原理(一)–基础 ,这里着重讲一下dictScan函数的原理,其实也就是redis SCAN操作最有价值(也是最难懂的部分). 关于这个算法的源头,来自 ...
- redis scan 命令指南
redis scan 命令指南 1. 模糊查询键值 redis 中模糊查询key有 keys,scan等,一下是一些具体用法. -- 命令用法:keys [pattern] keys name* -- ...
- Redis SCAN命令实现有限保证的原理
SCAN命令可以为用户保证:从完整遍历开始直到完整遍历结束期间,一直存在于数据集内的所有元素都会被完整遍历返回,但是同一个元素可能会被返回多次.如果一个元素是在迭代过程中被添加到数据集的,又或者是在迭 ...
- redis scan迭代模糊匹配
$redis = new Redis(); $redis->connect('localhost', 6379); $iterator = null; while (true) { $keys ...
- redis SCAN cursor
https://redis.io/commands/scan 可以看到: sscan的返回结果,有两部分, 第一部分 是一个数字.其实代表一个游标. 第二部分 是结果. scan是以游标为基础,每 ...
- Redis Scan的使用方式以及Spring redis的坑
SpringRedisTemplate针对这个Scan进行了封装,示例使用(针对最新库spring-data-redis-1.8.1.RELEASE): Set<Object> execu ...
- redis scan命令使用
以前的项目中有用到redis的keys命令来获取某些key,知道看了这篇文章 https://mp.weixin.qq.com/s/SGOyGGfA6GOzxwD5S91hLw.安全起见,这次打算 ...
随机推荐
- JAVA高级--异常处理概念和异常处理机制
什么是异常 程序运行的过程中发生的一些不正常事件 异常分类 Throwable Error 错误 Exception IOException RuntimeException ...
- jQuery,javascript获得网页的高度和宽度$(document).height / $(window).height
一.javascript 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: documen ...
- python 调用API时异常捕获的技巧
- vim删除行
0,vim filename 1,显示行号 :set number 2,跳转到第1000行 1000G (跳转到文件末尾:“G”) 3,删除1-1000行 :1,.d 4,删除所有行 先跳转到文件最后 ...
- 设置WPF窗口相对于非WPF窗口的位置
原文:设置WPF窗口相对于非WPF窗口的位置 在前一个Post当中,指出了在WPF的WindowInteropHelper类中的一个BUG:通过WindowInteropHelper的Owner属性不 ...
- Java练习 SDUT-1580_闰年
闰年 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 时间过得真快啊,又要过年了,同时,我们的人生也增长了一年的阅历,又 ...
- Android ViewGroup点击效果(背景色)
在开发Android应用的界面时,我们必然会用到本文ViewGroup,尤其是FrameLayout,LinearLayout,RelativeLayout等ViewGroup的子类: 在一些情况下, ...
- 谈谈数据库的 ACID(转)
一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 准备工作:为了说明事务的ACID原理,我们使用银行账户及资金管理的案例进行分析. 二.ACI ...
- [转载] linux下tar命令解压到指定的目录
参考 http://blog.sina.com.cn/s/blog_62449fcf0100nfar.html linux下tar命令解压到指定的目录 : #tar zxvf /bbs.tar.z ...
- Adam那么棒,为什么还对SGD念念不忘 (2)—— Adam的两宗罪
在上篇文章中,我们用一个框架来回顾了主流的深度学习优化算法.可以看到,一代又一代的研究者们为了我们能炼(xun)好(hao)金(mo)丹(xing)可谓是煞费苦心.从理论上看,一代更比一代完善,Ada ...