redis学习-10-redis key键操作

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字符串类型操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值