1. 程式人生 > >NoSQL資料庫Redis支援的五種資料結構及使用場景

NoSQL資料庫Redis支援的五種資料結構及使用場景

  眾所周知,Redis相比同樣作為快取伺服器的memcached而言,除了有持久化的功能外,還比著memcached有更多豐富的資料結構,今天就來講一下Redis支援的五種資料結構:String(字串)、Hash(雜湊)、List(列表)、Set(集合)、Sorted Set(有序集合)。

1、String(字串)

可以是字串,整數或者浮點數,對整個字串或者字串中的一部分執行操作,對整個整數或者浮點執行自增(increment)或者自減(decrement)操作。
基本命令:
get:獲取儲存在指定鍵中的值
set:設定儲存在指定鍵中的值
del:刪除儲存在指定鍵中的值

除了以上基本的命令,還提供以下功能,可以在具體的場景中應用:

---LEN key:獲取字串長度
---APPEND key 內容:往字串 append 內容,而且採用智慧分配記憶體(每次2倍)
---設定和獲取字串的某一段內容
---設定及獲取字串的某一位(bit)
---批量設定一系列字串的內容
---原子計數器
---GETSET 命令的妙用,請於清空舊值的同時設定一個新值,配合原子計數器使用

2、Hash(雜湊)

Redis hash 是一個string型別的field和value的對映表,hash特別適合用於儲存物件。Redis 中每個 hash 可以儲存40多億 鍵值對。

基本命令:
hset:在雜湊裡面關聯起指定的鍵值對
hget:獲取指定雜湊鍵的值
hgetall:獲取雜湊包含的所有鍵值對
hdel:如果給定鍵存在於雜湊裡面,那麼移除這個鍵

使用場景:Redis 的 Hash 結構可以使你像在資料庫中 Update 一個屬性一樣只修改某一項屬性值,常用於儲存、讀取、修改使用者屬性。

3、List(列表)

Redis列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊),一個列表最多可以包含 2^32 - 1 個元素 (4294967295, 每個列表超過40億個元素)。

基本命令:
rpush:將給定值推入列表的右端
lrange:獲取列表在指定範圍上的所有值
lindex:獲取列表在指定範圍上的單個元素
lpop:從列表的左端彈出一個值,並返回被彈出的值

使用場景:List 說白了就是連結串列(redis 使用雙端連結串列實現的 List),使用 List 結構,我們可以輕鬆地實現最新訊息排行等功能;List 的另一個應用就是訊息佇列,可以利用 List 的 *PUSH 操作,將任務存在 List 中,然後工作執行緒再用 POP 操作將任務取出進行執行。Redis 還提供了操作 List 中某一段元素的 API,你可以直接查詢,刪除 List 中某一段的元素。比如微博 TimeLine和訊息佇列。

4、Set(集合)

Redis 的 Set 是 String 型別的無序集合。集合成員是唯一的,這就意味著集合中不能出現重複的資料。可以新增,獲取,移除單個元素,檢查一個元素是否存在於集合中,計算交集,並集,差集,從集合裡面隨機獲取元素。集合中最大的成員數為 2^32 - 1 (4294967295, 每個集合可儲存40多億個成員)。

基本命令:
sadd:將給定元素新增到集合
smembers:返回集合包含的所有元素
sismember:檢查指定元素是否存在於集合中
srem:檢查指定元素是否存在於集合中,那麼移除這個元素

使用場景:Set 就是一個集合,集合的概念就是一堆不重複值的組合。利用 Redis 提供的 Set 資料結構,可以儲存一些集合性的資料。比如在微博應用中,可以將一個使用者所有的關注人存在一個集合中,將其所有粉絲存在一個集合。因為 Redis 非常人性化的為集合提供了求交集、並集、差集等操作,那麼就可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中。

---共同好友、二度好友
---利用唯一性,可以統計訪問網站的所有獨立 IP
---好友推薦的時候,根據 tag 求交集,大於某個 threshold 就可以推薦

5、Sorted Set(有序集合)

Redis 有序集合和集合一樣也是string型別元素的集合,且不允許重複的成員。不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

基本命令:
zadd:將一個帶有給定分值的成員新增到有序集合裡面
zrange:根據元素在有序排列中所處的位置,從有序集合裡面獲取多個元素
zrangebyscore:獲取有序集合在給定分值範圍內的所有元素
zrem:如果指定成員存在於有序集合中,那麼移除這個成員

使用場景:和Sets相比,Sorted Sets是將 Set 中的元素增加了一個權重引數 score,使得集合中的元素能夠按 score 進行有序排列,比如一個儲存全班同學成績的 Sorted Sets,其集合 value 可以是同學的學號,而 score 就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。另外還可以用 Sorted Sets 來做帶權重的佇列,比如普通訊息的 score 為1,重要訊息的 score 為2,然後工作執行緒可以選擇按 score 的倒序來獲取工作任務。讓重要的任務優先執行。
---帶有權重的元素,比如一個遊戲的使用者得分排行榜
---比較複雜的資料結構,一般用到的場景不算太多

注:除了以上基本的操作命令外,Redis還提供了其他很多豐富的操作命令,可以在官網(https://redis.io/commands)檢視這些命令並學習。