1、Key(键)
DEL
DEL key [key ...]:删除给定的一个或多个key。不存在的key会被忽略。
可用版本:>=1.0.0
时间复杂度:O(N),N为被删除的key数量。
- 删除单个字符串类型的key,时间复杂度为O(1)。
- 删除单个列表、集合、有序集合或哈希表类型的key,时间复杂度为O(M),M为以上数据结构内的元素数量。
返回值:被删除key的数量。
#删除单个key
127.0.0.1:6379> SET name redis
OK
127.0.0.1:6379> DEL name
(integer) 1
#删除一个不存在的key
127.0.0.1:6379> EXISTS age
(integer) 0
127.0.0.1:6379> DEL age
(integer) 0
#同时删除多个key
127.0.0.1:6379> SET name1 Python
OK
127.0.0.1:6379> SET name2 Java
OK
127.0.0.1:6379> SET name3 C++
OK
127.0.0.1:6379> DEL name1 name2 name3
(integer) 3
DUMP
DUMP key:序列化给定的key,并返回被序列化的值,使用RESTORE命令可以将这个值反序列化为Redis键。
序列化生成的值有一下几个特点:
- 它带有64位的校验和,用于检测错误,RESTORE在进行反序列化之前先检查校验和。
- 值的编码格式和RDB文件保持一致。
- RDB版本会被编码在序列化值当中,如果因Redis的版本不同造成RDB格式不兼容,那么Redis会拒绝对这个值进行反序列化操作。
序列化的值不包括任何生存的时间信息。
可用版本: >=2.6.0
时间复杂度:查找给定键的复杂度为O(1),对键进行序列化的复杂度为O(N*M),其中N是构成key的Redis对象的数量,而M则是这些对象的平均大小。
返回值:如果key不存在,返回nil。反之返回序列化之后的值。
127.0.0.1:6379> DUMP msg
"\x00\x0chello,world!\x06\x00\x13\xe5\xba\x88\xdcG\xca\xcd"
127.0.0.1:6379> DUMP hh
(nil)
EXISTS
EXISTS key:检查给定的key是否存在。
可用版本:>=1.0.0
时间复杂度:O(1)
返回值:若key存在,返回1,否则返回0。
127.0.0.1:6379> SET data zz
OK
127.0.0.1:6379> EXISTS data
(integer) 1
127.0.0.1:6379> DEL data
(integer) 1
127.0.0.1:6379> EXISTS data
(integer) 0
EXPIRE
EXPIRE key seconds:为给定key设置生存时间,当key过期时(生存时间为0),它会被自动删除。
在Redis中,带有生存时间的key被称为【易失的】(volatile)。
生存时间可以通过DEL命令来删除整个key来移除,或者被SET和GETSET命令覆写(overwrite),这意味着,如果一个命令只是修改(alter)一个带生存时间的key的值而不是用一个新的key值来代替(replace)它的话,那么生存时间不会改变。
比如说,对一个key执行INCR命令,对一个列表进行LPUSH命令,或者对一个哈希表执行HSET命令,这类操作都不会修改key本身的生存时间。
另一方面,如果使用RENAME对一个key进行改名,那么改名后的key的生存时间和改名前一样。
更新生存时间:可以对一个已经带有生存时间的key执行EXPIRE命令,新指定的生存时间会取代旧的生存时间。
过期时间的精确度:在Redis 2.1.3之前的版本中,修改一个带有生存时间的key会导致整个key被删除,这一行为是受当时复制(replication)层的限制而作出的,现在这一限制已经被修复。
可用版本:>= 1.0.0
时间复杂度:O(1)
返回值:设置成功返回1。当key不存在或者不能为key设置生存时间时(比如在低于2.1.3版本的Redis中你尝试更新key的生存时间),返回0。
127.0.0.1:6379> SET cache_page www.baidu.com
OK
127.0.0.1:6379> EXPIRE cache_page 30
(integer) 1
127.0.0.1:6379> TTL cache_page
(integer) 24
127.0.0.1:6379> EXPIRE cache_page 3000
(integer) 1
127.0.0.1:6379> TTL cache_page
(integer) 2997
模式:导航会话
假设你有一项web服务,打算根据用户最近访问的N个页面来进行物品推荐,并且假设用户停止阅览超过60秒,那么就清空阅览记录(为了减少物品推荐的计算量,并且保持推荐物的新鲜度)。
这些最近访问的页面记录,我们称之为【导航会话】(Navigation session),可以用INCR和RPUSH命令在Redis中实现它:每当用户阅览一个网页的时候,执行以下代码:
MULTI
RPUSH pagewviews.user:<userid> http://.....
EXPIRE pagewviews.user:<userid> 60
EXEC
如果用户停止阅览超过60秒,那么它的会话就会被清空,当用户重新打开阅览的时候,系统又会重新记录导航会话,继续执行物品推荐。
EXPIREAT
EXPIREAT key timestamp:EXPIREAT的作用和EXPIRE类似,都用于为key设置生存时间。不同在于EXPIREAT命令接受的时间参数是UNIX时间戳(unix timestamp)。
可以版本:>=1.2.0
时间复杂度:O(1)
返回值:如果生存时间设置成功,返回1。当key不存在或没办法设置生存时间,返回0。
127.0.0.1:6379> SET url www.souhu.com
OK
127.0.0.1:6379> EXPIREAT url 1644336000
(integer) 1
127.0.0.1:6379> TTL url
(integer) 9538
KEYS
KEYS pattern:查询所以符合给定模式pattern的key.
- KEYS *:匹配数据库中所以的key。
- KEYS h?llo:匹配hello,hallo和hxllo等。
- KEYS h*llo:匹配hllo和heeeello等。
- KEY h[ae]llo:匹配hello和hallo,但不匹配hillo。
特殊符号用\隔开
KEYS的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的key,你最好还是用Redis的集合结构(set)来代替。
可用版本:>= 1.0.0
时间复杂度:O(N),N为数据库中key的数量。
返回值:符合给定模式的key列表。
127.0.0.1:6379> MSET one 1 two 2 three 3 four 4 #批量设置4个key
OK
127.0.0.1:6379> KEYS *o*
1) "one"
2) "four"
3) "two"
127.0.0.1:6379> KEYS t??
1) "two"
127.0.0.1:6379> KEYS t[w]*
1) "two"
127.0.0.1:6379> KEYS *
1) "one"
2) "four"
3) "three"
4) "two"
MIGRATE
MIGRATE host port key destination-db timeout [COPY] [REPLACE]:将key原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功,key保证会出现再目标实例上,而当前实例上的key会被删除。
这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等到超时。
命令的内部实现是这样的:它在当前实例对给定key执行DUMP命令,将它序列化,然后传送到目标实例,目标实例在使用RESTORE命令返回ok,它就会调用DEL删除自己数据库上的key。
timeout参数以毫秒为格式,指定当前实例和目标实例进行沟通的最大间隔时间。这说明操作并不一定要在timeout毫秒内完成,只是说数据传送的时间不能超过这个timeout数。
MIGRATE命令需要在给定的的时间内完成IO操作。如果在传送数据时发生IO错误,或者达到了超时时间,那么命令会停止执行,并返回一个特殊的错误:IOERR。
当IOERR出现时,有以下两种可能:
- key可能存在于两个实例
- key可能只存在于当前实例
唯一不可能发生的情况就是丢失key,因此,如果一个客户端执行MIGRATE命令,并且不幸遇到IOERR错误,那么这个客户端唯一要做的就是检查自己数据库上的key是否已经被正确地删除。
如果有其他错误发生,那么MIGRATE保证key只会出现在当前实例中。(目标实例的给定数据库上可能有和key同名的键,不过这和MIGRATE命令没有关系)。
可选项:
- COPY:不移除源实例上的key。
- REPLACE:替换目标实例上已经存在的key。
可用版本:>= 2.6.0
时间复杂度:key数据在两个实例之间传输的复杂度为O(N)。
这个命令在源实例上世纪执行DUMP命令和DEL命令,在目标实例执行RESTORE命令,查看以上命令的文档可以看到详细的复杂度说明。
返回值:迁移成功时返回OK,否则返回相应的错误。
示例
#先启动两个Redis实例,一个使用默认的6379端口,一个使用7777端口。
$ ./redis-server &
[1] 3557
...
$ ./redis-server --port 7777 &
[2] 3560
...
#然后用客户端连上6379端口的实例,设置一个键,然后将它迁移到7777端口的实例上。
$ ./redis-cli
redis 127.0.0.1:6379> flushdb
OK
redis 127.0.0.1:6379> SET greeting "Hello from 6379 instance"
OK
redis 127.0.0.1:6379> MIGRATE 127.0.0.1 7777 greeting 0 1000
OK
redis 127.0.0.1:6379> EXISTS greeting # 迁移成功后 key 被删除
(integer) 0
#使用另一个客户端,查看7777端口上的实例。
$ ./redis-cli -p 7777
redis 127.0.0.1:7777> GET greeting
"Hello from 6379 instance"
持续更新。。。 。。。