本文主要說明Redis的常用場景。其實(shí)知道Redis是什么是很重要,如果你的場景其實(shí)就是一個(gè)工作流,而你還是以Redis是緩存的角度去看待,明顯會(huì)出問題。希望閱讀完本文后,你能突破現(xiàn)有的業(yè)務(wù)局限,嘗試探索新的領(lǐng)域。
在此簡單介紹下
Redis介紹
Redis是基于內(nèi)存的NoSQL數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),經(jīng)常用作數(shù)據(jù)庫、緩存和消息中間件。和同樣基于內(nèi)存的組件,如Memcached不同,它能將數(shù)據(jù)持久化到硬盤,也提供一定的錯(cuò)誤恢復(fù),它還有豐富易操作的數(shù)據(jù)結(jié)構(gòu)。它具有優(yōu)秀的性能,能低延遲處理大規(guī)模的數(shù)據(jù),也足夠簡單。
我們知道,大部分NoSQL數(shù)據(jù)庫并不需要定義好的SQL模式Schema,而是使用文檔、KV或圖等存儲(chǔ)格式。而Redis與眾不同的一點(diǎn)是它有不同的數(shù)據(jù)結(jié)構(gòu)供你使用,如最常用的String/Hash/List/Set等等。如果你曾用過Memcached,這類只能以字符串存儲(chǔ)的產(chǎn)品,應(yīng)該對Redis這點(diǎn)更喜歡。這些數(shù)據(jù)結(jié)構(gòu)是高度可配置的,增加很少的代碼就能實(shí)現(xiàn)更復(fù)雜的(數(shù)據(jù)結(jié)構(gòu))功能。
常用場景
首先對常用場景做個(gè)概括:
- 統(tǒng)計(jì)數(shù)據(jù)和交互數(shù)據(jù)的緩存
- 用戶會(huì)話數(shù)據(jù)管理
- 計(jì)數(shù)、排名等實(shí)時(shí)分析
- 商品/文章推薦
- 工作流的消息隊(duì)列
緩存
緩存是Redis最知名的用法,也是入門都會(huì)遇到的典型案例。構(gòu)建一個(gè)高性能可擴(kuò)展的系統(tǒng)幾乎都會(huì)涉及緩存,就和硬盤和內(nèi)存一樣,Redis保存部分核心存儲(chǔ)的副本,以應(yīng)對最頻繁的訪問,把壓力轉(zhuǎn)移避免核心存儲(chǔ)造成性能瓶頸。具體說:
- 緩存靜態(tài)頁面等頁面內(nèi)容,這樣能減少后端Web服務(wù)器壓力;
- 緩存諸如排名,熱點(diǎn)文章等更新慢讀取頻繁的內(nèi)容;
- 緩存用戶會(huì)話信息,能提供給各應(yīng)用,SOA和微服務(wù)共享;
-
緩存API調(diào)用結(jié)果或頻繁且慢的SQL結(jié)果;
Redis緩存示意
用戶會(huì)話數(shù)據(jù)管理
大型網(wǎng)站每天有億萬的用戶訪問, 這些訪問的用戶信息和如PV,商品,點(diǎn)擊,加載時(shí)間和跳轉(zhuǎn)時(shí)間等等訪問信息都需要第一時(shí)間存儲(chǔ)下來,存儲(chǔ)到多個(gè)session里,然后后臺(tái)的各個(gè)應(yīng)用需要使用它,還可能要提供很多即時(shí)的用戶交互。之前人們會(huì)直接在Tomcat等服務(wù)器上直接維護(hù)Session,但這樣必須要考慮負(fù)載均衡的問題,要避免復(fù)雜的業(yè)務(wù)導(dǎo)致服務(wù)器宕機(jī)。而最重要的是session只能那臺(tái)服務(wù)器使用,無法共享也存在丟失無法恢復(fù)的風(fēng)險(xiǎn)?,F(xiàn)在需要一個(gè)能供所有后臺(tái)應(yīng)用或移動(dòng)應(yīng)用訪問并且高可用高吞吐低延遲的數(shù)據(jù)存儲(chǔ)。
Redis無疑都能做到,Hash的存儲(chǔ)方式無疑適合用戶ID用戶名等數(shù)據(jù),各種靈活的數(shù)據(jù)結(jié)構(gòu)能把不同的數(shù)據(jù)分門別類地存儲(chǔ)好,比如把一次會(huì)話的不同操作放入一個(gè)List里,訪問和更新都很簡單。也可以設(shè)置數(shù)據(jù)生存時(shí)間,既能控制會(huì)話超時(shí)也節(jié)省資源。

實(shí)時(shí)分析
Redis在實(shí)時(shí)分析計(jì)算方面也是異常好用,就如比賽中的裁判和計(jì)分員。以最常見的TopN計(jì)算為例,可以直接使用Redis的數(shù)據(jù)結(jié)構(gòu)Sorted Sets 自動(dòng)保存評(píng)論及進(jìn)行點(diǎn)贊排序,當(dāng)然它能支持更大的數(shù)據(jù)和更實(shí)時(shí)的場景。

用戶推薦
現(xiàn)在做的智能零售也在嘗試應(yīng)用這個(gè)場景,在互聯(lián)網(wǎng)零售和電商已經(jīng)比較普及。簡單的推薦就是有個(gè)平時(shí)和我購物習(xí)慣類似的人也買了,和我訪問類似的人也訪問了。利用Redis可以很容易地找出這些商品或文章。數(shù)據(jù)類型Set就是答案,在很多存儲(chǔ)方案里,關(guān)聯(lián)和交集是很耗資源很慢的操作,而在Redis里使用sadd + sinter操作就能從一堆set中找到它們的交集。還可以用sismember指定必需的標(biāo)簽或商品,或用smemers或sscan擴(kuò)展交集,提供出“相似還**”的功能效果

工作流的消息隊(duì)列
使用Redis作為消息隊(duì)列是很常見的用法。許多涉及工作流、工作環(huán)的系統(tǒng)都會(huì)使用到Redis,使用它的List類型。 比如一個(gè)交易訂單可以放入隊(duì)列由人工審核或算法自動(dòng)審核,超時(shí)時(shí)自動(dòng)出列,后續(xù)轉(zhuǎn)入發(fā)送交易成功或失敗的隊(duì)列。還可以同時(shí)做遠(yuǎn)程監(jiān)控。在Redis中List是有序的字符串集合,lpush可以從左邊加入一個(gè)字符串,作為棧的開始。 And RPUSH will add the value to the ‘right’ end
of the list, usually referred to as the end or bottom of the List. RPOP will remove the last element of the list, while LPOP will
remove the first element. RPOPLPUSH, as fun as it sounds, is an efficient way to ‘pop’ an element from the right end of one
List and ‘push’ it to the left end of another List.

參考翻譯Redis白皮書《Popular Redis Uses for Beginners》
