Redis是一個開源(BSD許可),內存存儲的數據結構服務器,可用作數據庫,高速緩存和消息隊列代理。它支持字符串、哈希表、列表、集合、有序集合,位圖,hyperloglogs等數據類型。內置複製、Lua腳本、LRU收回、事務以及不同級別磁盤持久化功能,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供自動分區。
對於String, List,Set,SortedSet,Hash等五種數據結構,可以結合Java中的對應的類來進行理解,其中String數據結構對應Object類 (任意對象都會序列化成string來存儲),List數據結構對應java.util.List接口的實現類java.util.LinkedList,Set數據結構對應java.util.Set接口,SortedSet數據結構對應java.util.SortedSet接口,Hash數據結構對應java.util.HashMap類。
String
String類型是Redis中最爲基礎的數據存儲類型,是二進制安全的字符串,該類型可以接受任何格式的數據,如JPEG圖像數據或Json對象描述信息等。在Redis中String類型的Value最多可以容納的數據長度是512M。相對於其他的幾種數據結構,只有String類型的命令在寫入key的時候可以帶有默認的過期時間,對於其他的數據結構,key默認是不過期的,如果需要設置過期時間,必須顯示調用expire函數設置過期時間。
使用場景
value較小、模型簡單的 value可以使用String類型存儲,對於一些特殊的數據結構,比如List、Set等,建議採用相應的下面介紹的List和Set數據結構進行存儲,這樣不僅可以節省存儲空間還可以提高操作效率。
常用命令
SET
SET key value [EX seconds] [PX milliseconds] [NX|XX]
- 將字符串值
value
關聯到key
。 - 如果
key
已經持有其他值,SET
就覆寫舊值, 無視類型。 - 當
SET
命令對一個帶有生存時間(TTL)的鍵進行設置之後, 該鍵原有的 TTL 將被清除。
可選參數
從 Redis 2.6.12 版本開始, SET 命令的行爲可以通過一系列參數來修改:
EX seconds
: 將鍵的過期時間設置爲seconds
秒。 執行SET key value EX seconds
的效果等同於執行SETEX key seconds value
。PX milliseconds
: 將鍵的過期時間設置爲milliseconds
毫秒。 執行SET key value PX milliseconds
的效果等同於執行PSETEX key milliseconds value
。NX
: 只在鍵不存在時, 纔對鍵進行設置操作。 執行SET key value NX
的效果等同於執行SETNX key value
。XX
: 只在鍵已經存在時, 纔對鍵進行設置操作。
SETNX
SETNX key value
- 只在鍵
key
不存在的情況下, 將鍵key
的值設置爲value
。 - 若鍵
key
已經存在, 則SETNX
命令不做任何動作。 SETNX
是『SET if Not eXists』
(如果不存在,則 SET)的簡寫。
INCR
INCR key
- 爲鍵 key 儲存的數字值加上一。
- 如果鍵 key 不存在, 那麼它的值會先被初始化爲 0 , 然後再執行 INCR 命令。
- 如果鍵 key 儲存的值不能被解釋爲數字, 那麼 INCR 命令將返回一個錯誤。
- 本操作的值限制在 64 位(bit)有符號數字表示之內。
Note
INCR 命令是一個針對字符串的操作。 因爲 Redis 並沒有專用的整數類型, 所以鍵 key 儲存的值在執行 INCR 命令時會被解釋爲十進制 64 位有符號整數。
MSET
MSET key value [key value …]
- 同時爲多個鍵設置值。
- 如果某個給定鍵已經存在, 那麼 MSET 將使用新值去覆蓋舊值, 如果這不是你所希望的效果, 請考慮使用
MSETNX
命令, 這個命令只會在所有給定鍵都不存在的情況下進行設置。 - MSET 是一個原子性(atomic)操作, 所有給定鍵都會在同一時間內被設置, 不會出現某些鍵被設置了但是另一些鍵沒有被設置的情況。
MSETNX
MSETNX key value [key value …]
- 當且僅當所有給定鍵都不存在時, 爲所有給定鍵設置值。
- 即使只有一個給定鍵已經存在, MSETNX 命令也會拒絕執行對所有鍵的設置操作。
- MSETNX 是一個原子性(atomic)操作, 所有給定鍵要麼就全部都被設置, 要麼就全部都不設置, 不可能出現第三種狀態。
其他
命令 | 語法 | 說明 | 參數 |
---|---|---|---|
SETEX | SETEX key seconds value |
將鍵 key 的值設置爲 value , 並將鍵 key 的生存時間設置爲 seconds 秒鐘。1. 如果鍵 key 已經存在, 那麼 SETEX 命令將覆蓋已有的值。2. SETEX 命令的效果和以下兩個命令的效果類似:SET key value EXPIRE key seconds# 設置生存時間 3. SETEX 和這兩個命令的不同之處在於 SETEX 是一個原子(atomic)操作, 它可以在同一時間內完成設置值和設置過期時間這兩個操作, 因此 SETEX 命令在儲存緩存的時候非常實用。 |
|
PSETEX | PSETEX key milliseconds value |
同SETEX ,用於設置毫秒 |
|
GET | GET key |
返回與鍵 key 相關聯的字符串值。1. 如果鍵 key 不存在, 那麼返回特殊值 nil ; 否則, 返回鍵 key 的值。2. 如果鍵 key 的值並非字符串類型, 那麼返回一個錯誤, 因爲 GET 命令只能用於字符串值。 | |
GETSET | GETSET key value |
將鍵 key 的值設爲 value , 並返回鍵 key 在被設置之前的舊值。 | |
STRLEN | STRLEN key |
返回鍵 key 儲存的字符串值的長度。 | |
APPEND | APPEND key value |
如果鍵 key 已經存在並且它的值是一個字符串, APPEND 命令將把 value 追加到鍵 key 現有值的末尾。如果 key 不存在, APPEND 就簡單地將鍵 key 的值設爲 value , 就像執行 SET key value 一樣。追加 value 之後, 返回鍵 key 的值的長度。 | |
INCRBY | INCRBY key increment |
爲鍵 key 儲存的數字值加上增量 increment 。 | |
DECR | DECR key |
爲鍵 key 儲存的數字值減去一。 | |
DECRBY | DECRBY key decrement |
將鍵 key 儲存的整數值減去減量 decrement 。 | |
MGET | MGET key [key …] |
返回給定的一個或多個字符串鍵的值。如果給定的字符串鍵裏面, 有某個鍵不存在, 那麼這個鍵的值將以特殊值 nil 表示。 |
List
List類型是按照插入順序排序的字符串鏈表。和數據結構中的普通鏈表一樣,可以在其頭部(left)和尾部(right)添加新的元素。在插入時,如果該鍵並不存在,Redis將爲該鍵創建一個新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那麼該鍵也將會被從數據庫中刪除。
從元素插入和刪除的效率視角來看,如果是在鏈表的兩頭插入或刪除元素,這將會是非常高效的操作,即使鏈表中已經存儲了百萬條記錄,該操作也可以在常量時間內完成。然而需要說明的是,如果元素插入或刪除操作是作用於鏈表中間,那將會是非常低效的。
使用場景
在評級系統中,比如社會化新聞網站,你可以把每個新提交的鏈接添加到一個list,用LRANGE可簡單的對結果分頁;在博客引擎實現中,你可爲每篇日誌設置一個list,在該list中推入進博客評論等等。
Set
Set類型是沒有排序的字符串集合,和List類型一樣,也可以在該類型的數據值上執行添加、刪除或判斷某一元素是否存在等操作。和List類型不同的是,Set集合中不允許出現重複的元素,如果多次添加相同元素,Set中將僅保留該元素的一份拷貝。
使用場景
可以使用Redis的Set數據類型跟蹤一些唯一性數據,比如訪問某一博客的唯一IP地址信息。對於此場景,僅需在每次訪問該博客時將訪問者的IP存入Redis中,Set數據類型會自動保證IP地址的唯一性。
SortedSet
SortedSet和Set類型極爲相似,它們都是字符串的集合,都不允許重複的成員出現在一個Set中。它們之間的主要差別是SortedSet中的每一個成員都會有一個分數(score)與之關聯,Redis正是通過分數來爲集合中的成員進行從小到大的排序。需要額外指出的是,儘管SortedSet中的成員必須是唯一的,但是分數(score)卻是可以重複的。在SortedSet中添加、刪除或更新一個成員都是非常快速的操作,其時間複雜度爲O(logn)。由於SortedSet中的成員在集合中的位置是有序的,因此,即便是訪問位於集合中部的成員也仍然是非常高效的。
使用場景:
可以用於一個大型在線遊戲的積分排行榜。每當玩家的分數發生變化時,可以執行ZADD命令更新玩家的分數,此後再通過ZRANGE命令獲取積分TOP TEN的用戶信息。當然也可以利用ZRANK命令通過username來獲取玩家的排行信息。最後將組合使用ZRANGE和ZRANK命令快速的獲取和某個玩家積分相近的其他用戶的信息。
SortedSet類型還可用於構建索引數據。
建立一個SortedSet中元素個數不要超過 1 W。
Hash
Hash類型相當於Java中的HashMap。所以該類型非常適合於存儲值對象的信息,比如User對象含有Username、Password和Age等屬性,可以使用hash來存儲User,每個field對應一個屬性,好處是可以做到部分更新、獲取。如果Hash中包含很少的字段,那麼該類型的數據也將僅佔用很少的磁盤空間。
使用場景:
- 對於海量數據的情況,可以自己對數據進行分桶,然後使用Hash結構來存儲。對於很多value爲簡單的字符串,做過測試,採用hash存儲更節省空間。
- 將對象存儲爲Hash結構而不是String,可以每次只更新、獲取Hash中的一個field,這樣可以提高效率。
命令參考大全
http://redisdoc.com/