【攻克Redis】键值管理

键重命名

#重命名
#注意:如果newkey本身存在,这种重命名会覆盖存在的key
rename key newkey
#确保只有newkey不存在时候才被覆盖
renamenx key newkey

注意:

  • 于重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性
  • 如果rename和renamenx中的key和newkey如果是相同的,在Redis3.2之后(返回OK)和之前版本返回结果(报错:“(error) ERR source and destination objects are the same”)略有不同。

随机返回一个键

#随机返回一个键
randomkey

键过期

#设置过期时间
expire key seconds
#键在milliseconds毫秒后过期
pexpire key milliseconds
#键在毫秒级时间戳timestamp后过期
pexpireat key milliseconds-timestamp
#查询键的剩余过期时间:大于等于0的证书:键剩余的过期时间;-1键没有设置过期时间;-2键不存在
ttl key
#查询键的剩余过期时间,精度key达到毫秒级别
pttl key
#键在seconds秒后过期
expire key seconds
#键在秒级时间戳timestamp后过期
expireat key timestamp

注意:

  1. 如果expire key的键不存在,返回结果为0
  2. 如果过期时间为负值,键会立即被删除,犹如使用del命令一样
  3. persist命令可以将键的过期时间清除
  4. 对于字符串类型键,执行set命令会去掉过期时间
  5. Redis不支持二级数据结构(如哈希、列表)内部元素的过期功能,例如不能对列表类型的一个元素做过期时间设置
  6. setex命令作为set+expire的组合,不但是原子执行,同时减少了一次网络通讯的时间。

迁移键

  1. move

    
    #把指定的键从源数据库移动到目标数据库中,不推荐在生产环境上用
    
    move key db

    这里写图片描述

  2. dump+restore

    
    #dump+restore可以实现在不同的Redis实例之间进行数据迁移的功能
    
    
    #源Redis上,dump命令会将键值序列化,格式采用的是RDB格式
    
    dump key 
    
    #目标Redis上,restore命令将上面序列化的值进行复原,其中ttl参 数代表过期时间,如果ttl=0代表没有过期时间
    
    restore key ttl value

    这里写图片描述

    注意:

    第一,整个迁移过程并非原子性的,而是通过客户端分步完成的。

    第二,迁移过程是开启了两个客户端连 接,所以dump的结果不是在源Redis和目标Redis之间进行传输。

  3. migrate

    
    #用于在Redis实例间进行数据迁移的,实际上migrate命 令就是将dump、restore、del三个命令进行组合,从而简化了操作流程
    
    
    #host:目标redis的IP地址
    
    
    #port:目标redis的端口
    
    
    #key|"":在Redis3.0.6版本之前,migrate只支持迁移一个键,所以此处是 要迁移的键,但Redis3.0.6版本之后支持迁移多个键,如果当前需要迁移多 个键,此处为空字符串""
    
    
    #destination-db:目标Redis的数据库索引
    
    
    #timeout:迁移的超时时间(单位为毫秒)
    
    
    #[copy]:如果添加此选项,迁移后并不删除源键
    
    
    #[replace]:如果添加此选项,migrate不管目标Redis是否存在该键都会正常迁移进行数据覆盖
    
    
    #[keys key[key...]]:迁移多个键,例如要迁移key1、key2、key3,此处填 写“keys key1 key2 key3”
    
    migrate host port key|"" destination-db timeout [copy] [replace] [keys key[key...]]

    注意:

    第一,整个过程是原子执行的,不需要在多个Redis实例上开启客户端的,只需要在源Redis上执行migrate命令即可。

    第二,migrate命令的 数据传输直接在源Redis和目标Redis上完成的。

    第三,目标Redis完成restore 后会发送OK给源Redis,源Redis接收后会根据migrate对应的选项来决定是否 在源Redis上删除对应的键。

    这里写图片描述

    这里写图片描述

遍历键

全量遍历键
#执行keys命令很可能会造成Redis阻塞,所以一般建议不要在生 产环境下使用keys命令
keys pattern
#使用场景
1、在一个不对外提供服务的Redis从节点上执行,这样不会阻塞到客户端的请求,但是会影响到主从复制
2、如果确认键值总数确实比较少,可以执行该命令。
3、使用下面要介绍的scan命令渐进式的遍历所有键,可以有效防止阻塞。
渐进式遍历
#cursor是必需参数,实际上cursor是一个游标,第一次遍历从0开始,每次scan遍历完都会返回当前游标的值,直到游标值为0,表示遍历结束。
#match pattern是可选参数,它的作用的是做模式的匹配,这点和keys的模式匹配很像。
#count number是可选参数,它的作用是表明每次要遍历的键个数,默认 值是10,此参数可以适当增大。
scan cursor [match pattern] [count number]

注意:

​ 渐进式遍历key有效的解决keys命令可能产生的堵塞问题,在scan使用过程中如果有键的变化(增加、删除、修改),那么遍历效果可能会碰到如下问题:新增的键可能没有遍历到,遍历出了重 复的键等情况,也就是说scan并不能保证完整的遍历出来所有的键。

​ 除了scan以外,Redis提供了面向哈希类型、集合类型、有序集合的扫 描遍历命令,解决诸如hgetall、smembers、zrange可能产生的阻塞问题,对 应的命令分别是hscan、sscan、zscan

数据库管理

切换数据库
#切换数据库
select dbIndex

这里写图片描述

flushdb/flushall
#清除当前数据库
flushdb
#清除所有数据库
flushall

带来的问题:

  • flushdb/flushall命令会将所有数据清除
  • 如果当前数据库键值数量比较多,flushdb/flushall存在阻塞Redis的可能性

猜你喜欢

转载自blog.csdn.net/zlt995768025/article/details/81872573