工作中,突然想到了这个问题,记录下:
redis的scan命令,如果匹配模式为test*情况下,看以下哪种是正确的:
1 scan会遍历以test开头的key,获取这些key 。
2 scan会遍历所有的key,并过滤出以test开头的key ,
哪种是scan的原理呢?
第2种是正确的,SCAN命令会遍历所有的key,并过滤出以特定模式开头的key。
Redis的SCAN
命令是一个迭代器,它允许客户端逐步遍历数据库中的键。SCAN
命令的基本语法如下:
SCAN cursor [MATCH pattern] [COUNT count]
cursor
是游标,用于分批次迭代。pattern
是匹配的模式,用于指定一个glob风格的模式来过滤键。count
是可选参数,用于指定每次迭代返回的元素数量,默认为10。
当使用MATCH
选项时,SCAN
命令会在服务器端根据给定的模式过滤键。这意味着只有与模式匹配的键才会被返回给客户端。因此,如果模式设置为test*
,则SCAN
命令将只返回以"test"开头的键。
需要注意的是,由于SCAN
命令是基于游标的,所以在遍历过程中可能会出现重复的键。这是因为在遍历的过程中,数据库中的键可能会发生变化(如新增或删除),这可能会导致某些键在不同的迭代中被重复返回。因此,在使用SCAN
命令时,客户端需要能够处理这种情况,以确保数据的完整性和准确性。
总结来说,SCAN
命令是通过逐步遍历所有键并根据指定的模式进行过滤来实现的,而不是仅仅遍历匹配模式的键。这使得SCAN
命令成为在生产环境中处理大量数据时的首选方法,因为它不会导致服务器阻塞,并且可以有效地管理内存使用。
redis scan count:count到底代表什么?
1. 用于指定每次迭代返回的元素数量
2. 用于每次迭代扫描的bucket数量
第二种是正确的。 count代表每次游标的bucket桶的数据量(redis内部是bucket桶数组+链式表存储结构):每次scan扫描的时候,会遍历这些桶,然后再遍历桶的链表元素
假设count=100,就代表遍历100个bucket桶,但是桶里面的链表可能有多个也可能没有,所以返回的元素就不一定是100个
另外redis scan每次返回的游标起始就是桶的游标,代表桶的位置,简单来说就是从哪个位置的桶接着遍历