Redis 資料類型及應用情境,redis資料類型情境

來源:互聯網
上載者:User

Redis 資料類型及應用情境,redis資料類型情境

一、 redis 特點
  • 所有資料存放區在記憶體中,高速讀寫

  • 提供豐富多樣的資料類型:string、 hash、 set、 sorted set、bitmap、hyperloglog

  • 提供了 AOF 和 RDB 兩種資料的持久化儲存方式,保證了 Redis 重啟後資料不丟失

  • Redis 的所有操作都是原子性的,還支援對幾個操作合并後的原子性操作,支援事務

通常我們都把資料存到關係型資料庫中,但為了提升應用的效能,我們應該把訪頻率高且不會經常變動的資料緩衝到記憶體中。。Redis 沒有像 MySQL 這類別關係型資料庫那樣強大的查詢功能,需要考慮如何把關係型資料庫中的資料,合理的對應到緩衝的 key-value 資料結構中。

二、 設計 Redis Key

分段設計法——使用冒號把 key 中要表達的多種含義分開表示,步驟如下:

  1. 把表名轉化為 key 首碼

  2. 主鍵名(或其他常用於搜尋的欄位)

  3. 主索引值

  4. 要儲存的欄位。

eg. 使用者表(user)

id name email
1 zj 156577812@qq.com
2 ai 156577813@qq.com

這個簡單的表可能經常會有這個的需求:>根據使用者 id 查詢使用者郵箱地址,可以選擇把郵箱地址這個資料存到 redis 中:

 
  1. set user:id:1:email 156577812@qq.com;

  2. set user:id:2:email 156577812@qq.com;

三、 String資料類型的應用情境1.簡介

string 類型是 Redis 中最基本的資料類型,最常用的資料類型,甚至被很多玩家當成 redis 唯一的資料類型去使用。string 類型在 redis 中是二進位安全(binary safe)的,這意味著 string 值關心二進位的字串,不關心具體格式,你可以用它儲存 json 格式或 JPEG 圖片格式的字串。

2.資料模型

string 類型是基本的 Key-Value 結構,Key 是某個資料在 Redis 中的唯一標識,Value 是具體的資料。

Key Value
‘name’ ‘redis’
‘type’ ‘string’
3. 應用情境(1) 儲存 MySQL 中某個欄位的值

把 key 設計為 表名:主鍵名:主索引值:欄位名

eg.

 
  1. set user:id:1:email 156577812@qq.com

(2) 儲存物件

string 類型支援任何格式的字串,應用最多的就是儲存 json 或其他對象格式化的字串。(這種情境下推薦使用 hash 資料類型)

 
  1. set user:id:1 [{"id":1,"name":"zj","email":"156577812@qq.com"},{"id":1,"name":"zj","email":"156577812@qq.com"}]

(3) 產生自增 id

當 redis 的 string 類型的值為整數形式時,redis 可以把它當做是整數一樣進行自增(incr)自減(decr)操作。由於 redis 所有的操作都是原子性的,所以 不必擔心多用戶端串連時可能出現的事務問題。

四、hash 資料類型的應用情境1.簡介

hash 類型很像一個關係型資料庫的資料表,hash 的 Key 是一個唯一值,Value 部分是一個 hashmap 的結構。 

2.資料模型

假設有一張資料庫表如下:

id name type
1 redis hash

如果要用 redis 的 hash 結構儲存,資料模型如下:

hash資料類型在儲存上述類型的資料時具有比 string 類型更靈活、更快的優勢,具體的說,使用 string 類型儲存,必然需要轉換和解析 json 格式的字串,即便不需要轉換,在記憶體開銷方面,還是 hash 佔優勢。

3.應用情境

hash 類型十分適合儲存物件類資料,相對於在 string 中介紹的把對象轉化為 json 字串儲存,hash 的結構可以任意添加或刪除‘欄位名’,更加高效靈活。

 
  1. hset user:1 name zj email 156577812@qq.com

五、list 資料類型的應用情境1.簡介

