Redis的類庫封裝設計


一、項目背景

       緩存:我們在開發中,常會遇到一個問題,就是要不要將數據放在服務器的系統緩存中。如果在服務器中存放了很多緩存數據,雖然能加快讀取數據的速度,但是這將耗費昂貴的並且是有限的服務器內存資源,從而有可能我們不得不升級服務器的配置,但是公司也不一定會同意或者願意花費這個代價。如果減少服務器的緩存數據,那么在程序需要用到這些數據時,我們將要連接數據庫去查詢這些熱點數據,加大了IO操作,這又會浪費數據庫的資源,降低了用戶體驗度。然而用戶體驗度往往是檢驗我們程序好壞的直接標准。

       響應時間:有時候用戶在進行某些操作時,服務器需要長時間的計算,用戶直接的感覺就是卡頓,甚至是卡死。可能是代碼寫的不好,也可能是業務確實復雜需要很大的計算量。花錢升級服務器確實是能緩解一下這個問題,可是我們回想一下12306火車票訂票系統,他們的服務器已經夠強大了,可是在前幾年照樣還是容易卡死,所以說升級服務器配置這個方案不是首選。

       協同作業:多線程一起工作,這些線程可能不在一個程序內,甚至不在一個服務器上,而這些線程需要共享一些數據。是將這些緩存數據放在數據庫,還是將這些數據用http方式傳輸到另外一台服務器,還是將其他系統的某些功能繼承到當前系統中,這些都是問題。

       高峰期:我們服務器在高分期時可能要處理大量的請求或者要計算大量的任務。這時服務器表現就不夠好,可是在大部分時間里面,服務器都是比較空閑的,我們真的需要為了這個短短的高分期階段去升級服務器配置或者多加服務器?

       以上幾個問題都可以用Redis來解決。Redis數據庫在軟件系統中扮演着重要的角色,特別是在分布式緩存中,Redis的名頭可是響當當的,並且他優越的性能也讓人刮目相看。

       開發中經常用到Redis,如果對每個系統都開發對Redis的封裝,既耗時耗力,又容易出錯。於是想開發一個通用的Redis操作工具包。該軟件包包含了各個系統的對Redis的常用操作。在企業中,有很多的業務系統需要開發,例如在開發.Net項目時,我們只需要引用相關dll文件就可以省去開發人員的很多工作量,也減少了后期運維成本。

       本篇主要介紹Redis在企業架構中具體能起到什么作用,能解決哪些問題,以及我們該如何設計一個通用的Redis類庫 。

二、Redis封裝設計

     關於Redis數據庫的訪問方法代碼網上有很多,一搜一大把。這里就不再貼代碼,只講設計,以下是我所做的通用Redis操作類庫設計圖:

以及代碼結構圖:

   

 

三、分布式緩存

       我們是不是在開發中遇到過這樣的一種情況,就是我們要經常查詢字典表,有些公司叫做代碼表,也就是說熱點數據。可是系統中,不僅僅代碼表是熱點數據,還有很多數據是熱點數據,可是這些數據不能全部放在緩存中,要不然內存會爆掉。所以只有犧牲性能來妥協服務器的有限的內存資源。

       Redis作為一個高性能的NoSql存儲數據庫,完美的解決了這一問題,並且可以跨進程進行數據共享。一個很簡單的例子--單點登錄(SSO),一個地方登陸,多個系統共享登陸信息。單點登錄可以解決各個系統的登錄問題,不管系統是Java、.Net(web,wpf,winform),移動端(IOS、安卓),都可以使用同一個標准的單點登錄,統一企業開發規范,這里就不多說了。以后有機會和大家分享單點登錄的設計及代碼。 

       關於Redis的代碼簡單,網上有很多。下面只提供了Redis緩存設計圖,希望對各位有用。

 

 

四、發布訂閱及消息隊列

           Redis也提供了消息隊列的功能。其中的發布訂閱,以及用List實現的消息隊列都是可以用的,如果不想用ActiveMQ、kafka、RabbitMQ等技術,可以考慮Redis。

           消息隊列可以將任務分發到多台服務器上執行,也可以將任務暫時放在隊列里面,等服務器不是那么忙的時候再處理這些任務,這樣就可以減輕高峰期時對服務器的壓力。

     

五、Redis五種數據結構

  1、String 字符串

           字符串類型是redis最基礎的數據結構。key-value 鍵值對:value可以是序列化后的數據。字符串類型可以是簡單的字符串、json字符串、xml字符串等。 

 2、Hash 哈希

           Hash:類似dictionary,通過索引快速定位到指定元素的,耗時均等,跟string的區別在於不用反序列化,直接修改某個字段。

           在存儲數據上,String的存儲方式一般有兩種:

                   a)  001:序列化整個實體 ; 

                   b)  001_name:zhangsan 、 001_pwd:123456  等多個key-value;

           而Hash的存儲方式為一個hashid-{key:value;key:value;key:value;},這樣的存儲方式可以一次性查找實體,也可以單個,還可以單個修改。

 3、List 列表

            Redis List的實現為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內存開銷。Redis內部針對List進行了很多的實現,包括發送緩沖隊列等也都是用的這個數據結構,一般是左進右出或者右進左出。因此我們可以借用List做出異步消息隊列。

 4、Set 集合

            集合類型也是用來保存多個字符串的元素,但和列表不同的是集合中不允許有重復的元素,並且集合中的元素是無序的,不能通過索引下標獲取元素,redis除了支持集合內的增刪改查,同時還支持多個集合取交集、並集、差集,並合理的使用好集合類型,能在實際開發中解決很多實際問題。

            標簽(tag)就是集合類型比較典型的使用場景。例如一個用戶對娛樂、體育比較感興趣,另一個可能對新聞感興 趣,這些興趣就是標簽,有了這些數據就可以得到同一標簽的人,以及用戶的共同愛好的標簽,這些數據對於用戶體驗以及曾強用戶粘度比較重要(用戶和標簽的關系維護應該放在一個事物內執行,防止部分命令失敗造成數據不一致)。

            我們可以思考一下共同好友在關系型數據庫該如何設計,我是想了很久,但是沒有滿意的解決方案。然而用Redis Set,卻可以很方便並且快速的完成,這就大大的降低的開發的難度,也提高了用戶體驗度。

 5、SortedSet 有序集合

            有序集合和集合有着很大的聯系,他保留了集合不能有重復成員的特性,並且在有序集合中的元素是可以排序的。但是它和列表的排序依據不同,列表使用索引下標作排序,有序集合使用元素的分值排序。(有序集合中的元素不可以重復,但是玄素的分值可以重復,就像是一個班里的同學學號不能重復,但考試成績可以相同)。

            列表、集合、有序集合三者的異同點

數據結構 是否重復 是否有序 序列實現方式 應用場景
List Y Y 索引下標 消息隊列
Set N N 標簽、共同好友
SortedSet N Y 分值 排行榜

            排行榜是有序集合經典使用場景。例如視頻網站需要對用戶上傳的視頻做排行榜,榜單維護可能是多方面:按照時間、按照播放量、按照獲得的贊數等。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM