渐进式遍历
Redis 使⽤ scan 命令进⾏渐进式遍历键,进⽽解决直接使⽤ keys 获取键时可能出现的阻塞问题。每次 scan 命令的时间复杂度是 O(1),但是要完整地完成所有键的遍历,需要执⾏多次 scan。
SCAN 以渐进式的⽅式进⾏键的遍历。 语法:SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
命令有效版本:2.8.0 之后 时间复杂度:O(1) 返回值:下⼀次 scan 的游标(cursor)以及本次得到的键。
除了 scan 以外,Redis ⾯向哈希类型、集合类型、有序集合类型分别提供了 hscan、sscan、zscan 命令,它们的⽤法和 scan 基本类似,感兴趣的读者可以⾃⾏做扩展学习。 渐进性遍历 scan 虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删除),可能导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑。
数据库管理
Redis 提供了⼏个⾯向 Redis 数据库的操作,分别是 dbsize、select、flushdb、flushall 命令, 本机将通过具体的使⽤常⻅介绍这些命令。
切换数据库
select dbIndex
许多关系型数据库,例如 MySQL ⽀持在⼀个实例下有多个数据库存在的,但是与关系型数据库⽤字符来区分不同数据库名不同,Redis 只是⽤数字作为多个数据库的实现。Redis 默认配置中是有 16个数据库。select 0 操作会切换到第⼀个数据库,select 15 会切换到最后⼀个数据库。0 号数据库和15 号数据库保存的数据是完全不冲突的 ,即各种有各⾃的键值对。默认情况下,我们处于数据库 0。
Redis 中虽然支持多数据库,但随着版本的升级,其实不是特别建议使用多数据库特性。如果真的需要完全隔离的两套键值对,更好的做法是维护多个 Redis 实例,⽽不是在⼀个Redis 实例中维护多数据库。这是因为本⾝ Redis 并没有为多数据库提供太多的特性,其次⽆论是否有多个数据库,Redis 都是使用单线程模型,所以彼此之间还是需要排队等待命令的执⾏。同时多数据库还会让开发、调试和运维工作变得复杂。所以实践中,始终使⽤数据库 0 其实是⼀个很好的选择。
清除数据库
flushdb / flushall 命令⽤于清除数据库,区别在于 flushdb 只清除当前数据库,flushall 会清楚所有数据库。
永远不要在线上环境执⾏清除数据的操作,除⾮你想体验⼀把 “从删库到跑路” 的操作。