Redis應(yīng)用場(chǎng)景
String--字符串
redis最能想到的就是使用序列化的字符串緩存,通常為json格式,把一些在mysql中需要大量sql查詢操作和計(jì)算得到的數(shù)據(jù)緩存起來(lái),再次訪問(wèn)的時(shí)候就可以直接讀取數(shù)據(jù)伸但,可有效降低數(shù)據(jù)庫(kù)的壓力,例如網(wǎng)站首頁(yè)的某些排名信息,查詢比較復(fù)雜消恍,但是對(duì)實(shí)時(shí)性要求沒那么高的,可以設(shè)置一個(gè)定時(shí)過(guò)期的緩存以现,這是最簡(jiǎn)單的緩存應(yīng)用場(chǎng)景狠怨,redis提供了豐富的數(shù)據(jù)結(jié)構(gòu),可以用在很多web應(yīng)用的場(chǎng)景叼风。
Hash--哈希
哈希表是redis中很有用的數(shù)據(jù)結(jié)構(gòu)取董,有時(shí)候我們需要存儲(chǔ)結(jié)構(gòu)話的數(shù)據(jù),例如用戶的登錄信息
uid:1 // 用戶uid
username:xxx // 用戶名
age:18 // 年齡
head:xxx //頭像
String模式
按照普通緩存的模式无宿,存儲(chǔ)這個(gè)結(jié)構(gòu)需要先將其序列化茵汰,轉(zhuǎn)換成json字符串,以user-uid
為鍵名孽鸡,這樣做有個(gè)問(wèn)題蹂午,假如說(shuō)現(xiàn)在需要修改head
字段栏豺,我需要經(jīng)歷如下步驟:
- 根據(jù)鍵名
user-1
獲取到json
字符串 - 解析
json
- 修改結(jié)構(gòu)體中的
head
字段 - 再次序列化成
json
-
set key
存儲(chǔ)
Hash模式
接下來(lái)使用Hash
來(lái)存儲(chǔ),使用HMSET
命令存儲(chǔ)所有字段
HMSET user-1 uid 1 username xxx age 18 head:xxx
這時(shí)候需要修改字段head
僅需一條命令即可:
HSET user-1 head zzz
相比之下是不是簡(jiǎn)單了很多豆胸,Hash模式
不僅操作大大簡(jiǎn)化奥洼,而且節(jié)省了String模式
中大量的序列化和反序列化的性能消耗。
List -- 列表
List
在redis
中的應(yīng)用也比較廣泛晚胡,最典型的就是消息隊(duì)列灵奖,在某些高并發(fā)場(chǎng)景下,由于mysql
存儲(chǔ)介質(zhì)為磁盤估盘,在寫入性能上由于磁盤的讀寫速度限制瓷患,它的寫入速度可能達(dá)不到要求。但是redis
不一樣遣妥,redis是完全基于內(nèi)存數(shù)據(jù)庫(kù)nosql
擅编,沒有I/O
瓶頸,寫入和讀取速度都非丑锊龋快爱态,這也是redis
流行的原因。假設(shè)現(xiàn)在要做一個(gè)商城的秒殺活動(dòng)境钟,在同一時(shí)刻必然會(huì)有大量的訂單提交操作锦担,mysql可能來(lái)不及寫入,會(huì)導(dǎo)致其它用戶阻塞吱韭,糟糕的情況下甚至系統(tǒng)奔潰吆豹,影響用戶體驗(yàn)。在這種場(chǎng)景下就可以通過(guò)消息隊(duì)列來(lái)處理理盆,即:
- 先把提交的訂單信息寫入消息隊(duì)列痘煤,可通過(guò)
LPUSH
和RPOP
命令實(shí)現(xiàn)入隊(duì)
和出隊(duì)
的操作。 - 通過(guò)異步程序?qū)⒂唵未鎯?chǔ)到
mysql
另一種場(chǎng)景是可作為IM
聊天系統(tǒng)的timeline
模型猿规,即每個(gè)用戶對(duì)應(yīng)一個(gè)timeline
模型衷快,根據(jù)時(shí)間順序排列,每個(gè)用戶通過(guò)timeline
獲取消息
Set -- 集合
集合和List
的類似姨俩,區(qū)別是集合是可以自動(dòng)排重的蘸拔,且集合是無(wú)序的。例如:存儲(chǔ)某個(gè)用戶的所有粉絲和所有的好友等环葵。
Sorted Set 有序集合
有序集合根據(jù)score
字段來(lái)排序调窍,通過(guò)ZADD
可添加一個(gè)有序集合,例如:
ZADD page_rank 10 google.com
上面命令的意思是在page_rank
集合中添加字符串google.com
张遭,score
為10
邓萨。
有序集合可用來(lái)數(shù)據(jù)分頁(yè),例如我們查詢用戶積分前100名的用戶,每頁(yè)20條展示缔恳,通過(guò)
ZRANGE key start stop [WITHSCORES]
命令可實(shí)現(xiàn)分頁(yè)宝剖,時(shí)間復(fù)雜度為O(log(N)+M)
,
在數(shù)據(jù)量大歉甚,查詢比較耗時(shí)万细,可大大提高web的性能。
Pub/Sub -- 發(fā)布 / 訂閱
發(fā)布訂閱模式通過(guò)發(fā)布和訂閱發(fā)送和接收消息纸泄,例如A和B訂閱(subscribe
)了頻道news.it
赖钞,這時(shí)候C向改頻道發(fā)送(publish
)一條信息hello
,這時(shí)候A和B會(huì)收到這條消息刃滓,這就是最簡(jiǎn)單的發(fā)布訂閱模式仁烹,A和B也可以訂閱別的頻道耸弄,可以接受來(lái)自不同頻道的信息咧虎,注意這里的A和B是長(zhǎng)連接,PUBSUB CHANNELS
命令可查看當(dāng)前活躍的頻道计呈。這個(gè)功能最典型應(yīng)用就是IM
系統(tǒng)砰诵,廣播等場(chǎng)景,但是redis
發(fā)布和訂閱沒有確認(rèn)的過(guò)程捌显,消息發(fā)出就沒了茁彭,不管有沒有收到,在實(shí)際場(chǎng)景中可能會(huì)選擇別的方案扶歪。