https://blog.csdn.net/HD243608836/article/details/125184838
Scan命令又细分为:scan命令,Sscan命令、Hscan命令、Zscan命令。
Redis中的Keys命令和Smembers命令类似于数据库中的全表扫描,其中,Smembers命令返回集合中的所有的成员,与数据库中的全表扫描无异。由于Redis是单线程,而Keys命令和Smembers命令会造成Redis线程的堵塞,在生产环境需要十分慎重的使用。
为了避免Redis线程的堵塞,出现了查询迭代命令,也就是Scan命令,其用于迭代当前数据库中的缓存数据。Scan 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为Scan命令的游标参数, 以此来延续之前的迭代过程。
Scan命令返回一个包含两个元素的数组,
第一个元素:是用于进行下一次迭代的新游标(如果新游标返回 0 表示迭代已结束)
第二个元素:则是一个数组, 这个数组中包含了所有被迭代的元素。
在同一时间,可以有任意多个客户端对同一数据集进行迭代,客户端每次执行迭代都需要传入一个游标,并在迭代执行之后获得一个新的游标,而这个游标就包含了迭代的所有状态,因此,服务器无须为迭代记录任何状态。因为迭代的所有状态都保存在游标里面,而服务器无须为迭代保存任何状态,所以客户端可以在中途停止一个迭代,而无须对服务器进行任何通知。即使有任意数量的迭代在中途停止,也不会产生任何问题。
以下是一个SCAN命令的迭代过程示例:
127.0.0.1:6379> scan 0 MATCH ops-coffee-*
1)"38"
2) "ops-coffee-25"
"ops-coffee-19"
"ops-coffee-29"
"ops-coffee-10"
"ops-coffee-23"
"ops-coffee-5"
"ops-coffee-14"
"ops-coffee-16"
"ops-coffee-11"
"ops-coffee-15"
"ops-coffee-7"
"ops-coffee-1"
127.0.0.1:6379> scan 38 MATCH ops-coffee-* COUNT 1000
"0"
"ops-coffee-13"
"ops-coffee-9"
"ops-coffee-21"
"ops-coffee-6"
"ops-coffee-30"
"ops-coffee-20"
"ops-coffee-2"
"ops-coffee-12"
"ops-coffee-28"
"ops-coffee-3"
"ops-coffee-26"
"ops-coffee-4"
"ops-coffee-31"
"ops-coffee-8"
"ops-coffee-22"
"ops-coffee-27"
"ops-coffee-18"
"ops-coffee-24"
"ops-coffee-17"
上面这个例子的意思是扫描所有前缀为“ops-coffee-”的key