作者:learner
出處:https://segmentfault.com/a/1190000038170221
說明:Redis運行環境在內存中,如果redis伺服器關閉,則內存數據將會丟失.
需求: 如何保存內存數據呢?
解決方案: 可以定期將內存數據持久化到磁碟中.
持久化策略規則:
當redis正常運行時,定期的將數據保存到磁碟中,當redis伺服器重啟時,則根據配置文件中指定的持久化的方式,實現數據的恢復.(讀取數據,之後恢復數據.)
1).RDB模式是Redis默認的策略.
2).RDB模式能夠定期(時間間隔)持久化. 弊端:可能導致數據的丟失.
3).RDB模式記錄的是內存數據的快照.持久化效率較高. 快照只保留最新的記錄.
1.save命令: 將內存數據持久化到磁碟中 主動的操作 會造成線程阻塞
2.bgsave命令: 將內存數據採用後臺運行的方式,持久化到文件中. 不會造成阻塞.
3.默認的持久化的機制
save 900 1 如果在900秒內,執行了1次更新操作,則持久化一次
save 300 10 如果在300秒內,執行了10次更新操作,則持久化一次
save 60 10000 如果在60秒內,執行了10000次更新操作,則持久化一次
1).指定持久化文件
2).指定持久化文件目錄
1).AOF模式默認條件下是關閉的.需要手動開啟
2).AOF模式記錄的是用戶的操作過程,所以可以實現實時持久化操作.
3).AOF模式由於記錄的是實時的操作過程,所以持久化文件較大.需要定期維護.
說明:如果一旦開啟AOF模式,則以AOF模式為準.
1.當內存數據允許少量丟失時,採用RDB模式 (快)
2.當內存數據不允許丟失時,採用AOF模式(定期維護持久化文件)
3.一般在工作中採用 RDB+AOF模式共同作用,保證數據的有效性.
問題: 如果小李(漂亮妹子)在公司伺服器中執行了flushAll命令,問怎麼辦?
答: 需要找到aof文件之後,刪除flushAll命令 之後重啟redis,執行save命令即可.
說明: 由於redis在內存中保存數據.如果一直存儲,則內存數據必然溢出.所以需要定期維護內存數據的大小.
維護策略: 刪除舊的不用的數據,保留新的常用的數據
LRU是Least Recently Used的縮寫, 即最近最少使用 ,是一種常用的頁面置換算法,選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問欄位,用來記錄一個頁面自上次被訪問以來所經歷的時間 t,當須淘汰一個頁面時,選擇現有頁面中其 t 值最大的,即最近最少使用的頁面予以淘汰。
計算維度: 時間T
注意事項: LRU算法是迄今為止內存中最好用的數據置換算法.
LFU(least frequently used (LFU) page-replacement algorithm)。 即最不經常使用頁置換算法 ,要求在頁置換時置換 引用計數 最小的頁,因為經常使用的頁應該有一個較大的引用次數。但是有些頁在開始時使用次數很多,但以後就不再使用,這類頁將會長時間留在內存中,因此可以將引用計數寄存器定時右移一位,形成指數衰減的平均使用次數。
維度: 使用次數
隨機算法.
根據剩餘的存活時間,將馬上要超時的數據提前刪除.
3.volatile-lfu 在設定了超時時間的數據中,採用lfu算法
4.allkeys-lfu 所有數據採用lfu算法
5.volatile-random 設置超時時間數據的隨機算法
6.allkeys-random 所有數據的隨機
7.volatile-ttl 將設定了超時時間的數據,提前刪除.
8.noeviction 默認規則 如果設定noeviction 則不刪除數據,直接報錯返回.
手動修改redis內存優化策略:
問題出發點:
由於 緩存失效 ,導致大量的用戶的請求,直接訪問資料庫伺服器.導致負載過高,從而引發整體宕機的風險!!!
說明: 用戶 頻繁訪問資料庫中不存在的數據 ,可能出現緩存穿透的現象.如果該操作是高並發操作,則可能直接威脅資料庫伺服器.
解決方案:
1.採用IP限流的方式 降低用戶訪問伺服器次數. IP動態代理(1分鐘變一次)
2.微服務的處理方式: 利用斷路器返回執行的業務數據即可不執行資料庫操作 從而保護了資料庫.
3.微服務處理方式: API網關設計. 不允許做非法操作
說明: 由於redis中 某個 熱點數據 由於超時/刪除等操作造成數據失效 .同時用戶高並發訪問該數據,則可能導致資料庫宕機.該操作稱之為 緩存擊穿.
解決方案: 可以採用多級緩存的設計. 同時數據的超時時間採用隨機數的方式.
說明: 由於redis內存 數據大量失效 .導致用戶的訪問命中率太低.大量的用戶直接訪問資料庫,可能導致資料庫伺服器宕機. 這種現象稱之為緩存雪崩.
解決:
1.採用多級緩存.
2.設定不同的超時時間
3.禁止執行 flushAll等敏感操作.
說明: 如果需要Redis存儲海量的內存數據,使用單臺redis不能滿足用戶的需求,所以可以採用Redis分片機制實現數據存儲.
注意事項:
如果有多臺redis,則其中的數據都是不一樣的…
搭建埠:6379/6380/6381
6379.conf 6380.conf 6381.conf
只修改80/81的埠即可
一致性哈希算法在1997年由麻省理工學院提出,是一種特殊的哈希算法,目的是 解決分布式緩存的問題 。
[1] 在 移除 或者 添加 一個伺服器時,能夠 儘可能小地改變 已存在的服務請求與處理請求伺服器之間的 映射關係 。一致性哈希解決了簡單哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的動態伸縮等問題 [2] 。
知識複習:
①平衡性是指hash的結果應該平均分配到各個節點,這樣從算法上解決了負載均衡問題.
實現平衡性的方案: 引入虛擬節點
②單調性是指在新增或者刪減節點時,不影響系統正常運行 [4] 。
特點:在進行數據遷移時,要求儘可能小的改變數據.
③分散性是指數據應該分散地存放在分布式集群中的各個節點(節點自己可以有備份),不必每個節點都存儲所有的數據 [4] 。
俗語: 雞蛋不要到放到一個籃子裡
說明:將AOP中的注入對象切換為分片對象
說明: redis分片主要的作用是實現內存數據的擴容.但是如果redis分片中有一個節點宕機,則直接影響所有節點的運行. 能否優化?
實現策略: 採用Redis哨兵機制實現Redis節點高可用.
1).關閉redis分片的節點,之後複製配置文件準備哨兵的配置.
2).複製分片的目錄 改名為sentinel
3).刪除多餘的持久化文件,保存redis配置文件
4).啟動3臺Redis伺服器
命令: info replication 檢查redis節點的狀態信息
節點劃分: 6379 當主機 6380/81 當從機
命令2: 實現主從掛載 slaveof host port
3).檢查6379主機的狀態
結論: redis所有節點都可以相同通信.並且路徑當前的主從的狀態.
數據主從同步的狀態
1).當哨兵啟動時,會連結redis主節點,同時獲取所有節點的狀態信息
2).當哨兵連續3次通過心跳檢測機制(PING-PONG),如果發現主機宕機,則開始選舉.
3).哨兵內部通過隨機算法篩選一臺從機當選新的主機.其他的節點應該當新主機的從.
1.啟動哨兵 redis-sentinel sentinel.conf
2).檢查哨兵配置
3)將主機宕機,之後檢查從機是否當選主機
4).啟動之前的主機,檢查是否當選新主機的從
5).如果搭建異常 則刪除重做
關閉所有redis伺服器.
作者:learner
出處:https://segmentfault.com/a/1190000038170221