Redis:内存满了的解决方案
1,增加內存;
2,使用內存淘汰策略。(LRU)
3,Redis集群。
?
重點介紹下23;
第2點:
我們知道,redis設置配置文件的maxmemory參數,可以控制其最大可用內存大小(字節)。
那么當所需內存,超過maxmemory怎么辦?
這個時候就該配置文件中的maxmemory-policy出場了。
其默認值是noeviction。
下面我將列出當可用內存不足時,刪除redis鍵具有的淘汰規則。
?
| 規則名稱 | 規則說明 |
| volatile-lru | 使用LRU算法刪除一個鍵(只對設置了生存時間的鍵),最少使用的 |
| allkeys-lru | 使用LRU算法刪除一個鍵,最少使用的 |
| volatile-random | 隨機刪除一個鍵(只對設置了生存時間的鍵) |
| allkeys-random | 隨機刪除一個鍵 |
| volatile-ttl | 刪除生存時間最近的一個鍵 |
| noeviction | 不刪除鍵,只返回錯誤 |
LRU算法,least RecentlyUsed,最近最少使用算法。也就是說默認刪除最近最少使用的鍵。
作為內存數據庫,出于對性能和內存消耗的考慮,Redis 的淘汰算法實際實現上并非針對所有 key,而是抽樣一小部分并且從中選出被淘汰的 key。
使用 Redis 緩存數據時,為了提高緩存命中率,需要保證緩存數據都是熱點數據。可以將內存最大使用量設置為熱點數據占用的內存量,然后啟用 allkeys-lru 淘汰策略,將最近最少使用的數據淘汰。
Redis 4.0 引入了 volatile-lfu 和 allkeys-lfu 淘汰策略,LFU 策略通過統計訪問頻率,將訪問頻率最少的鍵值對淘汰。
?
但是一定要注意一點!redis中并不會準確的刪除所有鍵中最近最少使用的鍵,而是隨機抽取3個鍵,刪除這三個鍵中最近最少使用的鍵。
那么3這個數字也是可以設置的,對應位置是配置文件中的maxmeory-samples.
?第3點:
3.集群怎么做
Redis僅支持單實例,內存一般最多10~20GB。對于內存動輒100~200GB的系統,就需要通過集群來支持了。
Redis集群有三種方式:客戶端分片、代理分片、RedisCluster(在之后一篇文章詳細說一下。)
· 客戶端分片
通過業務代碼自己實現路由
優勢:可以自己控制分片算法、性能比代理的好
劣勢:維護成本高、擴容/縮容等運維操作都需要自己研發
· 代理分片(redis中間件)
代理程序接收到來自業務程序的數據請求,根據路由規則,將這些請求分發給正確的Redis實例并返回給業務程序。使用類似Twemproxy、Codis等中間件實現。
優勢:運維方便、程序不用關心如何鏈接Redis實例
劣勢:會帶來性能消耗(大概20%)、無法平滑擴容/縮容,需要執行腳本遷移數據,不方便(Codis在Twemproxy基礎上優化并實現了預分片來達到Auto Rebalance)。
·Redis Cluster
優勢:官方集群解決方案、無中心節點,和客戶端直連,性能較好
劣勢:方案太重、無法平滑擴容/縮容,需要執行相應的腳本,不方便、太新,沒有相應成熟的解決案例
總結
以上是生活随笔為你收集整理的Redis:内存满了的解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis持久化:AOF和RDB
- 下一篇: Redis集群:sharding策略