微信小程序大型系統架構中應用Redis緩存要點


        在大型分布式系統架構中,必須選擇適合的緩存技術以應對高並發,實現系統相應的高性能,酷客多小程序經過慎重選型,選擇了采用基於騰訊雲服務的Redis彈性緩存技術,結合Redis官方推薦的.NET驅動類庫Service.Stack.Redis,實現Redis彈性緩存在系統中的應用。

現針對Redis在實際應用中需注意的要點,就如下幾個方面進行總結:

一、    應用注意事項

        在企業級應用過程,任何技術的引入都需要考慮可能產生的各種影響,對於緩存應用來說,首先需要考慮的是內存的占用狀況。對於應用系統來說,內存是極其寶貴的資源,對於每一個存儲到Redis緩存中的內容,都必須嚴格控制其內容的有效性和存儲期限,具體需要注意的事項如下:

  1. 1.      跟蹤所有儲存在Redis中的鍵

        a)       使用合適的命名方法,可以簡化存儲項的管理。建議使用帶有業務意義的名稱,可以采用類似DotNet命名空間的類似命名管理方式(可使用冒號來划分鍵名,例如Product:Category 鍵名來存儲商品分類數據),這樣有助於緩存數據的數據管理及后期數據的遷移,刪除等

        b)       進行數據刪除時,需注意同時刪除掉相關聯無效的級聯數據

  1. 盡量控制鍵名的長度

        a)       采用合適命名方式的同時,要控制鍵的名稱長度,緩存數據量達到一定程度時,鍵(Key)所占用的存儲空間也會是內存的一筆較大的開銷,因此需要嚴格控制鍵的長度。

  1. 選擇合適的數據結構

        a)       可以使用list的情況下盡量用list代替set。如果你不需要使用set特性,List在使用更少內存的情況下可以提供比set更快的速度。

        b)       Sorted sets是及其昂貴的數據結構,不管是對內存的消耗還是基本操作時的開銷。如果只是需要一個存儲查詢記錄的場景,不在意排序這樣的屬性,那么建議使用哈希表結構來存儲。

二、    實際應用場景

        對於在系統中實際對於Redis的使用,結合酷客多實際使用業務,可以考慮在如下幾個場景中

  1. 1.      取最新X條數據

        a)       例如可以將 最新100條評論Id 放在Redis的List中

        b)       使用LPUSH latest.comments<ID>命令,向list集合中插入數據

        c)        插入完成后再用LTRIM latest.comments 0 100命令使其永遠只保存最近100條

  1. 2.      排行榜應用

        a)       取Top N操作  按照某個條件為權重,使用sorted set,將要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只需要執行一條ZADD命令即可。

  1. 3.      隊列系統 使用

        d)       使用list可以構建隊列,使用SortSet可構建有優先級要求的隊列

  1. 4.      數據緩存

        e)       最基本的應用,其總體性能優於Memcached,數據結構更加豐富實用

  1. 5.      需要精准設定過期時間

        a)       Sorted set的score設計成過期時間戳,通過過期時間排序定期清理數據,或根據此依據定期清理數據庫中過期數據(官網推薦的使用場景之一,感覺應用方式不太好,不推薦)

  1. 6.      Pub/Sub構建實時消息系統

        f)        Redis的Pub/Sub系統可以構建實時的消息系統,比如很多用Pub/Sub構建的實時聊天系統的例子(網上推薦,暫未用到)

三、    Redis過期策略注意

        Rdis自身的過期策略為兩種結合使用:

  1. 惰性刪除

        a)       進行 get 或setnx 時,先檢查key是否過期,若過期,則刪除key,並執行相關操作

        b)       若沒過期,直接執行相關操作

  1. 定期刪除

        定期循環 隨機查是否過期,查到后,刪除

        當進行命令操作Redis緩存的數據時,需注意操作命令對Redis中數據的的過期時間的影響,簡單概括如下:

  1. 當key被DEL命令刪除或者被SET、GETSET命令重置后與之關聯的過期時間會被清除
  2. 從概念上更新了存儲在key中的值而沒有用全新的值替換key原有值的所有操作都不會影響在該key上設置的過期時間(例如使用INCR命令增加key的值或者通過LPUSH命令在list中增加一個新的元素或者使用HSET命令更新hash字段的值 都不會清空原來的過期時間設置)
  3. 可通過PERSIST命令清除已設置的過期時間重新將key變為持久的
  4. 若key被RENAME命令重命名則與之關聯的過期時間將傳遞到新名稱的key,若key被RENAME命令重寫,比如本存在名為mykey_a和mykey_b的key一個RENAME mykey_b mykey_a命令將mykey_b重命名為本已存在的mykey_a那么無論mykey_a原來的設置如何都將繼承mykey_b的所有特性,包括過期時間設置。

        關於過期時間:

        Redis2.4中expire精度不高,通常在0到1秒間,Redis2.6以后expire精度可以控制在0到1毫秒內

 

作者:酷客多小程序 徐冰

 


免責聲明!

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



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