list 是按照插入順序排序的字串鏈表,可以在頭部和尾部插入新的元素(雙向鏈表實現,兩端添加元素的時間複雜度為 O(1))。插入元素時,如果 key 不存在,redis 會為該 key 建立一個新的鏈表,如果鏈表中所有的元素都被移除,該 key 也會從 redis 中移除。

2.資料模型

常見操作時用 lpush 命令在 list 頭部插入元素, 用 rpop 命令在 list 尾取出資料。

3. 應用情境(1) 訊息佇列

redis 的 list 資料類型對於大部分使用者來說,是實現佇列服務的最經濟,最簡單的方式。 

(2) “最新內容”

因為 list 結構的資料查詢兩端附近的資料效能非常好,所以適合一些需要擷取最新資料的情境,比如新聞類應用的 “最近新聞”。 

4.最佳化建議

list 是鏈表結構,所有如果在頭部和尾部插入資料,效能會非常高,不受鏈表長度的影響;但如果在鏈表中插入資料,效能就會越來越差。

六、set 資料類型的應用情境1.簡介
  • set 資料類型是一個集合(沒有排序,不重複),可以對 set 類型的資料進行添加、刪除、判斷是否存在等操作(時間複雜度是 O(1) )

  • set 集合不允許資料重複,如果添加的資料在 set 中已經存在,將只保留一份。

  • set 類型提供了多個 set 之間的彙總運算,如求交集、並集、補集,這些操作在 redis 內部完成,效率很高。

2.資料模型

3.應用情境

set 類型的特點是——不重複且無序的一組資料,並且具有豐富的計算功能,在一些特定的情境中可以高效的解決一般關係型資料庫不方便做的工作。

1.“共同好友名單”

社交類應用中,擷取兩個人或多個人的共同好友,兩個人或多個人共同關注的微博這樣類似的功能,用 MySQL 的話操作很複雜,可以把每個人的好友 id 存到集合中,擷取共同好友的操作就可以簡單到一個取交集的命令就搞定。

 
  1. // 這裡為了方便閱讀,把 id 替換成姓名

  2. sadd user:wade james melo paul kobe

  3. sadd user:james wade melo paul kobe

  4. sadd user:paul wade james melo kobe

  5. sadd user:melo wade james paul kobe

  6. // 擷取 wade 和 james 的共同好友

  7. sinter user:wade user:james

  8. /* 輸出:

  9. *      1) "kobe"

  10. *      2) "paul"

  11. *      3) "melo"

  12. */

  13. // 擷取香蕉四兄弟的共同好友

  14. sinter user:wade user:james user:paul user:melo

  15. /* 輸出:

  16. *      1) "kobe"

  17. */

  18. /*

  19. 類似的需求還有很多 , 必須把每個標籤下的文章 id 存到集合中,可以很容易的求出幾個不同標籤下的共同文章;

  20. 把每個人的愛好存到集合中,可以很容易的求出幾個人的共同愛好。

  21. */

七、sorted set 資料類型的應用情境1.簡介

在 set 的基礎上給集合中每個元素關聯了一個分數,往有序集合中插入資料時會自動根據這個分數排序。

2.應用情境

在集合類型的情境上加入排序就是有序集合的應用情境了。比如根據好友的“親密度”排序顯示好友名單。

 
  1. // 用元素的分數(score)表示與好友的親密度

  2. zadd user:kobe 80 james 90 wade  85 melo  90 paul

  3. // 根據“親密度”給好友排序

  4. zrevrange user:kobe 0 -1

  5. /**

  6. * 輸出:

  7. *      1) "wade"

  8. *      2) "paul"

  9. *      3) "melo"

  10. *      4) "james"

  11. */

  12. // 增加好友的親密度

  13. zincrby user:kobe 15 james

  14. // 再次根據“親密度”給好友排序

  15. zrevrange user:kobe 0 -1

  16. /**

  17. * 輸出:

  18. *      1) "james"

  19. *      2) "wade"

  20. *      3) "paul"

  21. *      2) "melo"

  22. */

  23. //類似的需求還出現在根據文章的閱讀量或點贊量對文章列表排序



相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.