中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Redis 數(shù)據(jù)類型及應(yīng)用場景

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

  一、 redis 特點

  • 所有數(shù)據(jù)存儲在內(nèi)存中,高速讀寫
  • 提供豐富多樣的數(shù)據(jù)類型:string、 hash、 set、 sorted set、bitmap、hyperloglog
  • 提供了 AOF 和 RDB 兩種數(shù)據(jù)的持久化保存方式,保證了 Redis 重啟后數(shù)據(jù)不丟失
  • Redis 的所有操作都是原子性的,還支持對幾個操作合并后的原子性操作,支持事務(wù)

 通常我們都把數(shù)據(jù)存到關(guān)系型數(shù)據(jù)庫中,但為了提升應(yīng)用的性能,我們應(yīng)該把訪頻率高且不會經(jīng)常變動的數(shù)據(jù)緩存到內(nèi)存中。。Redis 沒有像 MySQL 這類關(guān)系型數(shù)據(jù)庫那樣強(qiáng)大的查詢功能,需要考慮如何把關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù),合理的對應(yīng)到緩存的 key-value 數(shù)據(jù)結(jié)構(gòu)中。

  二、 設(shè)計 Redis Key

  分段設(shè)計法

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

  1. 把表名轉(zhuǎn)化為 key 前綴
  2. 主鍵名(或其他常用于搜索的字段)
  3. 主鍵值
  4. 要存儲的字段。

  eg. 用戶表(user)

id name email
1 zj [email protected]
2 ai [email protected]

  這個簡單的表可能經(jīng)常會有這個的需求:>根據(jù)用戶 id 查詢用戶郵箱地址,可以選擇把郵箱地址這個數(shù)據(jù)存到 redis 中:

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

  三、 String數(shù)據(jù)類型的應(yīng)用場景

  1. 簡介

  string 類型是 Redis 中最基本的數(shù)據(jù)類型,最常用的數(shù)據(jù)類型,甚至被很多玩家當(dāng)成 redis 唯一的數(shù)據(jù)類型去使用。string 類型在 redis 中是二進(jìn)制安全(binary safe)的,這意味著 string 值關(guān)心二進(jìn)制的字符串,不關(guān)心具體格式,你可以用它存儲 json 格式或 JPEG 圖片格式的字符串。

  2. 數(shù)據(jù)模型

  string 類型是基本的 Key-Value 結(jié)構(gòu),Key 是某個數(shù)據(jù)在 Redis 中的唯一標(biāo)識,Value 是具體的數(shù)據(jù)。

Key Value
‘name’ ‘redis’
‘type’ ‘string’

  3. 應(yīng)用場景

  (1) 存儲 MySQL 中某個字段的值

  把 key 設(shè)計為 表名:主鍵名:主鍵值:字段名

  eg.

set user:id:1:email [email protected]
  (2) 存儲對象

  string 類型支持任何格式的字符串,應(yīng)用最多的就是存儲 json 或其他對象格式化的字符串。(這種場景下推薦使用 hash 數(shù)據(jù)類型)

set user:id:1 [{"id":1,"name":"zj","email":"[email protected]"},{"id":1,"name":"zj","email":[email protected]}]
  (3) 生成自增 id

  當(dāng) redis 的 string 類型的值為整數(shù)形式時,redis 可以把它當(dāng)做是整數(shù)一樣進(jìn)行自增(incr)自減(decr)操作。由于 redis 所有的操作都是原子性的,所以不必?fù)?dān)心多客戶端連接時可能出現(xiàn)的事務(wù)問題。

  四、hash 數(shù)據(jù)類型的應(yīng)用場景

  1. 簡介

  hash 類型很像一個關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)表,hash 的 Key 是一個唯一值,Value 部分是一個 hashmap 的結(jié)構(gòu)。

  2. 數(shù)據(jù)模型

  假設(shè)有一張數(shù)據(jù)庫表如下:

id name type
1 redis hash

  如果要用 redis 的 hash 結(jié)構(gòu)存儲,數(shù)據(jù)模型如下:

  hash數(shù)據(jù)類型在存儲上述類型的數(shù)據(jù)時具有比 string 類型更靈活、更快的優(yōu)勢,具體的說,使用 string 類型存儲,必然需要轉(zhuǎn)換和解析 json 格式的字符串,即便不需要轉(zhuǎn)換,在內(nèi)存開銷方面,還是 hash 占優(yōu)勢。

  3. 應(yīng)用場景

  hash 類型十分適合存儲對象類數(shù)據(jù),相對于在 string 中介紹的把對象轉(zhuǎn)化為 json 字符串存儲,hash 的結(jié)構(gòu)可以任意添加或刪除‘字段名’,更加高效靈活。

