03_Redis基本键的管理
更新日期:
[TOC]
03_Redis基本键的管理
1. 简介
针对键的管理,如type
,del
,object
,exists
,expire
等,下面介绍几个重要的。
2. 单个键的命令
2.1 键重命名
1 | $ rename key newkey |
注意:
- 由于rename执行期间会del旧的key,所以如果对应值比较大的时候,注意redis阻塞的可能性。
- 在oldKey和newKey相同时,Redis3.2会返回OK,之前的版本会提示
key相同
的错误。
2.2 随机返回一个键
1 | $ randomkey |
2.3 键过期
1 | # 多少秒后 |
1 | # 查询键剩余过期时间(秒) |
- 清除键的过期时间
1 | $ persist key |
注意:对于字符串类型的key,
执行set命令的同时会去掉过期时间
,这个问题需要注意下。
- Redis不支持二级数据结构(哈希,列表等)内部元素的过期功能。
2.4 迁移键
Redis在发展过程中提供了move
、dump+restore
、migrate
三种迁移方式,但是使用场景不太一样。
2.4.1 move
1 | $ move key db |
move命令用于redis内部进行数据迁移,因为redis内部有多个数据库(后面会说),彼此在数据上是相互隔离的。move
就是将指定的键从源数据库
移动到目标数据库
。
注:不建议在生产中使用多数据库功能。
2.4.2 dump+restore
dump+restore
可以实现在不同redis实例之间迁移数据,功能分为两步,如下:
- dump命令将键序列化,格式采用RDB的格式。
1 | $ dump key |
- 在目标Redis上,restore命令将上述的序列化的值进行复原。
1 | $ restore key ttl serialized-value [REPLACE] |
注意点如下:
- 整个迁移过程非原子性,是通过客户端分步完成的。
- 迁移过程中开启了两个客户端连接,所以dump结果不是在
源Redis
和目标Redis
之间传输的。
1 | > 示例 |
2.4.3 migrate
migrate
实际是将dump、restore、del
三个命令进行组合,从而简化操作,且具有原子性。Redis3.0.6后支持多键迁移,有效提高了迁移效率。migrate
在后续水平扩展
中起到重要作用。
1 | $ migrate host port key| destination-db timeout [COPY] [REPLACE] [keys key[key...]] |
示例
1 | # 一个key |
3. 遍历键
Redis提供两种遍历键的方式:keys
和scan
3.1 全量遍历
1 | $ keys pattern |
如当想删除某一批键的时候,还是有很大帮助的:
1 | redis-cli keys video* | xargs redis-cli del |
但是考虑到redis时单线程的架构,执行keys很有可能会造成redis阻塞,所以一般不建议在生产使用。如果要使用,可在如下情况中使用:
- 在一个不对外提供服务的redis节点上执行,这样不会阻塞客户端的请求,但是会影响主从复制。
- 如果确认键确实很少。
- 使用scan命令,渐进式遍历。
3.2 渐进式遍历
1 | $ scan cursor [MATCH pattern] [COUNT count] |
Redis2.8之后提供scan命令可以有效的解决keys带来的问题,所以要真正实现keys的功能,需要多次scan。
Redis存储键值对实际使用的是hashtable
的数据结构,简化模型如下,所以每次scan的时间复杂度是O(1)。
除了scan
,redis还提供面向哈希,集合,有序几个的扫描命令,解决hgetall,smembers,zrange
可能产生的阻塞问题,命令分别是hscan、sscan、zscan
,用法基本和scan类似:
1 | $ hscan key cursor [MATCH pattern] [COUNT count] |
注意: scan虽然可以有效解决keys所可能产生阻塞的问题,但也并非完美,如果在scan的过程中有键的变化(增加,删除,修改等),那么遍历的时候可能不能保证遍历出所有的键:如新增的键可能没有遍历到,遍历出重复的键等等。
4. 数据库管理
Redis数据库提供了几个面向数据库的操作,分别是dbsize、select、flushdb/flushall
命令。
4.1 切换数据库
1 | $ select index |
redis默认配置中有16个数据库(配置是databases 16
),从0开始。库与库之间没有任何关联,可以存在相同的键。
1 | > 示例 |
问题?
1 | 可以将正式数据库放在0库中,测试数据放在1库中吗? |
Redis3.0已经逐渐弱化了这个功能,例如Redis分布式实现Redis Cluster只允许使用0号库。只不过为了兼容旧版本,没有完全废弃掉这个功能。不建议使用的原因如下几点:
- Redis是单线程的
- 多数据库的使用方式,会让调试和运维不同业务数据库变得很困难
- 部分Redis客户端就不支持这种方式,即使支持,在开发过程也很容易造成混乱。
建议如果需要使用多数据库的功能,完全可以在一台机器上部署多个redis实例,用端口来区分。
4.2 flushdb/flushall
两个命令用去清楚数据库。flushdb清除当前库,flushall清除所有库。
1 | $ flushdb |
这两个命令可以非常方便清理数据,但是也带来两个问题:
- 一旦执行,后果不堪设想。后面会将使用
rename-command
进行规避,或者误操作后快速恢复。 - 当数据库键数据很多的时候,存在阻塞redis的可能性。
切记谨慎使用!!!!

- hive处理增量数据 | Ice の Mimosa
- hive解决元数据乱码 | Ice の Mimosa
- Spark ALS应用与理解 | Ice の Mimosa
- JVM学习05-字节码执行过程和JVM指令集 | Ice の Mimosa
- 【转】Https前世今生 | Ice の Mimosa
- 【Lombok原理3】实现一个简单的lombok | Ice の Mimosa
- Ice の Mimosa