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的含义/二进制安全问题的更多相关文章

  1. Redis Scan迭代器遍历操作原理(一)

    Redis在2.8.0版本新增了众望所归的scan操作,从此再也不用担心敲入了keys*, 然后举起双手看着键盘等待漫长的系统卡死了··· 命令的官方介绍在这里, 中文版由huangz同学细心翻译了, ...

  2. Redis Scan命令

    原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUN ...

  3. Redis Scan迭代器遍历操作原理(二)

    续上一篇文章 Redis Scan迭代器遍历操作原理(一)–基础 ,这里着重讲一下dictScan函数的原理,其实也就是redis SCAN操作最有价值(也是最难懂的部分). 关于这个算法的源头,来自 ...

  4. redis scan 命令指南

    redis scan 命令指南 1. 模糊查询键值 redis 中模糊查询key有 keys,scan等,一下是一些具体用法. -- 命令用法:keys [pattern] keys name* -- ...

  5. Redis SCAN命令实现有限保证的原理

    SCAN命令可以为用户保证:从完整遍历开始直到完整遍历结束期间,一直存在于数据集内的所有元素都会被完整遍历返回,但是同一个元素可能会被返回多次.如果一个元素是在迭代过程中被添加到数据集的,又或者是在迭 ...

  6. redis scan迭代模糊匹配

    $redis = new Redis(); $redis->connect('localhost', 6379); $iterator = null; while (true) { $keys ...

  7. redis SCAN cursor

    https://redis.io/commands/scan 可以看到: sscan的返回结果,有两部分, 第一部分  是一个数字.其实代表一个游标. 第二部分  是结果. scan是以游标为基础,每 ...

  8. Redis Scan的使用方式以及Spring redis的坑

    SpringRedisTemplate针对这个Scan进行了封装,示例使用(针对最新库spring-data-redis-1.8.1.RELEASE): Set<Object> execu ...

  9. redis scan命令使用

      以前的项目中有用到redis的keys命令来获取某些key,知道看了这篇文章 https://mp.weixin.qq.com/s/SGOyGGfA6GOzxwD5S91hLw.安全起见,这次打算 ...

随机推荐

  1. shell学习(22)- comm

    1.预备知识 comm命令可用于比较两个已排序的文件.它可以显示出第一个文件和第二个文件所独有的行以及这两个文件所共有的行.该命令有一些选项可以禁止显示指定的列,以便于执行交集和求差操作. 交集(in ...

  2. cocos2dx 2.2.3在Windows 7 64bit上搭建开发环境

    最终弄完了cocos2dx 2.2.3在windows 7 64bit上的环境搭建,过程比較揪心.揪心的主要原因还是引擎的开发人员和官方文档的写作者都是偏爱MAC OS的,所以官方文档中的安装方法是以 ...

  3. JQ取消hover事件

    $('a').unbind('mouseenter').unbind('mouseleave');

  4. P2532 [AHOI2012]树屋阶梯

    题目:P2532 [AHOI2012]树屋阶梯 思路: 打表之后不难看出是裸的Catalan数.简单证明一下: 对于任意一种合法方案,都可以表示为在左下角先放一个\(k*(n+1-k),k\in[1, ...

  5. 像Google一样构建机器学习系统3 - 利用MPIJob运行ResNet101

    本系列将利用阿里云容器服务,帮助您上手Kubeflow Pipelines. 第一篇:在阿里云上搭建Kubeflow Pipelines 第二篇:开发你的机器学习工作流 第三篇:利用MPIJob运行R ...

  6. @bzoj - 4377@ [POI2015] Kurs szybkiego czytania

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 n, a, b, p,其中 n, a 互质.定义一个长度为 ...

  7. poj 1039 Pipe (Geometry)

    1039 -- Pipe 理解错题意一个晚上._(:з」∠)_ 题意很容易看懂,就是要求你求出从外面射进一根管子的射线,最远可以射到哪里. 正解的做法是,选择上点和下点各一个,然后对于每个折点位置竖直 ...

  8. H3C 广播风暴

  9. H3C 链路层协议

  10. hdu 1754 I Hate It(线段树区间求最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...