Redis的scan命令学习

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,倚天版 1GB 1个月
简介: Redis的scan命令学习

1.scan和keys



都是遍历获取key的。
keys:
简单粗暴会返回所有匹配的key。当key过多的时候阻塞,会会造成服务器卡顿,所有后续执行redis的命令会延时或者超时报错。
scan:
1、复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程; 
2、提供 limit 参数,可以控制每次返回结果的最大条数,limit 只是一个 hint,返回的
结果可多可少; 
3、同 keys 一样,它也提供模式匹配功能; 
4、服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数; 
5、返回的结果可能会有重复,需要客户端去重复,这点非常重要; 
6、遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的; 
7、单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零; 
复制代码


2.scan命令



2.1命令


scan cursor MATCH pattern COUNT count
复制代码


2.2.scan例子说明


scan 0 match key* count 2
第一次迭代使用 `0` 作为游标, 表示开始一次新的迭代。
返回的第一条数据为槽位,标识下一次开始的地方,直到返回为0标识结束。
count 2 标识的是槽位数,而不是返回的条数
复制代码


网络异常,图片无法展示
|


2.3sand的遍历和扩容


从上面对图可以看出scan返回的槽位数据是从大到小,也就是从高位到低位。
这样做是为了扩容和缩容的时候避免槽位的遗漏和重复
复制代码


网络异常,图片无法展示
|


首先容量是2的N次方,扩容或者缩容的时候都是2的倍数。
a 1  001   1%8=1               1%16=1
b 6  110   6%8=6               6%16=6
c 3  011   3%8=3   扩大一倍后   3%16=3
d 14 1110  14%8=6              14%16=14
e 11 1011  11%8=3              11%16=11
f 11 1011  11%8=3              11%16=11
可以看到d、e、f的槽位发生了变化
高位到低位
   00      10      01      11
000 100 010 110 001 101 011 111
遍历到01的时候扩容那么会从 001 开始遍历,前面已经遍历过的数据则不会再遍历了。
复制代码


2.4redis扩容-》渐进式 rehash


2.5大key定位指令


redis-cli -a 123654 --bigkeys
redis-cli -a 123654 --bigkeys -i 0.1
上面这个指令每隔 100 条 scan 指令就会休眠 0.1s


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
30天前
|
NoSQL Java Redis
分布式锁实现原理问题之使用Redis的setNx命令来实现分布式锁问题如何解决
分布式锁实现原理问题之使用Redis的setNx命令来实现分布式锁问题如何解决
|
2月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
61 1
|
2月前
|
NoSQL Java Redis
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
52 0
|
2月前
|
存储 消息中间件 缓存
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
62 0
|
22天前
|
存储 缓存 NoSQL
Redis 全局通用命令整理
Redis 全局通用命令整理
48 10
|
22天前
|
存储 JSON NoSQL
Redis常见命令大全
【7月更文挑战第30天】
11 3
|
22天前
|
NoSQL Redis 索引
Redis 中ZSET数据类型命令使用及对应场景总结
Redis 中ZSET数据类型命令使用及对应场景总结
31 2
|
22天前
|
NoSQL Redis
Redis set数据类型命令使用及应用场景使用总结
Redis set数据类型命令使用及应用场景使用总结
22 1
|
26天前
|
NoSQL 网络协议 Redis
Redis性能优化问题之如何判断 Redis 性能下降是否由复杂度过高的命令引起
Redis性能优化问题之如何判断 Redis 性能下降是否由复杂度过高的命令引起
|
26天前
|
编解码 NoSQL Redis
c++开发redis module问题之想实现Redis命令,如何解决
c++开发redis module问题之想实现Redis命令,如何解决