Redis 資料型別及應用場景

2021-10-04 16:15:55 字數 4084 閱讀 5668

通常我們都把資料存到關係型資料庫中,但為了提公升應用的效能,我們應該把訪頻率高且不會經常變動的資料快取到記憶體中。。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"

*/

閱讀 16.9k更新於 2017-12-0

Redis資料型別及應用場景

1 redis 是一種鍵值 key value 資料庫。相對於關係型資料庫 比如 mysql redis 也被叫作非關係型資料庫。除此之外,redis 主要是作為記憶體資料庫來使用,也就是說,資料是儲存在記憶體中的。儘管它經常被用作記憶體資料庫,但是,它也支援將資料持久化到硬碟中。2 redis的每...

redis的資料型別及應用場景

redis主要有以下資料型別 string hash list set sorted set。string 這是最基本的型別,就是最普通的set及get,做簡單的key value快取。hash 這個是類似於map的一種結構,一般就是可以將結構化的資料,比如乙個物件 前提是這個物件沒有巢狀其他物件 ...

Redis的資料型別及應用場景

redis支援五種資料型別 string 字串 hash 雜湊 list 列表 set 集合 及zset sorted set 有序集合 1.string 這個型別,乙個 key 對應乙個 value string 型別是二進位制安全的。意思是 redis 的 string 可以包含任何資料。比如j...