reids入門 Redis 資料型別及應用場景

2021-10-14 16:11:09 字數 4369 閱讀 5574

目錄

一、 redis 特點

二、 設計 redis key

三、 string資料型別的應用場景

四、hash 資料型別的應用場景

五、list 資料型別的應用場景

六、set 資料型別的應用場景

七、sorted set 資料型別的應用場景

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

分段設計法

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

把表名轉化為 key 字首

主鍵名(或其他常用於搜尋的字段)

主鍵值要儲存的字段。

eg. 使用者表(user)

idname

email1zj

[email protected]

[email protected]

set user:id:1:email [email protected];

set user:id:2:email [email protected];

1. 簡介

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

2. 資料模型

string 型別是基本的 key-value 結構,key 是某個資料在 redis 中的唯一標識,value 是具體的資料。

keyvalue

『name』

『redis』

『type』

『string』

3. 應用場景

(1) 儲存 mysql 中某個欄位的值

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

eg.

set user:id:1:email [email protected]
(2) 儲存物件

string 型別支援任何格式的字串,應用最多的就是儲存 json 或其他物件格式化的字串。(這種場景下推薦使用 hash 資料型別)

set user:id:1 '[,]'
(3) 生成自增 id

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

1. 簡介

hash 型別很像乙個關係型資料庫的資料表,hash 的 key 是乙個唯一值,value 部分是乙個 hashmap 的結構。

2. 資料模型

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

idname

type

1redis

hash

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

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

3. 應用場景

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

hmset user:1 name zj email [email protected]
1. 簡介

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

2. 資料模型

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

3. 應用場景

(1) 訊息佇列

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

因為 list 結構的資料查詢兩端附近的資料效能非常好,所以適合一些需要獲取最新資料的場景,比如新聞類應用的 「最近新聞」。

4.優化建議

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

1. 簡介

set 資料型別是乙個集合(沒有排序,不重複),可以對 set 型別的資料進行新增、刪除、判斷是否存在等操作(時間複雜度是 o(1) )

set 集合不允許資料重複,如果新增的資料在 set 中已經存在,將只保留乙份。

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

2. 資料模型

3. 應用場景

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

1. 「共同好友列表」

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

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

sadd user:wade james melo paul kobe

sadd user:james wade melo paul kobe

sadd user:paul wade james melo kobe

sadd user:melo wade james paul kobe

// 獲取 wade 和 james 的共同好友

sinter user:wade user:james

/* 輸出:

* 1) "kobe"

* 2) "paul"

* 3) "melo"

*/ // 獲取香蕉四兄弟的共同好友

sinter user:wade user:james user:paul user:melo

/* 輸出:

* 1) "kobe"

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

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

*/

1.簡介

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

2.應用場景

在集合型別的場景上加入排序就是有序集合的應用場景了。比如根據好友的「親密度」排序顯示好友列表。

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

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

// 根據「親密度」給好友排序

zrevrange user:kobe 0 -1

/** * 輸出:

* 1) "wade"

* 2) "paul"

* 3) "melo"

* 4) "james"

*/ // 增加好友的親密度

zincrby user:kobe 15 james

// 再次根據「親密度」給好友排序

zrevrange user:kobe 0 -1

/** * 輸出:

* 1) "james"

* 2) "wade"

* 3) "paul"

* 2) "melo"

*/

**:redis 資料型別及應用場景

練習:try redis

reids資料型別

今天第一次開通,寫的不好,請諒解 redis並不是簡單的key value儲存,實際上它是乙個資料結構伺服器,支援不同型別的值,也就是說,我們不僅僅把字串當作鍵所指向的值,如下這些資料型別都可以作為值型別 1 二進位制安全的字串 string 2 二進位制安全的字串列表 list of string...

redis入門資料整理

由於新的專案改版需要使用redis的一些特性,所以講redis安裝配置的資訊記錄下來,留做備份!redis的英文 對應的中午 解壓 tar zxvf redis 2.6.11.tar.gz 進入redis目錄 cd redis 2.6.11 編譯 make 伺服器啟動 src redis serve...

Redis入門學習資料

redis作為nosql的一種 我學過最容易的nosql,雖然好像也沒有特別難的nosql 在日常中還是挺常見 先放資料鏈表 慕課網的redis入門教程 評價 免費!評分高達9.63。一般的學習資料我會首推官網,但是redis除外,redis的官網的介紹,是真心一般,但慕課的這個教程個人感覺是慕課網...