文章目录
- 渐进式遍历
- scan
- 数据库管理
- 切换数据库
- 清除数据库
- 获取当前数据库key的个数
渐进式遍历
Redis使⽤scan命令进⾏渐进式遍历键,进⽽解决直接使⽤keys获取键时能出现的阻塞问题。每次scan命令的时间复杂度是O(1),但是要完整地完成所有键的遍历,需要执⾏多次scan,每执行一次命令,只获取其中的一小部分,这样可以保证当前这一次操作不会阻塞redis服务器
- ⾸次scan,光标设置为0,意味着这次遍历是从头开始获取,scan的返回值的前半部分1),是告诉你下次遍历光标要从哪个位置开始,2)才是真正遍历到的key的内容
- 当scan返回的下次位置为0时,遍历结束
注意:此处的cursor
不能理解为下标,并不是一个连续递增的整数,仅仅是一个字符串
scan
以渐进式的⽅式进⾏键的遍历
语法:SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
- MATCH pattern:匹配满足格式的key
- COUNT count:限制这一次遍历能够获取到多少个元素
- 此处的count和MySQL当中的limit不同,前者只是给redis服务器一个提示/建议,写入的count和实际返回的key的个数不一定完全相同,后者是精确的
- Type type:表示要遍历获取什么数据类型的value,redis的key都是string,但是value的类型不一样!
返回值:下⼀次scan的游标(cursor)以及本次得到的键
注意:渐进性遍历scan虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删除),可能导致遍历时键的重复遍历或者遗漏
结果1):表示下次scan光标的位置 结果2):这次遍历拿到的key有哪些
注意:渐进式遍历在遍历过程当中,不会在服务器这边存储任何的状态信息,可以随时终止,不会对服务器产生任何副作用
数据库管理
Redis提供了⼏个⾯向Redis数据库的操作,分别是dbsize、select、flushdb、flushall命令
切换数据库
select dbIndex
Redis只是⽤数字作为多个数据库的实现。Redis默认配置中是有16个数据库,各个数据库互相不会有影响。select0操作会切换到第⼀个数据库,select15会切换到最后⼀个数据库,0号数据库和15号数据库保存的数据是完全不冲突的,有各⾃的键值对。默认情况下,我们处于数据库0
Redis中虽然⽀持多数据库,但是不是特别建议使⽤多数据库特性。真的需要完全隔离的两套键值对,更好的做法是维护多个Redis实例,⽽不是在⼀个Redis实例中维护多数据库,因为本⾝Redis并没有为多数据库提供太多的特性,其次⽆论是否有多个数据库,Redis都是使⽤单线程模型,所以彼此之间还是需要排队等待命令的执⾏。同时多数据库还会让开发、调试和运维⼯作变得复杂。所以实践中,始终使⽤数据库0其实是⼀个很好的选择
清除数据库
flushdb/flushall命令⽤于清除数据库
- flushdb只清除当前数据库当中所有的key
- flushall会清除所有数据库当中所有的key
FLUSHDB [ASYNC | SYNC] //ASYNC:异步的 SYNC:同步的
获取当前数据库key的个数
DBSIZE