hset user:1 name zj email [email protected]

  五、list 數(shù)據(jù)類型的應(yīng)用場景

  1. 簡介

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

  2. 數(shù)據(jù)模型

  常見操作時用 lpush 命令在 list 頭部插入元素, 用 rpop 命令在 list 尾取出數(shù)據(jù)。

  3. 應(yīng)用場景

  (1) 消息隊列

  redis 的 list 數(shù)據(jù)類型對于大部分使用者來說,是實現(xiàn)隊列服務(wù)的最經(jīng)濟(jì),最簡單的方式。

  (2) “最新內(nèi)容”

  因為 list 結(jié)構(gòu)的數(shù)據(jù)查詢兩端附近的數(shù)據(jù)性能非常好,所以適合一些需要獲取最新數(shù)據(jù)的場景,比如新聞類應(yīng)用的 “最近新聞”。

  4.優(yōu)化建議

  (1) list 是鏈表結(jié)構(gòu),所有如果在頭部和尾部插入數(shù)據(jù),性能會非常高,不受鏈表長度的影響;但如果在鏈表中插入數(shù)據(jù),性能就會越來越差。

  六、set 數(shù)據(jù)類型的應(yīng)用場景

  1. 簡介

  set 數(shù)據(jù)類型是一個集合(沒有排序,不重復(fù)),可以對 set 類型的數(shù)據(jù)進(jìn)行添加、刪除、判斷是否存在等操作(時間復(fù)雜度是 O(1) )

  set 集合不允許數(shù)據(jù)重復(fù),如果添加的數(shù)據(jù)在 set 中已經(jīng)存在,將只保留一份。

  set 類型提供了多個 set 之間的聚合運算,如求交集、并集、補(bǔ)集,這些操作在 redis 內(nèi)部完成,效率很高。

  2. 數(shù)據(jù)模型

  3. 應(yīng)用場景

  set 類型的特點是——不重復(fù)且無序的一組數(shù)據(jù),并且具有豐富的計算功能,在一些特定的場景中可以高效的解決一般關(guān)系型數(shù)據(jù)庫不方便做的工作。

  1. “共同好友列表”

  社交類應(yīng)用中,獲取兩個人或多個人的共同好友,兩個人或多個人共同關(guān)注的微博這樣類似的功能,用 MySQL 的話操作很復(fù)雜,可以把每個人的好友 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"
 */
 
 /*
     類似的需求還有很多 , 必須把每個標(biāo)簽下的文章 id 存到集合中,可以很容易的求出幾個不同標(biāo)簽下的共同文章;
 把每個人的愛好存到集合中,可以很容易的求出幾個人的共同愛好。 
 */

  七、sorted set 數(shù)據(jù)類型的應(yīng)用場景

  1.簡介

  在 set 的基礎(chǔ)上給集合中每個元素關(guān)聯(lián)了一個分?jǐn)?shù),往有序集合中插入數(shù)據(jù)時會自動根據(jù)這個分?jǐn)?shù)排序。

  2.應(yīng)用場景

  在集合類型的場景上加入排序就是有序集合的應(yīng)用場景了。比如根據(jù)好友的“親密度”排序顯示好友列表。

// 用元素的分?jǐn)?shù)(score)表示與好友的親密度
zadd user:kobe 80 james 90 wade  85 melo  90 paul

// 根據(jù)“親密度”給好友排序
zrevrange user:kobe 0 -1

/**
 * 輸出:
 *      1) "wade"
 *      2) "paul"
 *      3) "melo"
 *      4) "james"
 */
 
// 增加好友的親密度
zincrby user:kobe 15 james

// 再次根據(jù)“親密度”給好友排序
zrevrange user:kobe 0 -1

/**
 * 輸出:
 *      1) "james"
 *      2) "wade"
 *      3) "paul"
 *      2) "melo"
 */
 
 //類似的需求還出現(xiàn)在根據(jù)文章的閱讀量或點贊量對文章列表排序

標(biāo)簽: Mysql 安全 數(shù)據(jù)庫 搜索

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:記一次公司的Android分享會

下一篇:新一代數(shù)據(jù)庫技術(shù)在雙11中的黑科技