Redis筆記

 

五種數據類型

  • Stringjava

  • Listredis

  • Set數據庫

  • Mapapi

  • Zset緩存

List數據結構是雙向鏈表,能夠左右插入刪除,取出服務器

Map是hashmap的結構數據結構

Set也是hashmap的結構,可是value沒有值框架

Zset是在Set的基礎上,加上一個能夠排序的score字段socket

Jedis和RedisTemple

Jedis是對Redis的官方JAVA封裝,提供了全部api和操做分佈式

RedisTemple是對Jedis的高級封裝,提供了不少特性,例如鏈接池管理

Redis持久化

RDB

快照的方式持久化,將redis數據保存成二進制的文件

能夠直接保存也能夠後臺保存,直接持久化會致使其餘服務被阻塞

後臺保存會fork一個子進程,保存RDB

優缺點:

存儲效率高、適合備份、恢復數據塊

沒法實時持久化,內容佔用高

AOF

增量文件的方式持久化,將寫命令所有記錄在AOF文件中,記錄數據庫的改變

能夠每次命令、每秒、或者系統控制

AOF重寫

對AOF中的指令進行壓縮,去除重複、無效、統一數據的屢次操做等

 

AOF會fork一個子進程將AOF緩衝區的內容寫入AOF文件

AO重寫也會fork一個子進程,將AOF從新緩衝區的內容寫入AOF文件,代替原來的AOF文件

優缺點:

丟失的數據不多、

AOF文件存儲大、災難恢復慢

Redis事務

和java的sychnized和鎖很像

一個是對操做加同步代碼塊,一個是對資源加鎖

數據淘汰策略

數據刪除策略和逐出策略

刪除策略:是數據過時之後,如何處理

逐出策略:是內存不夠之後,如何刪除數據得到空間

刪除策略

定時刪除:過時了就刪除

惰性刪除:過時了不刪除,下次使用的時候再刪除

按期刪除:定一個時間,例如十秒鐘刪除一次過時的數據

定時CUP佔用高,惰性內存佔用高

按期是一種折中,刪除每次都是輪訓每一個數據庫,而後隨機掃描一段時間,若是過時數據多與必定的比值,就再來一次

逐出策略

  • 從有有效期的數據中刪除4

    LRU LFU TTL RANDOM

  • 從全部數據中刪除3

    LRU LFU RANDOM

  • 不刪除1

高級數據類型

bitmaps hyperloglog GEO

  • bitmaps就是一個記錄比特位的數據類型,能夠用來統計二值數據

  • hyperloglog 基數類型,用來作基數統計的,能夠用最大12k的空間,統計無限多的值

  • GEO地理位置數據

主從複製

設置master和slave的方式:命令、配置、和框架

主從複製分爲三個階段

  • 全量複製

  • 增量複製

  • 命令傳遞

創建鏈接的過程

slave將本身的ip和port發送給master,創建socket並保存鏈接

隨後可能還有受權驗證的過程,master保存slave的port

全量複製和增量複製

第一次複製的時候

slave發送同步命令,初始runid爲?,offset爲-1

master開始bgsave,保存一個RDB文件,而且經過socket返回slave,同時返回runid和offset

slave接受完RDB後,清空數據庫,經過RDB恢復

以上是全量複製的過程,後面是增量複製

slave告知master本身全量複製完成,發送runid和offset

master把複製緩衝區的AOF文件發送給slave

slave執行bgwriteaof 恢復數據

完成增量複製

命令傳遞

slave發送offset

master判斷是offset否在緩衝中,不在就全量複製,在的話就把offset以後的內容發給slave

runid不對也會全量複製

哨兵

哨兵是一個分佈式系統,用來監控主從的正常運行和發現故障以及故障轉移

哨兵也是一臺redis服務器,只是不提供數據服務

工做階段:

  • 監控

  • 通知

  • 故障轉移

監控

第一臺sentinel,首先獲取master的信息,而後獲取slave的信息

後面的sentinel,獲取master、前面sentinel和slave的信息

通知

sentinel們不斷的監控全部的redis服務器,發送hello信息

故障轉移

當一太sentinel發現有redis服務器發現故障的時候,告知全部sentinel,這臺服務器主觀下線

其餘sentinel也去hello這臺服務器,超過半數認爲這臺服務器下線了,就客觀下線

而後投票找一個負責人:每一個sentinel發信息給其餘,每一個sentinel將第一個收到的信息做爲票,得票最高爲負責人

負責人通知全部redis服務器,有服務器下線了,而且從slave中選一個新的主

原則:在線,響應快,與master斷開最久、offset優先等原則

集羣

redis集羣和主從區別,主從其實是作冗餘和備份,集羣是將大任務分化,對外保持一致

cluster集羣,rb腳本

內存存儲:將keyhash而後取模16384,分紅不一樣的槽,每一個reids服務器存儲一部分的槽,不論是新增仍是刪除,都是操做存儲的槽的數量

通信設計:請求來了一臺redis,命中就返回,不命中告知key所在服務器是哪一臺

 

企業級問題

預熱

服務上線以前,將一些數據預加載到redis中,防止一上線,大量熱點請求涌入

解決方案:

平常記錄熱點數據、創建數據留存隊列,kafka和strom、開啓腳本按期預熱、CDN加速

主從同時預熱

血崩

同時,大量key過時

解決方案:

內存逐出策略切換、數據分類拆分過時時間、設置永久key、加鎖

擊穿

熱點key過時,大量請求打到數據庫上

解決方案:

永久key,二級緩存、按需加大過時時間、加鎖

穿透

黑客攻擊,大量無效的請求,key沒有,因此打到數據庫上

解決方案:

前臺驗證、後臺驗證、布隆過濾器、白名單、key加密、緩存null

相關文章
相關標籤/搜索