一些通用命令.

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 内部进行数据迁移
    • 内部数据库之间
  • 不推荐在生产环境使用多数据库功能
  1. move key db

image.png

(2) dump + restore
  • 在不同 Redis 实例之间进行数据迁移
  1. dump key
  2. restore key ttl value

步骤:

  1. 在源 Redis 上, dump 命令会将键值序列化, 格式采用的是RDB格式。
  2. 在目标 Redis 上, restore 命令将上面序列化的值进行复原, 其中 ttl 参数代表过期时间, 如果 ttl=0 代表没有过期时间。

image.png

注意:

  • 整个迁移过程并非原子性的, 而是通过客户端分步完成的
  • 迁移过程是开启了两个客户端连接, 所以 dump 的结果不是在源 Redis 和目标 Redis 之间进行传输

这两个命令是通过客户端中转完成的: 客户端先获取编码后的 RDB (dump), 客户端再存储到目标 Redis 中.

image.png

(3) migrate
  • 实际上 migrate 命令就是将 dump、restore、del 三个命令进行组合, 从而简化了操作流程
  • 具有原子性
  • 3.0.6版本以后支持迁移多个键
  1. migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key ...]]

image.png

image.png

2.7.2 遍历键

1. 全量遍历键

  • keys
    • 支持 pattern 匹配
    • glob 风格通配符

删除所有以 video 字符串开头的键:

  1. redis-cli keys video* | xargs redis-cli del

2. 渐进式遍历

  • scan
  • 每次的时间复杂度为: O(1)

Redis 存储键值对实际使用 hashtable:

image.png

其它的 scan:

  • hscan
  • sscan
  • zscan

如果在 scan 的过程中如果有键的变化 (增加、删除、修改), 那么遍历效果可能会碰到如下问题:

  • 新增的键可能没有遍历到
  • 遍历出了重复的键等情况

也就是说 scan 并不能保证完整的遍历出来所有的键.

2.7.3 数据管理

  • dbsize
  • select
  • flushdb/flushall

1. 切换数据库

  • select

image.png

为什么不使用多个数据库:

  • Redis 是单线程的, 如果使用多个数据库, 那么这些数据库仍然是使用一个CPU, 彼此之间还是会受到影响的
  • 多数据库的使用方式, 会让调试和运维不同业务的数据库变的困难, 假如有一个慢查询存在,依然会影响其他数据库, 这样会使得别的业务方定位问题非常的困难
  • 部分 Redis 的客户端根本就不支持这种方式。即使支持, 在开发的时候来回切换数字形式的数据库, 很容易弄乱

2. flushdb/flushall

  • 用于清除数据库
  • flushdb 只清除当前数据库
  • flushall 清除所有数据库

问题:

  • 误操作
  • 也会阻塞 Redis