6.Redis key键
- Redis 是一种键值(key-value)型的缓存型数据库,它将数据全部以键值对的形式存储在内存中,并且 key 与 value 一一对应。这里的 key 被形象的称之为密钥,Redis 提供了诸多操作这把“密钥”的命令,从而实现了对存储数据的管理。把 key 看成 value 的变量,通过检索 key 就可以找到对应的 value 值
6.1 key的类型
- key 的类型对应着 value 的类型,同样也有五种(string、list、hash、set、zset)。如果 key 指向的是一个字符串类型的值,那么 key 的类型就是字符串。我们可以通过
TYPE
命令来查看 key 的类型,示例如下:
#字符串
remote:0>set password "123"
OK
remote:0>type password
"string"
#hash 散列
remote:0> hmset user:1 name zs pwd 123456 age 11
OK
remote:0>type user:1
"hash"
remote:0>hset user name zhangsan
"1"
remote:0>type user
"hash"
#list列表
remote:0>lpush listcontext java
"1"
remote:0>lpush listcontext c++
"2"
remote:0>lpush listcontext python
"3"
remote:0>type listcontext
"list"
#set集合
remote:0>sadd setcontext ele1
"1"
remote:0>sadd setcontext ele2
"1"
remote:0>sadd setcontext ele3
"1"
remote:0>type setcontext
"set"
#zset有序集合
remote:0> zadd course 0 php
(integer) 1
remote:0> zadd course 1 python
(integer) 1
remote:0> zadd course 2 c++
(integer) 1
remote:0> zadd course 3 redis
(integer) 1
remote:0>type course
"zset"
6.2 key的命名规范
- key 的命名需要遵循以下规则:
- key 取值不可以太长,否则会影响 value 的查找效率,并且浪费内存空间。
- key 取值也不能过短,否则会使得 key 可读性变差。
- 在 key 的取值上, Redis 官方建议使用“见名知意”的字符串格式,因为这样便于我们理解 key 的含义。比如要现在存放一个用户的姓名,其信息如下:
- 使用一个 key 来存储用户的名字,key 的设置如下所示:
remote:0>set user:id:1:username zs
"OK"
- 该示例中自定义了
uesr:id:01:username
这个 key,通过 key 不仅可以知道用户的 id,还可以知道这个 key 是用来存储用户名字的。注意,这里的:
只是起到分割符的作用,并不是固定的语法格式。
注意:在符合业务场景情况下,key 要尽可能的简单明了,可以使用单词的缩写,或者自定义缩写格式。
- 在 Redis 中也可以将一个空字符串设置成 key,示例如下:
remote:0>set "" blankstring
"OK"
remote:0>get ""
"blankstring
- key 的类型并不局限于字符串,在 Redis 中 key 具有二进制安全的特性,这意味着它可以使用任何二进制序列,但是这种 key 过于复杂一般不建议采用。总之,“见名知意”就是 key 最佳的命名规范。对于相同数据类型而言,如果对已经存在的 key 重新设置了新的 value,那么原来的 value 就会被覆盖掉。因此,可以用这种方法来修改 key 存储的值。
6.3 key的过期时间
- Redis 允许你为 key 设置一个过期时间(使用 EXPIRE 等命令),也就是“到点自动删除”,这在实际业务中是非常有用的,一是它可以避免使用频率不高的 key 长期存在,从而占用内存资源;二是控制缓存的失效时间。
- Redis 会把每个设置了过期时间的 key 存放到一个独立的字典中,并且会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用“惰性策略”来删除过期的 key。所谓“惰性策略”指的是当客户端访问这个 key 的时候,Redis 对 key 的过期时间进行检查,如果过期了就立即删除。Redis 使用两种方式相结合的方法来处理过期的 key。
- 过期时间,有许多的应用场景,比如购物 App 会在特定的时间节点推出相关的活动等,这些活动都是一年一度如期开办,因此当下一期举行时,上一期的活动的数据就没有意义了,在这种情景下就可以给 key 设置一个过期时间,从而减少无用数据占用内存资源。
6.4 key命令格式
- key 相关的命令不区分大小写,它的语法格式如下所示:
remote:0>COMMAND KEY_NAME
COMMAND:表示 key 的命令;
KEY_NAME:表示 key 的名字。
- 例如:
DEL
代表删除命令,而456是键。如果成功删除了键,则将的返回整数 1,否则将返回整数 0。
remote:0>get 456
"789"
#删除key
remote:0>del 456
"1"
#若键不存在删除失败
remote:0>del 456
"0"
6.5 Redis键key命令
- Redis 是 key-value 型数据库,使用 key 对 value 进行存储,因此,键(Key)命令是 Redis 中经常使用的一类命令。常用的键命令如下所示:
命令 | 说明 |
DEL key | 若键存在的情况下,该命令用于删除键。 |
DUMP key | 用于序列化给定 key ,并返回被序列化的值。 |
EXISTS key | 用于检查键是否存在,若存在则返回 1,否则返回 0。 |
EXPIRE key | 设置 key 的过期时间,以秒为单位。 |
EXPIREAT key | 该命令与 EXPIRE 相似,用于为 key 设置过期时间,不同在于,它的时间参数值采用的是时间戳格式。 |
PEXPIRE key | 设置 key 的过期,以毫秒为单位。 |
PEXPIREAT key | 与 PEXPIRE 相似,用于为 key 设置过期时间,采用以毫秒为单位的时间戳格式。 |
KEYS pattern | 此命令用于查找与指定 pattern 匹配的 key。 |
MOVE key db | 将当前数据库中的 key 移动至指定的数据库中(默认存储为 0 库,可选 1-15中的任意库)。 |
PERSIST key | 该命令用于删除 key 的过期时间,然后 key 将一直存在,不会过期。 |
PTTL key | 用于检查 key 还剩多长时间过期,以毫秒为单位。 |
TTL key | 用于检查 key 还剩多长时间过期,以秒为单位。 |
RANDOMKEY | 从当前数据库中随机返回一个 key。 |
RENAME key newkey | 修改 key 的名称。 |
RENAMENX key newkey | 如果新键名不重复,则将 key 修改为 newkey。 |
SCAN cursor | 基于游标的迭代器,用于迭代数据库中存在的所有键,cursor 指的是迭代游标。 |
TYPE key | 该命令用于获取 value 的数据类型。 |
6.5.1 DEL命令
- Redis DEL 命令用于删除数据库中已经存在的一个或多个 key,如果不存在则自动忽略,DEL 命令可用版本:>= 1.0.0,DEL 命令语法格式如下:
127.0.0.1:6379> DEL key [key ...]
- 命令执行后的返回值表示被删除 key 的数量。命令演示
#在 Redis 中创建一个 key 并设置相应的 value。
remote:0>set 456 "789"
#创建成功后,查询
remote:0>get 456
"789"
#使用 DEL 命令删除这个 key。
remote:0>del 456
"1"
remote:0>del 456
"0"
6.5.2 DUMP命令
- Redis DUMP 命令用于将指定的 key 做序列化处理 ,并返回被序列化的值。该命令可用版本:>= 2.6.0。Redis DUMP 命令的基本语法如下:
127.0.0.1:6379> DUMP key
- key 存在时返回列化之后的值,否则,返回 null。命令示例
127.0.0.1:6379> set num
ok
127.0.0.1:6379> get num
"55"
127.0.0.1:6379> dump num
"\x00\xc07\n\x00Y\xd2\x8d\xee\xe6\x93\xd8\x99"
remote:0>dump pwd
null
- 注意:一些客户端无法显示dump命令结果,需要在本地服务器上运行该命令
6.5.3 EXISTS命令
- Redis EXISTS 命令用于检查指定的一个 key 或者多个 key 是否存在,该命令可用版本:>= 1.0.0。Redis EXISTS 命令的基本语法如下:
127.0.0.1:6379> EXISTS key [key ...]
- 命令的返回值代表 key 存在的数量,如果被检查的 key 都不存则返回 0。命令示例
remote:0>exists password course
"2"
remote:0>exists pwd
"0"
6.5.4 EXPIRE命令
- Redis EXPIRE 命令用于设置 key 的过期时间,以秒为单位。当 key 过期后将不能再使用,该命令可用版本:>= 1.0.0
key 过期后仍然会占用内存,Redis 提供了定时删除和惰性删除两种机制,当 key 被删除后,才真正解除内存占用。
服务器上热点数据自动过期,或者cookie在保留一段时间后自动过期
单点登录:设置过期时间
- Redis EXPIRE 命令的基本语法如下:
127.0.0.1:6379> EXPIRE key seconds
- 设置成功时返回 1,当 key 不存时则返回 0。命令演示
#设置过期时间的方法1
remote:0>set password 123456 ex 60
"1"
#设置过期时间的方法2
remote:0>expire password 60
"1"
remote:0>expire pwd 60
"0"
#60秒后,在访问该键
remote:0>get password
null
6.5.5 EXPIREAT命令
- Redis EXPIREAT 同样用于设置过期时间,与 EXPIRE 不同,它以 UNIX 时间戳格式来设置 key 的过期时间,并以毫秒为单位。该命令可用版本:>= 1.0.0。Redis EXPIREAT 命令的基本语法如下:
127.0.0.1:6379> EXPIREAT key timestamp
- 设置成功时返回 1,当 key 不存时或者不能为其设置过期时间,则返回 0。
remote:0>expireat password 时间戳
"1"
remote:0>expireat pwd 时间戳
"0"
6.5.6 KEYS命令
- Redis KEYS 命令用于查找所有符合指定模式(pattern)的 key。在线上上产环境,该命令被禁止使用,一次性查询大量的 key,会导致服务性能受到影响。 命令可用版本:>= 1.0.0。Redis KEYS 命令的基本语法如下:
127.0.0.1:6379> KEYS pattern
- 返回所有符合要求的 key。命令示例
#获取当前库中所有的 key,示例如下:
remote:0>keys *
1) ""
2) "setcontext"
3) "user:1"
4) "course"
5) "user:2"
6) "listcontext"
7) "user:id:1:username"
#查找以 user 开头的所有 key,如下所示:
remote:0>keys user*
1) "user:1"
2) "user:2"
3) "user:id:1:username"
keys k? 相似模糊查找
6.5.7 MOVE命令
- Redis MOVE 命令用于将当前数据库中的 key 移动到其他数据库中,Redis 共有 16 个数据库,默认当前数据库为 0 库。**如果当前数据中要移动的 key ,在目标数据库中存在相同的 key,那么将移动失败。**可用版本:>= 1.0.0。Redis MOVE 命令的基本语法如下:
127.0.0.1:6379> MOVE key db
- 移动成功返回 1,如果移动失败则返回 0。
#移动成功
remote:0>move user:1 1
"1"
remote:0>move course 1
"1"
#切换数据库
remote:0>select 1
"OK"
#查看1库中所有键,发现存在
remote:1>keys *
1) "user:1"
2) "course"
6.5.8 PERSIST命令
- Redis PERSIST 命令用于移除指定 key 的过期时间,这样 key 将永不过期。命令可用版本:>= 2.2.0。Redis PERSIST 命令的基本语法如下:
127.0.0.1:6379[1]> PERSIST key
- 过期时间移除成功时,则返回 1 。 如果 key 不存在或者 key 没有设置过期时间,则返回 0 。命令示例
#设置key/value与设置过期时间
remote:0>set pwd 123456 ex 120
"OK"
#查看剩余过期
remote:0>ttl pwd
"114"
#移除过期时间
remote:0>persist pwd
"1"
#结果-1表示没有设置过期时间,永远有效
remote:0>ttl pwd
"-1"
6.5.9 PEXPIRE命令
- Redis PEXPIRE 命令与 EXPIRE 命令作用类似,用于设置 key 的过期时间,以毫秒为单位。命令可用版本:>= 1.0.0。Redis PEXPIRE 命令的基本语法如下:
127.0.0.1:6379> PEXPIRE key milliseconds
- 设置成功时返回 1,当 key 不存时则返回 0。命令演示:
remote:0>set pwd 123456
"OK"
remote:0>pexpire pwd 120
"1"
6.5.10 RANDOMKEY命令
- RANDOMKEY 命令用于从当前数据库中随机返回一个 key。命令可用版本:>= 1.0.0。RANDOMKEY 命令的基本语法如下:
127.0.0.1:6379> RANDOMKEY
- 当数据库不为空时,返回一个 key;当数据库为空时返回 nil。
remote:0>randomkey
"user:id:1:username"
remote:0>select 3
"OK"
remote:3>randomkey
null
6.5.11 RENAME命令
- RENAME 命令用于修改 key 的名称。可用版本:>= 1.0.0。RENAME 命令的基本语法如下:
127.0.0.1:6379[3]> RENAME key newkey
- 修改成功是返回 OK,如果修改失败则返回一个错误,错误一般有两种情况,一是被修改的 key 不存在,二是 key 与 newkey 名字相同。命令演示
remote:3>rename pwd pwds
"ERR no such key"
remote:3>select 0
"OK"
remote:0>rename pwd pwds
"OK"
remote:0>get pwds
"123456"
6.5.12 SCAN命令
- SCAN 命令用于迭代数据库中的键。和其相似的命令有 SSCAN、HSCAN、ZSCAN,它们分别用于迭代集合、哈希散列与有序集合。
- SCAN 令可以迭代数据库中的所有键,如果想针对特定的数据类型迭代,那么命令自然也要做相应的变化。如下所示:
- SSCAN 命令用于迭代集合键中的元素。
- HSCAN 命令用于迭代哈希键中的键值对。
- ZSCAN 命令用于迭代有序集合中的元素。
- SCAN 命令是一个基于游标的迭代器,每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数,从而让迭代过程延续下,当游标返回 0 时,迭代结束。SCAN 命令可用版本:>= 2.8.0
- SCAN 命令的基本语法如下:
SCAN cursor [MATCH pattern] [COUNT count]
- 参数说明:
- cursor:游标,游标起始值一般为 0。
- pattern: 指定匹配模式。
- count:指定从数据库中返回多少个 key,默认为 10 。
- SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素的key。
#下个游标与指定返回key的数量有关,若指定返回的key数量大于数据库的key数据量,则一次可以迭代完,否则会返回下一次迭代的新游标
remote:0>scan 0
1) "0"
2) 1) "user:2"
2) "listcontext"
3) ""
4) "setcontext"
5) "pwd"
6) "user:id:1:username"
remote:0>scan 0 count 3
1) "10"
2) 1) "user:2"
2) "listcontext"
3) ""
remote:0>scan 10
1) "0"
2) 1) "setcontext"
2) "pwd"
3) "user:id:1:username"
6.5.13 TTL命令
- TTL 命令查看 Key 剩余的过期时间,以秒为单位,前提在 key 设置过期时间的情况下。可用版本:>= 1.0.0。TTL 命令的基本语法如下:
127.0.0.1:6379[1]> TTL key
- 返回 key 所剩余生存时间。若 key 不存在或者被删除时,返回 -2;若 key 存在但没有设置剩余生存时间时,表示是永久有效时,返回 -1。命令示例
#设置key/value与设置过期时间
remote:0>set name zs ex 60
"OK"
#查看剩余过期
remote:0>ttl name
"56"
#不存在这个key
remote:0>ttl pwds
"-2"
#结果-1表示没有设置过期时间,永远有效
remote:0>ttl pwd
"-1"
6.5.14 TYPE命令
- TYPE 命令用于返回 key 所储存的值的类型。可用版本:>= 1.0.0。TYPE 命令的基本语法如下:
127.0.0.1:6379[1]> TYPE key
- 返回 key 的数据类型,比如 string、list、set、hash、zset 等,若返回 none,则表明不存在该 key。命令演示:
#字符串
remote:0>set password "123"
OK
remote:0>type password
"string"
#hash 散列
remote:0> hmset user:1 name zs pwd 123456 age 11
OK
remote:0>type user:1
"hash"
remote:0>hset user name zhangsan
"1"
remote:0>type user
"hash"
#list列表
remote:0>lpush listcontext java
"1"
remote:0>lpush listcontext c++
"2"
remote:0>lpush listcontext python
"3"
remote:0>type listcontext
"list"
#set集合
remote:0>sadd setcontext ele1
"1"
remote:0>sadd setcontext ele2
"1"
remote:0>sadd setcontext ele3
"1"
remote:0>sadd setcontext ele4 ele5
"2"
remote:0>type setcontext
"set"
#zset有序集合
remote:0> zadd course 0 php
(integer) 1
remote:0> zadd course 1 python
(integer) 1
remote:0> zadd course 2 c++
(integer) 1
remote:0> zadd course 3 redis
(integer) 1
remote:0>type course
"zset"
下一篇:redis学习-11- Redis string字符串类型操作