单个键管理
参考
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即可获得链接。