Redis渐进式遍历:安全高效的键扫描术
之前在核心指令讲解中提到
keys * 一次性的把整个redis中所有的key都获取到
这个操作是比较危险的,可能一下子得到太多的key,阻塞redis服务器
通过渐进式的遍历,就可以做到,既能够获取到所有的key,同时又不会卡死服务器
所以渐进式遍历是为了避免阻塞服务器
渐进式:不是一个命令,把所有的key都拿到,而是每执行一次命令,只获取到其中的一小部分,这样的话能够保证当前这一次操作不会太卡,要想得到所有的key就需要多次遍历了,多次执行渐进式遍历命令
渐进式遍历其实是一组命令,这一组命令的使用方法是一样的
其中代表命令scan
Redis 的 scan命令是一种用于迭代遍历 Redis 数据库中键的命令,它可以逐步迭代所有键(或指定模式的键),相比 KEYS
命令更适合在生产环境中使用。
用法:
这个match pattern就是之前讲的key命令中的匹配模式,对于命令key *可以忘记了,以后用这个
count就是限制一次遍历能够获取到多少个元素,默认是10
此处的count只是给redis服务器一个”提示/建议“,写入的count和实际返回的key的个数不一定是完全相同的,但是也不会差很多(注意redis中不是精确值,Redis 会根据内部数据结构调整实际返回数量,mysql中的limit是精确的)
还有一个选项type,这个是redis6+才支持的,可以指定返回的键的类型
注意:如果命令返回0了就说明遍历结束了
注意这两张图片是连在一起的,看返回值,返回是告诉你下一次要从哪里开始遍历,这个程序员也看不懂,redis服务器懂就行,只需要知道下一次遍历从这里开始就行
简单来说之前就是我一次如果遍历key *,如果我遍历一半了之后,想要取消是取消不了的,服务器一股脑的从头到尾的扫描,即使你客户端断开连接,而scan不是这样,遍历是可以随时中断的,你只需要记录每次的光标移动到哪,你过一会再使用也行
注意:渐进式遍历scan虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加/修改/删除等),可能会导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑
虽然scan比keys要好点,但是使用的时候也还是有很多的注意事项的,很多的出错的可能的
真的需要遍历redis中所有的key吗???
mysql中有一个重要的概念:database
一个mysql服务器上可以有很多个database,一个database上可以有很多个表,mysql中可以随心所欲的创建/删除 数据库
在前面的学习过程中,感觉好像就是上来就是key value key value
其实redis中也是有database这样的概念的,只不过不像mysql那样随意
默认redis给咱们提供了16个数据库 0-15
这16个数据库中的数据是隔离的,相互之间不会有影响
默认情况下使用的数据库就是0号的
实际使用redis很少会关注到数据库,一般都是默认使用0号就可以了
flushdb:删除当前数据库中所有的key
flushall:删除所有数据库中所有的key
(注意以后在公司里千万不敢乱用!!!尤其是在生产环境上)
身处哪个数据库就返回哪个数据库的key个数