(1)快取資料:合理地利用redis儲存快取資料,可以有效地加快資料訪問,降低後端資料來源的壓力;
(2)計數器:合理利用incr、getset等命令以及lua指令碼,實現計數、限制訪問等功能;
(3)排行榜:合理地使用列表、有序集合,可以方便地構建排行榜系統;
(4)簽到、活躍使用者、標籤:此類業務場景可以利用bitmap資料型別,大大節省記憶體空間占用;
(5)地理定位geo:支援基於地理位置資訊而實現的業務場景,如附近位置等;
(1)以資料冷熱的角度,適合存放操作頻繁的資料,不適合存放冷資料
生產環境中,某些集群實際每秒請求量極少,甚至檢視監控圖表,間隔每小時才產生幾百次操作;又或者,生產環境中,某些集群觸發了記憶體使用率告警,經快取運維人員對該集群進行分析,發現存在大量長期未訪問的key,甚至有些idle空閒達到3個月之久;進一步分析資料,發現大量未設定過期時間的資料,或者設定過期時間過長,比如1年。
(2)以資料規模的角度,因資料是存放在記憶體中,當資料量非常龐大的時候,完全依賴快取會產生較高的經濟成本,另外集群風險會有一定公升高,運維也會變得困難,此時就要考慮更好的架構設計或資料優化方案;
基於運維經驗,建議redis單節點記憶體維持在4g以下,同時redis cluster分片規模不宜過多,一方面會帶來集群節點通訊壓力、集群故障判定及切換效率;另一方面因快取主機數量有限,過多的分片勢必會造成單台主機在乙個集群中存在過多節點,宕機場景下會擴大影響範圍,甚至極端情況造成切換失敗,產生風險;
(3)安全、一致性要求高的資料不要強依賴快取
redis和資料庫雙寫一致性問題
分析:一致性問題是分布式常見問題,還可以再分為最終一致性和強一致性。資料庫和快取雙寫,就必然會存在不一致的問題。答這個問題,先明白乙個前提。就是如果對資料有強一致性要求,不能放快取。我們所做的一切,只能保證最終一致性。另外,我們所做的方案其實從根本上來說,只能說降低不一致發生的概率,無法完全避免。因此,有強一致性要求的資料,不能放快取。
首先,採取正確更新策略,先更新資料庫(一致性還是要看資料庫),再更新快取。其次,因為可能存在更新快取失敗的問題,提供乙個補償機制即可,例如捕獲異常後利用訊息佇列再次發起redis更新,完善的監控預警也是很有幫助的。
以下場景存在快取資料丟失的可能性:
選擇關閉aof持久化的集群,由於r2m分片預設為一主一從結構(主從不在同一臺主機),極端情況下,主從同時宕機,則該分片資料丟失;
選擇開啟aof持久化的集群,為了兼顧效能和資料安全性,預設採用系統控制刷盤策略,大概每30秒鐘將增量快取資料刷到磁碟,當機器故障/突然斷電時,最近30秒鐘左右產生的資料可能會丟失;
當腦裂(網路分割槽)發生時,可能導致少數節點所在分割槽中寫入的資料後續無法再同步到多數節點所在分割槽,導致資料丟失;
主節點故障/掛掉時,因redis cluster自身節點宕機判定及新主節點擊舉機制,造成主從failover存在15秒左右的時間週期,期間客戶端重試失敗,導致資料丟失;
主節點故障/掛掉時,極少量資料還未同步到從節點,從節點進行了failover成為新的主節點,導致資料丟失;
綜上所述:集群單節點記憶體不超過4000mb、集群節點數量(主從相加)不超過150、集群單節點tps不超過40k/s,認為是乙個相對較好的狀態,因此當集群大部分情況下已經突破這個值,建議開始進行架構、資料等層面的優化,而不是無底洞使用。
快取擊穿
現在不少公司都是在使用redis中介軟體,使用的方式好多還是基於資料庫建立生成快取,如果快取不存在就是去查資料庫。沒有不更新redis,有的話更新快取。設計以資料庫為中心,貌似沒有問題。但是在盜刷,批量提交的時候就會出現問題了。
如查詢使用者登入資訊,用一些隨機生成的userid去訪問你的介面,後台大量查詢sql就會消耗io,執行緒池連線數很高,消耗計算記憶體,從而cpu持續增高,系統癱瘓。
解決方案:
(一)利用互斥鎖,快取失效的時候,先去獲得鎖,得到鎖了,再去請求資料庫。沒得到鎖,則休眠一段時間重試
(二)採用非同步更新策略,無論key是否取到值,都直接返回。value值中維護乙個快取失效時間,快取如果過期,非同步起乙個執行緒去讀資料庫,更新快取。需要做快取預熱(專案啟動前,先載入快取)操作。
(三)提供乙個能迅速判斷請求是否有效的攔截機制,比如,利用布隆過濾器,內部維護一系列合法有效的key。迅速判斷出,請求所攜帶的key是否合法有效。如果不合法,則直接返回。
快取雪崩
大面積快取失效了,請求到資料庫
目的還是錯開快取失效
(一)給快取的失效時間,加上乙個隨機值,避免集體失效。
(二)使用互斥鎖,但是該方案吞吐量明顯下降了。
(三)雙快取。我們有兩個快取,快取a和快取b。快取a的失效時間為20分鐘,快取b不設失效時間。自己做快取預熱操作。然後細分以下幾個小點
i 從快取a讀資料庫,有則直接返回
ii a沒有資料,直接從b讀資料,直接返回,並且非同步啟動乙個更新執行緒。
iii 更新執行緒同時更新快取a和快取b。
CygWin安裝RedisCluster指南
安裝前確認磁碟有6g以上的磁碟容量,安裝時雙擊setup x86 64.exe,基本按照預設設定安裝就行,也可自己指定安裝路徑等,3 deps hiredis net.c中注釋掉 並在 include sds.h 之後追加 ifdef cygwin define tcp keepcnt 8 defi...
RedisCluster搭建步驟
安裝redis 配置並啟動redis節點 選兩台機器執行該步驟 把redis安裝目錄redis.conf修改如下並複製進對應的700 資料夾 bind 10.11.147.40 redis安裝機器ip 注意這裡千萬不要用127.0.0.1或者注釋掉這行,以上兩種都會導致遠端機器連線不到redis p...
redisCluster環境準備
需要 redis3.0以上的版本 我使用了redis3.2.12 之後需要ruby環境 yum install ruby yum install rubygems 安裝redis trib.rb執行依賴的ruby的包redis 3.2.2.gem 位址為 gem install redis 3.2....