一些通用命令.
2.7.1 单个键管理
1. 键重命名
- rename
- renamenx
注意:
- 重命名期间会执行 del 命令删除旧键, 如果该键对应的值比较大, 会阻塞 Redis
- 如果 rename 和 renamenx 中的 key 和 newkey 是相同的, 在 Redis3.2 和之前版本返回结果略有不同
- 3.2: 返回 OK
- 之前: 提示错误
2. 随机返回一个键
- randomkey
3. 键过期
- expireat
- pexpire
- pexpireat
- pttl
- persist
4. 迁移键
(1) move
- 在 Redis 内部进行数据迁移
- 内部数据库之间
- 不推荐在生产环境使用多数据库功能
move key db
(2) dump + restore
- 在不同 Redis 实例之间进行数据迁移
dump key
restore key ttl value
步骤:
- 在源 Redis 上, dump 命令会将键值序列化, 格式采用的是RDB格式。
- 在目标 Redis 上, restore 命令将上面序列化的值进行复原, 其中 ttl 参数代表过期时间, 如果 ttl=0 代表没有过期时间。
注意:
- 整个迁移过程并非原子性的, 而是通过客户端分步完成的
- 迁移过程是开启了两个客户端连接, 所以 dump 的结果不是在源 Redis 和目标 Redis 之间进行传输
这两个命令是通过客户端中转完成的: 客户端先获取编码后的 RDB (dump), 客户端再存储到目标 Redis 中.
(3) migrate
- 实际上 migrate 命令就是将 dump、restore、del 三个命令进行组合, 从而简化了操作流程
- 具有原子性
- 3.0.6版本以后支持迁移多个键
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key ...]]
2.7.2 遍历键
1. 全量遍历键
- keys
- 支持 pattern 匹配
- glob 风格通配符
删除所有以 video 字符串开头的键:
redis-cli keys video* | xargs redis-cli del
2. 渐进式遍历
- scan
- 每次的时间复杂度为: O(1)
Redis 存储键值对实际使用 hashtable:
其它的 scan:
- hscan
- sscan
- zscan
如果在 scan 的过程中如果有键的变化 (增加、删除、修改), 那么遍历效果可能会碰到如下问题:
- 新增的键可能没有遍历到
- 遍历出了重复的键等情况
也就是说 scan 并不能保证完整的遍历出来所有的键.
2.7.3 数据管理
- dbsize
- select
- flushdb/flushall
1. 切换数据库
- select
为什么不使用多个数据库:
- Redis 是单线程的, 如果使用多个数据库, 那么这些数据库仍然是使用一个CPU, 彼此之间还是会受到影响的
- 多数据库的使用方式, 会让调试和运维不同业务的数据库变的困难, 假如有一个慢查询存在,依然会影响其他数据库, 这样会使得别的业务方定位问题非常的困难
- 部分 Redis 的客户端根本就不支持这种方式。即使支持, 在开发的时候来回切换数字形式的数据库, 很容易弄乱
2. flushdb/flushall
- 用于清除数据库
- flushdb 只清除当前数据库
- flushall 清除所有数据库
问题:
- 误操作
- 也会阻塞 Redis