把數據存儲在內存,極高的效率提供讀寫功能。配合sentinel實現主從,或者集羣實現大數據和流量下的分佈。redis
string list hash set zset算法
惰性刪除:查詢的時候發現過時,執行del,而後返回null。對內存不友好 按期刪除:後臺線程任務按期去刪除過時key。對cpu不友好。 redis是採用惰性刪除+按期刪除,保證了內存和cpu的性能。數據庫
RDB 生產RDB文件:對內存中的數據進行持久化 載入RDB文件:對未過時的數據恢復到內存中 save 會阻斷用戶操做。 bgsave不會阻斷用戶操做。 自動持久化能夠配置時間,好比900秒,1次操做的時候進行、300秒60次操做的時候執行、60秒200次操做的時候執行。緩存
AOF 生產AOF文件:保存執行命令到AOF文件中。當過時key被惰性刪除或者按期刪除後,寫入del key命令。 載入AOF文件:從新一條條執行AOF文件中的命令。 複寫AOF文件:隨着時間延長,AOF會愈來愈大,因此須要從新生成AOF文件。這種生成方式是經過讀取內存中的數據,未過時的數據生成命令存在AOF中。服務器
對於主從模式,持久化數據恢復到內存中的時候,主會只會恢復未過時數據,從全部數據都會進行恢復,從沒有惰性刪除和按期刪除,只會等待主來同步數據。網絡
訂閱key的操做 訂閱某個操做的key併發
127.0.0.1 123 > slaveof 127.0.0.1 456 123成爲456的從 全量同步:從向主發送SYNC,主生產RDB,同步給從,同時期間緩衝期產生的命令也同步給從。分佈式
部分同步:從斷線重連,向主發送PSYNC,主把斷線後的命令發給從。複製偏移量高併發
命令同步:徹底同步或者部分同步完成後,主會把命令同步給從。性能
部分同步實現原理:主機器ID+偏移量+複製積壓緩衝區
從會每秒一次發送心跳給主保持鏈接和傳遞偏移量
能夠支持故障轉移,從服務器中選出新的主。
setinel監控主,須要經過配置或者命令的方式指定。
setinel和主和從服務器進行鏈接的時候會建議命令鏈接、消息鏈接。
setinel和主創建鏈接以後,會經過主服務發送的信息獲取到從服務器信息並與從服務器創建鏈接。
setinel經過主和從服務器信息發現其餘setinel機器並創建命令鏈接。
setinel監控到主服務器下線以後,會詢問其餘setinel服務器是否贊成下線,贊成下線達到閾值則會進行下線。
sentinel如何發現主? 經過setinel配置初始化的主服務器
sentinel如何發現從? 經過主服務器給setinel回覆的信息裏面自動發現從服務器
sentinel如何創建鏈接? sentinel會分別創建命令鏈接和消息鏈接。
sentinel如何發現其餘sentinel? 經過主從服務器發送的消息發現其餘sentinel,而且相互創建命令鏈接。
sentinel如何選出領頭sentinel 發現了主服務器下線的sentinel會相互詢問,而且把本身做爲局部領頭。固然選出來的局部領頭大於半數,則該局部領頭成爲全局領頭來選舉新主,並把從的主改成新主。
sentinel選舉出新的主 根據必定規則從裏面選出新的主,規則要求就是網絡好,數據最新,數據最新經過偏移量發現,而後把主的角色改變。
sentinel把從的舊主改爲新的主
sentinel如何發現服務下線? 經過每秒一次的ping命令,服務器沒有回覆pong達到必定時間認爲下線。
sentinel選取領頭就是經過raft算法實現的。
setinel可以支持主從,可是沒法解決高併發下單機內存過大和qps過大的問題。這種狀況下須要redis集羣來解決 redis集羣每臺機器分配若干個槽,0-2的14次方-1個,每臺機器負責若干個槽。經過對key的hash值取模計算的方式能得屬於哪一個槽,也能得知屬於哪一個機器,若是當前機器不是槽所屬機器,則會經過move指令讓客戶端重定向到指定機器。
1.什麼是二八定律 數據常被用到的只有20%甚至更少,針對這20%數據作優化效果更好,性價比更高。
2.如何經過redis實現分佈式鎖?
3.緩存穿透 場景:查詢數據庫中必定不存在的數據,致使請求直接落db。 解決方案:針對不存在的數據,緩存中存放null。也能夠把可能存在的數據放入布隆過濾器,這樣能過濾掉必定不存在的數據。
4.緩存雪崩 場景:大量數據緩存key集中過時,致使請求大量落入db 解決方案:緩存過時時間設置的時候增長隨機數,熱門的數據緩存過時時間能夠長一點,冷門數據緩存過時時間短一點、
5.緩存擊穿 場景:緩存中熱點數據過時,瞬間大量請求落入db。 解決方案:熱點數據永不過時,請求db的時候使用分佈式鎖。