redis最為緩存數據庫,一般用於存儲緩存數據,用於緩解數據庫壓力,但是緩存太多,內存滿了怎么辦呢。一般有以下幾種方法
一、增加內存
redis存儲於內存中,數據太多,占用太多內存,那么增加內存就是最直接的方法,但是這個方法一般不采用,因為內存滿了就加內存,滿了就加,那代價也太大,相當於用錢解決問題,不首先考慮,一般所有方面都做到最優化,才考慮此方法
二、搭建Redis集群
架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
(2)節點的fail是通過集群中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value
Redis 集群中內置了 16384 個哈希槽,當需要在 Redis 集群中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然后把結果對 16384 求余數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點
最多16384個節點,
節點間相互通信,一半以上節點ping不同一個節點,則說明此節點掛掉,從節點頂上
(1)集群中所有master參與投票,如果半數以上master節點與其中一個master節點通信超過(cluster-node-timeout),認為該master節點掛掉.
(2):什么時候整個集群不可用(cluster_state:fail)?
- 如果集群任意master掛掉,且當前master沒有slave,則集群進入fail狀態。也可以理解成集群的[0-16383]slot映射不完全時進入fail狀態。
- 如果集群超過半數以上master掛掉,無論是否有slave,集群進入fail狀態。
三、內存淘汰策略
內存淘汰策略相當於清除掉那些占用內存並且使用不太頻繁的數據,淘汰掉這些不活躍數據來清理內存
我們知道,redis設置配置文件的maxmemory參數,可以控制其最大可用內存大小(字節)。
那么當所需內存,超過maxmemory怎么辦?
這個時候就該配置文件中的maxmemory-policy出場了。
其默認值是noeviction。
下面我將列出當可用內存不足時,刪除redis鍵具有的淘汰規則。
LRU算法,least RecentlyUsed,最近最少使用算法。也就是說默認刪除最近最少使用的鍵。
但是一定要注意一點!redis中並不會准確的刪除所有鍵中最近最少使用的鍵,而是隨機抽取5個鍵,刪除這五個鍵中最近最少使用的鍵。
那么5這個數字也是可以設置的,對應位置是配置文件中的maxmeory-samples.
Redis高可用解決方案總結:
https://www.jianshu.com/p/5de2ab291696
redis redis-trib.rb工具的使用
https://www.jianshu.com/p/21f67bd739cc