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>