說說緩存,說說Redis


*** 大家圖片看不到的可以訪問這個地址哈(都是微信圖片封鎖的鍋),

 https://mp.weixin.qq.com/s/JaCg3sb-OqGzUI06LNJj_A
 
或者關注我的公眾號:大土豆愛開發

無論是客戶端還是服務端,緩存都是必不可少的一種提升用戶體驗的策略,大家在平時開發中,有意無意都會用到緩存,比如說 Android 開發的同學們,所有的圖片框架,基本都有用到緩存技術,服務端那就完全不用說了。

 

說說通用的緩存策略,有兩種,下面來點圖,這個是我司內部分享的圖,我盜用下

 

第一種方案,客戶端使用的比較多,緩存和 DB(或者文件)同步更新,服務端一般都是用第二種方案,現在服務端的一些框架已經比較成熟了,像 spring 的@Cachable 注解,就搞定了很多事情,客戶端的緩存相對來說簡單一些,這期重點來說說服務端的緩存應用,再確定一點,我們來說說 Redis 這個有趣的東西。

 

為什么要用Redis舉例呢,因為我認為Redis服務是緩存框架的集大成者,除了一般的內存緩存外,還可以緩存持久化,做任務隊列等。我就來說說Redis的幾種典型用法吧

 

  1. 傳統的key-value存儲,這個就不用說了吧,所有緩存框架必備的功能

  2. hash功能,在傳統kv之外,提供了一個類似hashmap的對應關系,一個key可以對應許多hashkey和value,比如存儲商品以及購買人的數量上,key為商品id,hashkey為購買人的userID,value為購買的數量

  3. list功能,和Java的List類似,push(key,List)這樣,某個key對應一個隊列,可以存儲List數據,這種用法可以用來做簡單的任務隊列,需要加數據時就push到隊列里面,然后消費者用一個1秒的定時任務,去這個隊列里面取東西(這個只是簡單的任務隊列做法,Redis還提供了一種即時的回調,監聽機制的消息隊列做法,更專業點)

  4. Set功能,和Java的Set類似,用法和上面一樣,唯一不同的就是數據是不能重復的

  5. Sorted Set,也就是zset,member/score功能,member是成員,socre是得分,這種結構通常用於排行榜,member為userID,score為得分,比如說100分,99分這樣,用這種數據結構可以根據score來自動排序

  6. 最后一點就是批量操作啦,常用的有批量和管道,批量操作可以看做是對同一個數據格式的批量操作,比如設置100key,以及對應的value,一個批量動作搞定。管道的范圍更大一些,可以看做是無數的操作放到一起執行,比如你要100個kv操作,100個hash操作,100個zset操作,都可以放到一個管道里面

     

Redis3.0之后加入了Redis Cluster的集群功能,之前的各種東西現在用起來會有點問題,腳本啊,管道啊,和單點的操作不一樣,這邊先列舉幾個我踩過的坑,希望能起到拋磚引玉的作用

1.不支持普通的管道操作,redistemplate.excutepipeline這么執行,需自己封裝管道操作類,不能支持同一個管道操作,里面有多種找錯。比如說又有kv,又又hash-kv

2.zset的一些操作也無法redistemplate直接使用,得自己封裝

3.配置集群中的某一台和配置全部機器的效果是一樣的

4.不支持任意的腳本操作,比如Java代碼調用lua腳本的操作,有可能這個腳本就沒法執行,需要考慮這個腳本在redis集群上能否執行

 

我司做了一些簡單的封裝,主要就是根據key算出是哪個slot,再根據slot算出在集群中的哪一台機器上,然后同一台機器上的操作放到一台管道操作上。

 

大家有興趣的話可以關注我的公眾號:大土豆愛開發,愛開發,愛生活,技術包括且不僅限於Android,JavaEE,Git等,已經有幾百位和你們一樣愛智求真的小伙伴了,趕緊加入吧


免責聲明!

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



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