Redis07-键管理

235 阅读6分钟

单个键管理

参考

01-redis安装:how2j.cn/k/redis/red…

02-redis学习:<Redis开发与运维>(获取本书PDF见文章末)

1.键重命名(rename)

rename命令执行后,python的值为02,也会被覆盖为01。

127.0.0.1:6379> set java 01
OK
127.0.0.1:6379> set python 02
OK 
127.0.0.1:6379> rename java python
OK
127.0.0.1:6379> get python
"01"

为了防止被强行rename,redis提供了renamenx命令,确保只有newKey不存在才会被覆盖。结果返回为0表示,没有完成重命名。

127.0.0.1:6379> set java 01
OK
127.0.0.1:6379> set python 02
OK
127.0.0.1:6379> renamenx java python
(integer) 0

注:重命名期间,会执行del命令,删除旧的键,如果对于的值比较大, 会存在阻塞的可能。

2.随机返回一个键(randomkey)

例:当前数据库有1000个键值对,该命令会随机从中挑选一个键。

127.0.0.1:6379> dbsize
1000
127.0.0.1:6379> randomkey
"hello"
127.0.0.1:6379> randomkey
"jedis"
3.键过期

指可以自动的将带有过期时间的键删除。

> ·expire key seconds:键在seconds秒后过期。
> ·expireat key timestamp:键在秒级时间戳timestamp后过期。
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> expire hello 10
(integer) 1
# 还剩 7 秒
127.0.0.1:6379> ttl hello
(integer) 7
...
# 还剩 0 秒
127.0.0.1:6379> ttl hello
(integer) 0
# 返回结果为 -2 ,说明键 hello 已经被删除
127.0.0.1:6379> ttl hello
(integer) -2

ttl和pttl命令都可以查询键的剩余过期时间,但是pttl精度可以达到毫秒级别。

> 3种返回值类型:
> 大于等于0的整数:键剩余的过期时间(ttl是秒,pttl是毫秒)。
> -1:键没有设置过期时间。
> -2:键不存在。

设置秒级过期时间戳

127.0.0.1:6379> expireat java 1574828026000
(integer) 1
127.0.0.1:6379> ttl java
(integer) 1573253205013

注:

如果键不存在,则返回结果为0(expire)

127.0.0.1:6379> expire not_exist_key 30
(integer) 0

如果过期时间为负值,键会被立刻删除(expire)

127.0.0.1:6379> expire java -2
(integer) 1
127.0.0.1:6379> get java
(nil)

清除键的过期时间(persist)

127.0.0.1:6379> ttl java
(integer) 1573253199947
127.0.0.1:6379> persist java
(integer) 1
127.0.0.1:6379> ttl java
(integer) -1

执行set命令,也可以去掉过期时间

127.0.0.1:6379> expireat java 1574828026000
(integer) 1
127.0.0.1:6379> ttl java
(integer) 1573253199947
127.0.0.1:6379> set java 99
OK
127.0.0.1:6379> ttl java
(integer) -1
4.迁移键

开发中建议使用:migrate

(1)介绍

(1)整个过程是原子性的,只需要在源Redis上执行migrate命令即可。

(2)migrate命令传输是在源redis和目标redis上面完成的。

(3)目标redis完成后,会发送给源redis指令ok,源redis会根据migrate命令来决定是否删除对应的键。

下面对migrate的参数进行逐个说明:
·host:目标Redis的IP地址。
·port:目标Redis的端口。
·key|"":在Redis3.0.6版本之前,migrate只支持迁移一个键,所以此处是要迁移的键,但Redis3.0.6版本之后支持迁移多个键,如果当前需要迁移多个键,此处为空字符串""。
·destination-db:目标Redis的数据库索引,例如要迁移到0号数据库,这里就写0。
·timeout:迁移的超时时间(单位为毫秒)。
·[copy]:如果添加此选项,迁移后并不删除源键。
·[replace]:如果添加此选项,migrate不管目标Redis是否存在该键都会正常迁移进行数据覆盖。
·[keys key[key...]]:迁移多个键,例如要迁移key1、key2、key3,此处填写“keys key1 key2 key3”。
(2)命令
127.0.0.1:6379> migrate 127.0.0.1 6379 hello 0 1000 replace
OK

遍历键

1.全量遍历键(keys)

redis数据量较少时,可以考虑keys。

127.0.0.1:6379> keys *
1) "c"
2) "a"
3) "b"
4) "python"
5) "hello"

注:Redis是单线程的,如果redis包含了大量的key,那么执行keys会造成数据阻塞,一般不建议在生产上使用。

2.渐进式遍历(scan)

使用scan遍历所有键,可以有效防止阻塞。

127.0.0.1:6379> scan 1
1) "0"
2) 1) "c"
   2) "a"
   3) "b"

注:虽然scan可以防止阻塞,但是需要执行多次,在redis数据量较多的时候,可能会出现数据重复的情况,不能保证遍历出来的都是完整的。

数据库管理

1.切换数据库(select)

redis共有16个db,16个db中没有关联关系,可以存在重复的元素。

127.0.0.1:6379> select 1
OK

2.需求

把正式的数据放在0号数据库,测试的数据库放在1号数据库,那么两者在数据上就不会彼此受 影响了。事实真有那么好吗?

这样不好,

(1)redis是单线程的,如果使用多个数据库,那么他们还是会共用一个CPU,彼此之间还是会受到影响的。

(2)多数据库的使用方式,会让调试和运维不同业务的数据库变的困难。假如有一个慢查询存在,依然会影响其他数据库,这样会使得别的业务方定位问题非常的困难。

(3)·部分Redis的客户端根本就不支持这种方式。即使支持,在开发的时候来回切换数字形式的数据库,很容易弄乱。

建议:

(1)如果要使用多个数据库功能,完全可以在一台机器上部署多个Redis实例,彼此用端口来做区分,因为现代计算机或者服务器通常是有多个CPU的。这样既保证了业务之间不会受到影响,又合理地使用了CPU资源。

3.清空数据库(flushdb/flushall)

flushdb会清空当前数据库,而flushall会清空所有数据库。

127.0.0.1:6379> flushdb 
OK
127.0.0.1:6379> flushall 
OK

总结

(1)redis提供了5种数据结构,每种都有对应的内部编码。

(2)redis高性能的三个要素:纯内存、多线程和IO多路复用技术。

(3)由于redis是单线程的,所有需要每个命令执行的速度非常快,否则会存在redis阻塞的可能。

(4)批量操作可以提高效率,但是也要注意数量和个数。

(5)在执行一些时间复杂度比较高的命令时,需要考虑数据规模对redis的影响。

(6)persist会删除redis的过期时间,但是set也会删除,这个经常会被忽略。

(7)迁移过程中,最好使用migrate。

(8)scan可以解决keys命令带来的阻塞问题。

链接:关注公众号Elevenkeep,回复redis即可获得链接。