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
匹配hello
,hallo
和hxllo
h*llo
匹配hllo
和heeeello
h[ae]llo
匹配hello
和hallo,
但是不匹配hillo
h[^e]llo
匹配hallo
,hbllo
, … 但是不匹配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
的数据结构类型,它可以返回string
, list
, set
, zset
和 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>