一、談談Redis的主從複製流程html
有幾個重點:
主節點負責寫,從節點負責讀,slave node 主要用來進行橫向擴容,作讀寫分離,擴容的 slave node 能夠提升讀的吞吐量。
必須開啓 master node 的持久化,不建議用 slave node 做爲 master node 的數據熱備,由於那樣的話,若是你關掉 master 的持久化,可能在 master 宕機重啓的時候數據是空的,而後可能一通過複製, slave node 的數據也丟了。
當啓動一個 slave node 的時候,它會發送一個 PSYNC 命令給 master node。
slave node 初次鏈接到 master node,那麼會觸發一次 full resynchronization 全量複製。此時 master 會啓動一個後臺線程,開始生成一份 RDB 快照文件,同時還會將從客戶端 client 新收到的全部寫命令緩存在內存中。
斷點續傳是經過offset機制。
若是 master node 重啓或者數據出現了變化,那麼 slave node 應該根據不一樣的 run id 區分。
更詳細見:https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-master-slave.mdjava
二、Redis主從複製的斷點續傳機制是什麼?
backlog、offsetnode
三、從節點是根據主節點的IP來定位master嗎?
不是,是根據master run id來定位,由於若是更換主節點或者ip更換就不能定位了nginx
四、從節點會過時key嗎?
不會,主節點纔會,經過LRU淘汰key以後,會模擬一條del命令給從節點。git
五、主備切換高可用的Redis哨兵集羣的機制,描述一下
https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-sentinel.mdgithub
六、哨兵集羣下數據丟失問題有什麼解決方法
設置
min-slaves-to-write 1
min-slaves-max-lag 10
表示最少有一個從機,數據複製的延遲不能超過10秒。這樣就能夠減小由於異步複製數據的丟失,還有減小腦裂的數據丟失redis
七、哨兵集羣如何實現自動發現機制
經過pub/sub實現,同時往__sentinel__:hello 這個channel發送消息,同時其餘哨兵也消費這個消息,感知其餘哨兵的存在。
每隔2秒發送一次,內容有本身的host、ip、runid等。算法
八、講講slave->master選舉算法
若是master被判odown了,大部分哨兵容許主備切換,那麼須要選舉一個slave,考慮以下:
一、跟master斷開鏈接的時長;
二、slave優先級
三、複製offset的位置,複製的越多,越優先
四、若是以上都選不出來,就選runid最小的數據庫
九、redis持久化的兩種方式是什麼?api
RDB:對數據執行週期持久化
AOF:每條命令寫入日誌,append-only模式,重啓後經過回放aof日誌構建全部數據集
十、redis的RDB持久化優缺點是什麼?
rdb是多個數據文件(分時段的處理),很是適合冷備。
對redis提供對外服務的性能影響很是少,由於redis只要fork一個子進程執行磁盤io來持久化
比aof重啓更加快速,更快恢復數據
缺點是,沒有AOF那麼的更少的丟失數據,由於RDB須要5分鐘或更久持久化一次,更容易在master故障時丟失數據。
十一、若是保證Redis的高併發和高可用?
這個題目比較大。說中幾點便可。參考
https://blog.csdn.net/zero__007/article/details/86564520
十二、如何保證Redis和數據庫的雙寫一致性?
主要考查點是Cache Aside Pattern中的更新數據,先寫數據庫,再刪緩存
1三、redis 都有哪些數據類型?分別在哪些場景下使用比較合適?
過於基礎,除了對初級開發,不多會問
https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-data-types.md
1四、Redis的數據過時策略是什麼?內存淘汰機制都有哪些?
過時策略就是內存淘汰,並非定時檢查是否過時。
內存淘汰機制:
noeviction: 當內存不足以容納新寫入數據時,新寫入操做會報錯,這個通常沒人用吧,實在是太噁心了。
allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的 key(這個是最經常使用的)。
allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個 key,這個通常沒人用吧,爲啥要隨機,確定是把最近最少使用的 key 給幹掉啊。
volatile-lru:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,移除最近最少使用的 key(這個通常不太合適)。
volatile-random:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,隨機移除某個 key。
volatile-ttl:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,有更早過時時間的 key 優先移除。
1五、Redis寫的併發競爭如何解決
一、用第三方的分佈式鎖,好比用zookeeper的node實現
二、用redis的自身樂觀鎖實現(事務),即先watch、multi、set、exec事務實現。
僞代碼:
WATCH mykey val = GET mykey val = val + 1 MULTI SET mykey $val EXEC
三、紅鎖實現,具體算法見http://www.redis.cn/topics/distlock.html,用Redisson客戶端實現的主要方式:
public class DistributedRedisLock { private static Redisson redisson = RedissonManager.getRedisson(); private static final String LOCK_TITLE = "redisLock_"; public static void acquire(String lockName){ String key = LOCK_TITLE + lockName; RLock mylock = redisson.getLock(key); mylock.lock(2, TimeUnit.MINUTES); //lock提供帶timeout參數,timeout結束強制解鎖,防止死鎖 System.err.println("======lock======"+Thread.currentThread().getName()); } public static void release(String lockName){ String key = LOCK_TITLE + lockName; RLock mylock = redisson.getLock(key); mylock.unlock(); System.err.println("======unlock======"+Thread.currentThread().getName()); } }
1六、如何解決緩存雪崩和穿透
https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-caching-avalanche-and-caching-penetration.md
1七、講講Redis cluster 的高可用與主備切換原理
redis cluster 的高可用的原理,幾乎跟哨兵是相似的。
判斷節點宕機
若是一個節點認爲另一個節點宕機,那麼就是 pfail,主觀宕機。若是多個節點都認爲另一個節點宕機了,那麼就是 fail,客觀宕機,跟哨兵的原理幾乎同樣,sdown,odown。
在 cluster-node-timeout 內,某個節點一直沒有返回 pong,那麼就被認爲 pfail。
若是一個節點認爲某個節點 pfail 了,那麼會在 gossip ping 消息中,ping 給其餘節點,若是超過半數的節點都認爲 pfail 了,那麼就會變成 fail。
從節點過濾
對宕機的 master node,從其全部的 slave node 中,選擇一個切換成 master node。
檢查每一個 slave node 與 master node 斷開鏈接的時間,若是超過了 cluster-node-timeout * cluster-slave-validity-factor,那麼就沒有資格切換成 master。
從節點選舉
每一個從節點,都根據本身對 master 複製數據的 offset,來設置一個選舉時間,offset 越大(複製數據越多)的從節點,選舉時間越靠前,優先進行選舉。
全部的 master node 開始 slave 選舉投票,給要進行選舉的 slave 進行投票,若是大部分 master node(N/2 + 1)都投票給了某個從節點,那麼選舉經過,那個從節點能夠切換成 master。
從節點執行主備切換,從節點切換爲主節點。
與哨兵比較
整個流程跟哨兵相比,很是相似,因此說,redis cluster 功能強大,直接集成了 replication 和 sentinel 的功能。
1八、聊聊Redis分佈式尋址算法
首先要明白hash尋址只是負載均衡尋址算法的其中一種,就如同nginx提供4種主要算法,round-robin、ip-hash、least-connected、weighted(權重),redis主要利用hash尋址實現。
只撿重要的說,那就是一致性哈希(包含虛擬節點)和hash slot算法
一致性hash見:
https://my.oschina.net/xianggao/blog/394545?fromerr=Df6BNkP4
hash slot算法:
https://www.cnblogs.com/abc-begin/p/8203613.html
redis cluster 有固定的 16384 個 hash slot,對每一個 key 計算 CRC16 值,而後對 16384 取模,能夠獲取 key 對應的 hash slot。redis cluster 中每一個 master 都會持有部分 slot,好比有 3 個 master,那麼可能每一個 master 持有 5000 多個 hash slot。hash slot 讓 node 的增長和移除很簡單,增長一個 master,就將其餘 master 的 hash slot 移動部分過去,減小一個 master,就將它的 hash slot 移動到其餘 master 上去。移動 hash slot 的成本是很是低的。客戶端的 api,能夠對指定的數據,讓他們走同一個 hash slot,經過 hash tag 來實現。任何一臺機器宕機,另外兩個節點,不影響的。由於 key 找的是 hash slot,不是機器。