Redis數據結構

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]
  1. 將字符串值 value 關聯到 key
  2. 如果 key 已經持有其他值, SET 就覆寫舊值, 無視類型。
  3. 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
  1. 只在鍵 key 不存在的情況下, 將鍵 key 的值設置爲 value
  2. 若鍵 key 已經存在, 則 SETNX 命令不做任何動作。
  3. SETNX『SET if Not eXists』(如果不存在,則 SET)的簡寫。

INCR

INCR key
  1. 爲鍵 key 儲存的數字值加上一。
  2. 如果鍵 key 不存在, 那麼它的值會先被初始化爲 0 , 然後再執行 INCR 命令。
  3. 如果鍵 key 儲存的值不能被解釋爲數字, 那麼 INCR 命令將返回一個錯誤。
  4. 本操作的值限制在 64 位(bit)有符號數字表示之內。

Note

INCR 命令是一個針對字符串的操作。 因爲 Redis 並沒有專用的整數類型, 所以鍵 key 儲存的值在執行 INCR 命令時會被解釋爲十進制 64 位有符號整數。

MSET

MSET key value [key value …]
  1. 同時爲多個鍵設置值。
  2. 如果某個給定鍵已經存在, 那麼 MSET 將使用新值去覆蓋舊值, 如果這不是你所希望的效果, 請考慮使用 MSETNX 命令, 這個命令只會在所有給定鍵都不存在的情況下進行設置。
  3. MSET 是一個原子性(atomic)操作, 所有給定鍵都會在同一時間內被設置, 不會出現某些鍵被設置了但是另一些鍵沒有被設置的情況。

MSETNX

MSETNX key value [key value …]
  1. 當且僅當所有給定鍵都不存在時, 爲所有給定鍵設置值。
  2. 即使只有一個給定鍵已經存在, MSETNX 命令也會拒絕執行對所有鍵的設置操作。
  3. 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中包含很少的字段,那麼該類型的數據也將僅佔用很少的磁盤空間。

使用場景:

  1. 對於海量數據的情況,可以自己對數據進行分桶,然後使用Hash結構來存儲。對於很多value爲簡單的字符串,做過測試,採用hash存儲更節省空間。
  2. 將對象存儲爲Hash結構而不是String,可以每次只更新、獲取Hash中的一個field,這樣可以提高效率。

命令參考大全
http://redisdoc.com/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章