(三)日常高频操作
A. 键管理
- 键重命名:修改key的名字,若改后的key本已存在,会被覆盖本来key的value,具体可参考下方案例
-
set a b
,初次设置a的value为b; -
set c d
,初次设置c的value为d; -
rename a c
,将a重命名为c; -
get c
,获取c的值,此时得到的c的value是b,覆盖了原来d,且get a
获得的结果时nil。 - 补充说明:rename本质新建一个new key,把old key的value拷贝到new key,然后删除old key。所以如果rename的key过大,会有阻塞redis的可能性。
-
- 键过期: key的过期时间仅支持string、hash、list、set这类一级数据结构,不能单独hash等内部二级的某个值(field)去设置过期时间。关于key过期删除策略可参考第(五)篇的内存理解部分。
-
expire key seconds
&pexpire key milliseconds
: 设置过期时长,二者精度不一样。 - 使用set命令会抹掉过期时间(源码可见到这一步骤)。
- 建议使用setex命令,原子性,直接一步完成value的设置和过期时间设置。
-
- 键迁移
- move: redis内部迁移,对内部db0 到db15,move key db;
- dump + restore
- 第一步在源redis上dump key;
- 然后目标redis上restore key ttl value,完成redis不同实例间迁移。
- 注意,value是dump生成代码;
- migrate: 具有原子性,仅在源redis上执行即可,
migrate target_host target_port key db timeout
。- migrate 192.18.4.1 6379 hello 0 1000,向192.18.4.1的redis迁移数据内容。
- 注意,可在key前加copy(源不删除)和replace(强制覆盖目标)。
- 遍历键
- keys:
keys *
ORkeys h?ll*
- scan: 渐进式遍历,每次遍历部分。
-
scan 0
,会返回一个游标(比如6),然后给出本次渐进式遍历得到的结果; - 第二次,scan 6,慢慢重复。直到游标给0结束。
-
- keys:
B. 发布订阅(MQ)功能
- 概述:redis可以实现消息中间件的功能,承接生产者 & 消费者。
- 发布消息
- 语法:
publish channel message
。 - 案例:
publish xxx “we are the champion!”
,返回结果是订阅者个数。
- 语法:
- 订阅消息
- 语法:
subscribe channel
- 案例:
subscribe xxx
,订阅上方channel,若后续生产者publish内容,则使用该命令的客户端会受到对应信息。
- 语法:
- 总结:路人甲打开redis客户端1号,开始进行publish发布,此时甲是生产者。路人乙和丙打开redis客户端2,3号,对甲的channel订阅,那么乙和丙是消费者。若甲开始publish,后续乙和丙会收到信息,同时甲收到返回结果为2,表示两个客户端收到信息。
C. 其他类型操作
-
主从模式(包括cluster sentinel)下脏数据问题
预防出现:确保slave节点在分流功能上仅负责读的流量分担,新写入或变更数据的操作直接和master节点交互,由master同步给所有的slave。
-
解决方案:若脏数据已写入或主从数据已经不一致,则需要进行重新同步,共需三步完成。
- slave节点使用
flushall
清空数据; - slave节点使用
slaveof no one
解除主从关系; - slave节点使用
slaveof masterip port
再次进行主从关系绑定,激活重新同步。
- slave节点使用
说明:若不手动解除主从关系,新版本下master不会更新slave的rid和offset,只会将增量的key同步到slave节点。
-
动态修改配置
- 概述:在生产环境下需要在不重启redis的情况下进行配置更新,且为了确保日后重启后保持本次配置的效果。
- 具体操作案例
- 查看当前所有配置:
config get *
- 修改配置内容:
config set maxmemory 10g
,设置redis最大内存为10g - 修改内容持久化:
config rewrite
,保障redis后期若重启,本次的参数修改依然生效
- 查看当前所有配置: