键重命名
rename key newkey
重命名键名“python”为“java”
127.0.0.1:6379> set python jedis
OK
127.0.0.1:6379> rename python java
OK
127.0.0.1:6379> get python
(nil)
127.0.0.1:6379> get java
"jedis"
如果原来的键存在,rename会覆盖原来的键的值
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> set c d
OK
127.0.0.1:6379> rename a c
OK
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379> get c
"b"
为了防止强行覆盖Redis提供了renamenx命令
renamenx key newkey
举例说明
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> set c d
OK
127.0.0.1:6379> renamenx a c
(integer) 0
127.0.0.1:6379> get a
"b"
127.0.0.1:6379> get c
"d"
127.0.0.1:6379> renamenx a e
(integer) 1
随机返回一个键
randomkey
随机返回键
127.0.0.1:6379> dbsize
(integer) 21
127.0.0.1:6379> randomkey
"user:ranking:2"
127.0.0.1:6379> randomkey
"java"
127.0.0.1:6379> randomkey
"user:2"
键过期
1.设置键过期
秒级:
expire key seconds
毫秒级:
pexpire key milliseconds
2.查看键的剩余过期时间
秒级别
ttl
毫秒级
pttl
- 大于等于0的整数:键剩余的过期时间(ttl是秒,pttl是毫秒)
- -1:键没有设置过期时间
- -2:键不存在。
设置键为“java”过期时间100秒
127.0.0.1:6379> expire java 100
(integer) 1
127.0.0.1:6379> pttl java
(integer) 95390
127.0.0.1:6379> ttl java
(integer) 89
3.键在时间戳timestamp后过期
秒级时间戳:
<pre>expireat key timestamp</pre>
毫秒级时间戳:
pexpireat key milliseconds-timestamp
设置键“hello”在2019-03-11 15:35:42过期(秒时间戳是1552289742,毫秒为1552289742000)
expireat hello 1552289742
4.清除键的过期时间
1) persist 命令
persist key
2) 字符串类型的key,直接set会清除key的过期时间
5.设置键值的同时添加过期时间
setex key seconds value
setex 不但是原子执行,同时减少了一次网络通讯的时间
迁移键
迁移键功能非常重要,因为有时候我们只想把部分数据由一个Redis迁移到另一个Redis(例如从生产环境迁移到测试环境),Redis发展历程中提供了move、dump+restore、migrate三组迁移键的方法,它们的实现方式以及使用的场景不太相同
1) move
move key db
move命令用于在Redis内部进行数据迁移,Redis内部可以有多个数据库,彼此数据是相互隔离的,move就是从一个数据库移动到另外一个数据库
2) dump+restore
dump key
restore key ttl value
dump+restore实现的是在不同Redis实例间进行数据迁移:
- 在源Redis实例上,dump命令会将键值序列化,格式采用的是RDB格式
- 在目标Redis上,restore命令将上面序列化的值进行复原,其中ttl为过期时间,如果ttl设置为0则代表没有过期时间
在主机1中对key的数据进行序列化,返回RDB格式的序列化value
127.0.0.1:6379> dump java
"\x00\x05jedis\t\x00b\xfc\b/\xf1'<)"
复制这个序列化的value,在主机2中restore迁移数据
127.0.0.1:6379> get java
(nil)
127.0.0.1:6379> restore java 0 "\x00\x05jedis\t\x00b\xfc\b/\xf1'<)"
OK
127.0.0.1:6379> get java
"jedis"
3) migrate
migrate host port key|"" destination-db timeout [COPY] [REPLACE] [KEYS key]
- host:目标Redis的IP地址
- port:目标Redis的端口
- key:如果单个键就写键名,如果转移多个键此处就写双引号””空字符串(Redis3.0.6版本之后支持迁移多个键)
- destination-db:目标数据库的索引,如果是0号数据库就写0
- timeout:迁移的超时时间(毫秒)
- [copy]:如果添加此选项,迁移后并不删除源键
- [replace]:如果添加此选项,migrate不管目标Redis是否存在该键都会正常迁移进行数据覆盖
- [KEYS key]:迁移多个键,例如要迁移key1、key2、key3,此处填写“keys key1 key2 key3
mingrate实现的是在不同Redis实例间进行数据迁移,实际上migrate命令就是将dump、restore、del三个命令进行组合,从而简化了操作流程。
这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等到超时。
开另一个端口为6666的Redis实例
./redis-server --port 6666 &
redis-cli -h 127.0.0.1 -p 6666
127.0.0.1:6666> keys *
(empty list or set)
6379端口实例进行migrate的copy操作
127.0.0.1:6379> migrate 127.0.0.1 6666 java 0 1000 copy
OK
127.0.0.1:6379> get java
"jedis"
6666端口实例
127.0.0.1:6666> keys *
1) "java"
6379端口实例进行migrate的默认操作(dump——restore——del)
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> migrate 127.0.0.1 6666 hello 0 1000
OK
127.0.0.1:6379> get hello
(nil)
6666端口实例
127.0.0.1:6666> keys *
1) "java"
2) "hello"
从端口6379端口实例批量迁移到6666端口实例
127.0.0.1:6379> mset Tom "It's a cat" Jerry "It's a mouse"
OK
127.0.0.1:6379> mget Tom Jerry
1) "It's a cat"
2) "It's a mouse"
127.0.0.1:6379> migrate 127.0.0.1 6666 "" 0 1000 keys Tom Jerry
OK
127.0.0.1:6379> mget Tom Jerry
1) (nil)
2) (nil)
6666端口实例
127.0.0.1:6666> keys *
1) "Tom"
2) "Jerry"
3) "java"
4) "hello"