注意:此文檔已經過期,請移步到 http://huangz.iteye.com/blog/1123512 查看最新翻譯。
進度
Redis的官方命令參考共10個部分(Keys, Strings, Hashes, Lists ...)。
計劃每3-5天更新一部分,但不保證。
歡迎任何積極性意見和反饋@huangz1990
2011.4.17 Keys部分完成
2011.4.21 Strings部分完成
2011.4.29 Hash部分完成,Redis升級到2.2.5。
KEYS部分
DEL key [key2, ...]
刪除指定的key
複雜度:
單個字符串O(1), 多個字符串(數量N)爲O(N)。
列表、集合、有序集合和哈希表(list,set,zset,hash)爲O(M),M爲以上數據結構內的key數量。
返回值:
被移除key的數量。
redis> mset name "huangz" age 20 # 一次set多個key-value OK redis> del name (integer) 1 redis> del age fake_key # fake_key不存在,只有age被刪除 (integer) 1
KEYS pattern
查找符合給定模式的key
h?llo命中hello, hallo and hxllo,等。
h*llo命中hllo和heeeeello等。
h[ae]llo命中hello和hallo,但不命中hillo。
特殊符號用"\"隔開
複雜度:
O(N),N爲數據庫中key的數量。
KEYS的速度非常快,使用一般的手提電腦可以在40毫秒內掃描100萬個key。
但在一個大的數據庫中頻繁使用KEYS命令仍然可能造成性能問題,如果你需要從一個數據集中查找特定的key,你最好還是用集合(set)結構。
返回值:
符合給定模式的key列表。
redis> mset one 1 two 2 three 3 four 4 OK redis> keys *o* 1) "four" 2) "two" 3) "one" redis> keys t?? 1) "two" redis> keys t[w]* 1) "two" redis> keys * # 匹配數據庫內所有key 1) "four" 2) "three" 3) "two" 4) "one"
RANDOMKEY
從當前數據庫中隨機返回一個key
複雜度:
O(1)
返回值:
一個key。
當數據庫爲空時,返回nil。
redis> mset fruit "apple" drink "beer" food "cookies" OK redis> randomkey "fruit" redis> randomkey "food" redis> flushdb # 刪除當前數據庫所有key OK redis> randomkey (nil)
TTL key
返回給定key的剩餘生存時間。
複雜度:
O(1)
返回值:
剩餘生存時間(以秒爲單位)。
當key不存在或過期時,返回-1 。
redis> set name "huangz" OK redis> expire name 30 # 設置過期時間爲30秒 (integer) 1 redis> get name "huangz" redis> ttl name (integer) 25 redis> get name "huangz" redis> ttl name (integer) 15 redis> ttl name # 30秒過去,name過期 (integer) -1 redis> get name (nil)
EXISTS key
檢查給定key是否存在。
複雜度:
O(1)
返回值:
若key存在,返回1。
不存在則返回0 。
redis> set db "redis" OK redis> exists db # key存在 (integer) 1 redis> del db (integer) 1 redis> exists db # key不存在 (integer) 0
MOVE key db
將當前數據庫(默認爲0)的key移動到指定的數據庫db。
如果當前數據庫(源數據庫)和指定數據庫(目標數據庫)有相同名字的指定key,或者key不存在於當前數據庫,那麼MOVE沒有任何效果。因此,也可以利用這一特性,將MOVE當作鎖(locking)。
複雜度:
O(1)
返回值:
移動成功返回1。
失敗則返回0 。
redis> SELECT 0 # redis默認使用數據庫0,爲了清晰起見,這裏再顯式指定一次。 OK redis> SET song "secret base - Zone" OK redis> MOVE song 1 # 將song移動到數據庫1 (integer) 1 redis> EXISTS song # song已經被移走 (integer) 0 redis> SELECT 1 # 使用數據庫1 OK redis:1> EXISTS song # 證實song被移到了數據庫1(注意命令操作符變成了"redis:1",表明正在使用數據庫1) (integer) 1 # 當key不存在的時候 redis:1> EXISTS fake_key (integer) 0 redis:1> MOVE fake_key 0 # 試圖從數據庫1移動一個不存在的key到數據庫0,失敗 (integer) 0 redis:1> select 0 # 使用數據庫0 OK redis> EXISTS fake_key # 證實fake_key不存在 (integer) 0 # 當源數據庫和目標數據庫有相同的key時 redis> SELECT 0 # 使用數據庫0 OK redis> SET favorite_fruit "banana" OK redis> SELECT 1 # 使用數據庫1 OK redis:1> SET favorite_fruit "apple" OK redis:1> SELECT 0 # 使用數據庫0,並試圖將favorite_fruit移動到數據庫1 OK redis> MOVE favorite_fruit 1 # 因爲兩個數據庫有相同的key,MOVE失敗 (integer) 0 redis> GET favorite_fruit # 數據庫0的favorite_fruit沒變 "banana" redis> SELECT 1 OK redis:1> GET favorite_fruit # 數據庫1的favorite_fruit也是 "apple"
redis:1> SET message "hello world" OK redis:1> RENAME message greeting OK redis:1> EXISTS message # message不復存在 (integer) 0 redis:1> EXISTS greeting # greeting取而代之 (integer) 1 # 當key不存在時,返回錯誤 redis:1> RENAME fake_key never_exists (error) ERR no such key # 當newkey已存在時,RENAME會覆蓋舊newkey redis:1> SET pc "lenovo" OK redis:1> SET personal_computer "dell" OK redis:1> RENAME pc personal_computer OK redis:1> GET pc (nil) redis:1> GET personal_computer # dell“沒有”了 "lenovo"
redis:1> SET weather "sunny" # 構建一個字符串 OK redis:1> TYPE weather string redis:1> LPUSH book_list "programming in scala" # 構建一個列表 (integer) 1 redis:1> LPUSH book_list "algorithms in C" (integer) 2 redis:1> TYPE book_list list redis:1> SADD pat "dog" # 構建一個集合 (integer) 1 redis:1> TYPE pat set
redis> SET cache_page "www.twitter.com/huangz1990" OK redis> EXPIRE cache_page 30 # 設置30秒後過期 (integer) 1 redis> TTL cache_page (integer) 24 redis> EXPIRE cache_page 30000 # 更新過期時間,30000秒 (integer) 1 redis> TTL cache_page (integer) 29996
redis> SET game "COD" # 一個字符串 OK redis> OBJECT REFCOUNT game # 只有一個引用 (integer) 1 redis> OBJECT IDLETIME game # 空轉時間 (integer) 90 redis> GET game # 提取game, 讓它處於活躍(active)狀態 "COD" redis> OBJECT IDLETIME game # 不再處於空轉 (integer) 0 redis> OBJECT ENCODING game # 字符串的編碼方式 "raw" redis> SET phone 15820123123 # 長的數字被編碼爲字符串 OK redis> OBJECT ENCODING phone "raw" redis> SET age 20 # 短數字被編碼爲int OK redis> OBJECT ENCODING age "int"
# newkey不存在,成功 redis> SET player "MPlyaer" OK redis> EXISTS best_player (integer) 0 redis> RENAMENX player best_player (integer) 1 # newkey存在時,失敗 redis> SET animal "bear" OK redis> SET favorite_animal "butterfly" OK redis> RENAMENX animal favorite_animal (integer) 0 redis> get animal "bear" redis> get favorite_animal "butterfly"
redis> SET live_man "fake person" OK redis> EXPIREAT live_man 2000000000 # unix steamp DATE: 05 / 17 / 33 @ 10:33:20pm EST (integer) 1 redis> TTL live_man (integer) 697061482
redis> SET time_to_say_goodbye "oh, please no delete me" OK redis> EXPIRE time_to_say_goodbye 300 (integer) 1 redis> TTL time_to_say_goodbye (integer) 293 redis> PERSIST time_to_say_goodbye (integer) 1 redis> TTL time_to_say_goodbye # 移除成功 (integer) -1
redis> LPUSH today_cost 30 (integer) 1 redis> LPUSH today_cost 1.5 (integer) 2 redis> LPUSH today_cost 10 (integer) 3 redis> LPUSH today_cost 8 (integer) 4 redis> SORT today_cost 1) "1.5" 2) "8" 3) "10" 4) "30"
redis> LPUSH website "www.reddit.com" (integer) 1 redis> LPUSH website "www.slashdot.com" (integer) 2 redis> LPUSH website "www.infoq.com" (integer) 3 # 默認排序 redis> SORT website 1) "www.infoq.com" 2) "www.slashdot.com" 3) "www.reddit.com" # 按字符排序 redis> SORT website ALPHA 1) "www.infoq.com" 2) "www.reddit.com" 3) "www.slashdot.com"
redis> LPUSH rank 30 (integer) 1 redis> LPUSH rank 56 (integer) 2 redis> LPUSH rank 42 (integer) 3 redis> LPUSH rank 22 (integer) 4 redis> LPUSH rank 0 (integer) 5 redis> LPUSH rank 11 (integer) 6 redis> LPUSH rank 32 (integer) 7 redis> LPUSH rank 67 (integer) 8 redis> LPUSH rank 50 (integer) 9 redis> LPUSH rank 44 (integer) 10 redis> LPUSH rank 55 (integer) 11 redis> SORT rank LIMIT 0 5 1) "0" 2) "11" 3) "22" 4) "30" 5) "32"
redis> SORT rank LIMIT 0 5 DESC 1) "78" 2) "67" 3) "56" 4) "55" 5) "50"
# admin redis> LPUSH user_id 1 (integer) 1 redis> SET user_name_1 admin OK redis> SET user_level_1 9999 OK # huangz redis> LPUSH user_id 2 (integer) 2 redis> SET user_name_2 huangz OK redis> SET user_level_2 10 OK # jack redis> LPUSH user_id 59230 (integer) 3 redis> SET user_name_59230 jack OK redis> SET user_level_59230 3 OK # hacker redis> LPUSH user_id 222 (integer) 4 redis> SET user_name_222 hacker OK redis> SET user_level_222 9999 OK
redis> SORT user_id BY user_level_* DESC 1) "222" 2) "1" 3) "2" 4) "59230"
redis> SORT user_id BY user_level_* DESC GET user_name_* 1) "hacker" 2) "admin" 3) "huangz" 4) "jack"
# 先添加一些測試數據 redis> SET user_password_222 "hey,im in" OK redis> SET user_password_1 "a_long_long_password" OK redis> SET user_password_2 "nobodyknows" OK redis> SET user_password_59230 "jack201022" OK # 獲取name和password redis> SORT user_id BY user_level_# DESC GET user_name_* GET user_password_* 1) "hacker" # 用戶名 2) "hey,im in" # 密碼 3) "jack" 4) "jack201022" 5) "huangz" 6) "nobodyknows" 7) "admin" 8) "a_long_long_password" # 注意GET操作是有序的,GET user_name_* GET user_password_* 和 GET user_password_* GET user_name_*返回的結果位置不同 redis> SORT user_id BY user_level_# DESC GET user_password_* GET user_name_* 1) "hey,im in" # 密碼 2) "hacker" # 用戶名 3) "jack201022" 4) "jack" 5) "nobodyknows" 6) "huangz" 7) "a_long_long_password" 8) "admin"
redis> SORT user_id BY user_level_* DESC GET # GET user_name_* GET user_password_* 1) "222" # id 2) "hacker" # name 3) "hey,im in" # password 4) "1" 5) "admin" 6) "a_long_long_password" 7) "2" 8) "huangz" 9) "nobodyknows" 10) "59230" 11) "jack" 12) "jack201022"
# 確保fake_key不存在 redis> EXISTS fake_key (integer) 0 # 以fake_key作BY參數,不排序,只GET name 和 GET password redis> SORT user_id BY fake_key GET # GET user_name_* GET user_password_* 1) "222" 2) "hacker" 3) "hey,im in" 4) "59230" 5) "jack" 6) "jack201022" 7) "2" 8) "huangz" 9) "nobodyknows" 10) "1" 11) "admin" 12) "a_long_long_password"
redis> EXISTS user_info_sorted_by_level # 確保指定key不存在 (integer) 0 redis> SORT user_id BY user_level_* GET # GET user_name_* GET user_password_* STORE user_info_sorted_by_level # 排序 (integer) 12 # 顯示有12條結果被保存了 redis> LRANGE user_info_sorted_by_level 0 11 # 查看排序結果 1) "59230" 2) "jack" 3) "jack201022" 4) "2" 5) "huangz" 6) "nobodyknows" 7) "222" 8) "hacker" 9) "hey,im in" 10) "1" 11) "admin" 12) "a_long_long_password"
# 假設現在我們的用戶表新增了一個serial項來爲作爲每個用戶的序列號 # 序列號以哈希表的形式保存在serial哈希域內。 redis> HMSET serial 1 23131283 2 23810573 222 502342349 59230 2435829758 OK # 我們希望以比較serial中的大小來作爲排序user_id的方式 redis> SORT user_id BY *->serial 1) "222" 2) "59230" 3) "2" 4) "1"