Redis数据类型之Redis keys

Redis keys

Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。

关于key的几条规则:

  • 不要太长(不仅消耗内存,而且数据查找成本大)
  • 不要太短(语意不明 比如”u:1000:pwd”来代替”user:1000:password” 可读性变得不好了)
  • 固定模式比较好 如:”object-type:id:field”(”object-type:id:field”)多单词的字段名中加上一个点,就像这样:”comment:1234:reply.to”。

常用操作

 案例:

KEYS pattern

查找所有符合给定模式pattern(正则表达式)的 key 。

时间复杂度为O(N),N为数据库里面key的数量。

例如,Redis在一个有1百万个key的数据库里面执行一次查询需要的时间是40毫秒 。

警告KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 KEYS, 你最好还是用 Redis 的集合结构 SETS 来代替

支持的正则表达模式:

  • h?llo 匹配 hellohallo 和 hxllo
  • h*llo 匹配 hllo 和 heeeello
  • h[ae]llo 匹配 hello 和 hallo, 但是不匹配 hillo
  • h[^e]llo 匹配 hallohbllo, … 但是不匹配 hello
  • h[a-b]llo 匹配 hallo 和 hbllo

如果你想取消字符的特殊匹配(正则表达式,可以在它的前面加\

例子:

redis> MSET one 1 two 2 three 3 four 4
OK
redis> KEYS *o*
1) "four"
2) "one"
3) "two"
redis> KEYS t??
1) "two"
redis> KEYS *
1) "four"
2) "three"
3) "one"
4) "two"
redis>

EXISTS key [key ...]

时间复杂度:O(1)

返回key是否存在。

返回值:

  • 1 如果key存在
  • 0 如果key不存在

例子

redis> SET key1 "Hello"
OK
redis> EXISTS key1
(integer) 1
redis> EXISTS key2
(integer) 0
redis> 

MOVE key db

时间复杂度:O(1)

将当前数据库的 key 移动到给定的数据库 db 当中。

将当前数据库的 key 移动到给定的数据库 db 当中。

如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。

因此,也可以利用这一特性,将 MOVE 当作锁(locking)原语(primitive)。

返回值

  • 移动成功返回 1
  • 失败则返回 0

EXPIRE key seconds

时间复杂度:O(1)

设置key的过期时间,超过时间后,将会自动删除该key。在Redis的术语中一个key的相关超时是不确定的。

刷新过期时间

对已经有过期时间的key执行EXPIRE操作,将会更新它的过期时间。有很多应用有这种业务场景,例如记录会话的session。

返回值

  • 1 如果成功设置过期时间。
  • 0 如果key不存在或者不能设置过期时间。

例子

redis> SET mykey "Hello"
OK
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
redis> SET mykey "Hello World"
OK
redis> TTL mykey
(integer) -1
redis> 

TTL key

时间复杂度:O(1)

返回key剩余的过期时间。 这种反射能力允许Redis客户端检查指定key在数据集里面剩余的有效期。

从Redis2.8开始,错误返回值的结果有如下改变:

  • 如果key不存在或者已过期,返回 -2
  • 如果key存在并且没有设置过期时间(永久有效),返回 -1

返回值

key有效的秒数(TTL in seconds),或者一个负值的错误 (参考上文)。

例子

redis> SET mykey "Hello"
OK
redis> EXPIRE mykey 10 # 设置mykey 10秒后过期
(integer) 1
redis> TTL mykey # 查看mykey剩余的过期时间
(integer) 10
redis> 

TYPE key

时间复杂度:O(1)

返回key所存储的value的数据结构类型,它可以返回stringlistsetzset 和 hash等不同的类型。

返回值

返回当前key的数据类型,如果key不存在时返回none

例子

redis> SET key1 "value"
OK
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
string
redis> TYPE key2
list
redis> TYPE key3
set
redis> 

 

posted @ 2020-07-13 15:33  开心ever  阅读(1121)  评论(0编辑  收藏  举报