redis scan count的含义/二进制安全问题

redis是单线程的,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

 1 @Test
 2     public void test2() {
 3         Jedis jedis = new Jedis("192.168.101.101");
 4         System.out.println(jedis.ping());
 5
 6
 7         // 0 单次返回的结果为0并不代表遍历结束,只有当返回的cursor为0时才代表遍历结束
 8         String cursor = ScanParams.SCAN_POINTER_START;
 9
10         ScanParams params = new ScanParams();
11         //默认的count数量为10,count并非限定返回结果的数量,
12         // 而是单次遍历的数组元素数量(redis底层是hash表实现的,所以存放数据的是数组),返回其中匹配的元素
13         //当元素较多,而count设置的比较小时,此时会进行多次查询
14         params.count(10);
15         params.match("u*");
16
17         ScanResult<String> scanResult;
18         boolean flag = true;
19         while (flag) {
20             scanResult = jedis.scan(cursor, params);
21             cursor = scanResult.getCursor();
22             if (Integer.parseInt(cursor) == 0) {
23                 flag = false;
24             }
25             System.out.println(cursor);
26             scanResult.getResult().forEach(i -> System.out.println(i));
27         }
28
29         jedis.close();
30     }

类似的还有hscan(hash),zscan(zset),sscan(set),不再赘述

什么是二进制安全?比如你用word打开了一张图片,显示的是乱码,如果你修改了这些乱码,再用图片查看器打开图片时你会发现图片打不开了,这个操作就是非二进制安全的

还有一个例子,写入文件时如果写入的编码与文件编码不一致,写入之后会产生大量的无意义的乱码,很容易导致文件无法正常显示,c语言默认将空格作为字符串的结尾,这就导致c保存字符串时会出现内容丢失的问题,redis底层存储字符串的是sds,虽然使用的是char类型的数组,但里面保存的却是字节,此外redis没有对字符串设定任何的过滤及修改,从这点上看redis是二进制安全的,可以存储视频,音频,redis的字符串最大长度是512M,扩容的方式类似java中的hashmap,list等都是预先分配多余的空间,从而减少频繁的内存分配带来的性能开销

原文地址:https://www.cnblogs.com/tele-share/p/11449502.html

时间: 2024-08-02 17:24:26

redis scan count的含义/二进制安全问题的相关文章

Redis Scan迭代器遍历操作原理

Redis在2.8.0版本新增了众望所归的scan操作,从此再也不用担心敲入了keys*, 然后举起双手看着键盘等待漫长的系统卡死了··· 命令的官方介绍在这里, 中文版由huangz同学细心翻译了,作者Antirez的介绍在这里:Finally Redis collections are iterable (我又邪恶的想到了之前他那次机器down机的事故了···). 具体的使用参考上面的链接即可,这里大概介绍一下Scan操作的实现原理. Redis的SCAN操作由于其整体的数据设计,无法提供特

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

续上一篇文章 Redis Scan迭代器遍历操作原理(一)–基础 ,这里着重讲一下dictScan函数的原理,其实也就是redis SCAN操作最有价值(也是最难懂的部分). 关于这个算法的源头,来自于githup这里:Add SCAN command #579,长篇的讨论,确实难懂····建议看看这帖子,antirez 跟pietern 关于这个奇怪算法的讨论··· 这个算法的作者是:Pieter Noordhuis,作者称其为:reverse binary iteration ,不知道我一对

Redis Scan命令

原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUNT count] SCAN 命令及其相关的 SSCAN 命令. HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements): SCAN 命令用于迭代当前数据库中的数据库键. SSCAN 命令用于迭代集

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

SpringRedisTemplate针对这个Scan进行了封装,示例使用(针对最新库spring-data-redis-1.8.1.RELEASE): Set<Object> execute = redisTemplate.execute(new RedisCallback<Set<Object>>() { @Override    public Set<Object> doInRedis(RedisConnection connection) throw

PHP函数二进制安全问题

本文主要从三个角度来阐述php的二进制安全:1. 什么叫php的二进制安全:2. 什么结构确保了php的二进制安全:3. 这种结构还有哪些其它方面的应用? 做到知其然,也知其所以然. 一句话解释: php的内部函数在操作二进制数据时能保证达到预期的结果,例如str_replace.stristr.strcmp等函数,我们就说这些函数是二进制安全的. 举个列子: 我们来对比一下C和php下的strcmp函数. C代码如下 [objc] view plaincopy main(){ char ab[

项目中使用Redis的游标scan的一些小问题

最近项目中有一个需求就是在下拉中要筛选车辆列表,本来想着是在内存中全部用程序去遍历处理,但发现数据有点多,一个个去处理会有点慢.然后就找到了redis的游标 感觉这个能满足我的需求,我可以把key存成车牌号,value为车辆id的值,通过正则匹配到车牌号就能获取车辆id来查找信息了.思路有了,接下来就开工了. 在官网上找到这么一段程序 /* Without enabling Redis::SCAN_RETRY (default condition) */ $it = NULL; do { //

Redis word bak

@font-face { font-family: "Arial"; }@font-face { font-family: "Courier New"; }@font-face { font-family: "Times"; }@font-face { font-family: "Geneva"; }@font-face { font-family: "Tms Rmn"; }@font-face { fon

Golang Redis操作

1. Redis简介 Redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库. 1.1 特点 支持更多数据类型 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set 有序集合)和hash(哈希类型).[1] 支持复杂操作 这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上

一文彻底理解Redis序列化协议,你也可以编写Redis客户端

前提 最近学习Netty的时候想做一个基于Redis服务协议的编码解码模块,过程中顺便阅读了Redis服务序列化协议RESP,结合自己的理解对文档进行了翻译并且简单实现了RESP基于Java语言的解析.编写本文的使用使用的JDK版本为[8+]. RESP简介 Redis客户端与Redis服务端基于一个称作RESP的协议进行通信,RESP全称为Redis Serialization Protocol,也就是Redis序列化协议.虽然RESP为Redis设计,但是它也可以应用在其他客户端-服务端(C