Redis基礎知識

1:什麼是Redis

Redis是一個免費開源的高性能key-value非關係型數據庫,是爲了解決高併發、高擴展等一系列問題而出現的數據庫解決方案。

 

2:Redis爲什麼快

計算機存儲介質讀取速度
寄存器 一級緩存 二級緩存 三級緩存 內存 硬盤 遠程硬盤(光盤)
速度依次降低(寄存器讀取速度最高)

Redis數據是存儲在內存中的,並且是單線程(不用在線程切換、鎖等問題上消耗CPU,可以通過單線程多進程實現一定的性能提升)

 

 

3:Redis如何實現持久化

Redis實現持久化主要有兩種方式:寫日誌AOF、快照RDB

 

AOF就是根據配置的策略把每次操作都持久化到一個日誌文件中。

AOF主要有三種持久化策略:always(每操作一次就持久化,耗能明顯)、everysec(每秒持久化一次,如若宕機會丟失幾秒的數據--默認,也是常用)、no(Redis根據操作系統自動持久化,不可控)。

AOF文件主要是通過AOF重寫來生成的,原生的AOF文件記錄的確實是每次的操作記錄,但是其中明顯會有許多重複冗餘的數據,這個原生的AOF日誌文件只能當做日誌文件,而持久化需要的AOF文件實際上把內存中數據進行一次數據回溯而生成的,然後替換原生的AOF文件。

AOF重寫有兩種方式:手動執行AOF重寫命令、通過配置文件進行配置(主要配置文件重寫尺寸與文件增長率)

 

RDB就是在某個時刻進行Redis持久化生成一個二進制的RDB文件。

RDB主要的三種持久化策略:客戶端執行save命令(同步阻塞命令)、客戶端執行bgsave命令(異步非阻塞命令)、自動(通過配置文件指定持久化時機--60秒1W條、300秒10條、900秒1條數據變化的那個配置,本質還是bgsave--常用)

 

如果Redis重啓會優先使用AOF文件(誤差小),相對而言二進制的RDB文件恢復數據速度其實更快一些。RDB更加適合大數據的持久化,比如一小時、一天一次的備份。

Redis4.0版本後可以兩種持久化方式混合使用。

 

4:Redis的多種數據結構

Redis主要有五大數據類型,以及其他的四種衍生出來的數據類型

 

一:String字符串

字符串的value最大是512M,常用incr命令去做一些計數器,也可以使用它做一個分佈式鎖

示例:set name Jacob、get name

 

二:Hash

Hash的value是由 field於value成對組成的,裏面的field是不會重複的(重複則覆蓋)。

常用於存儲對象,比如某個用戶的某個商品瀏覽次數的自增

hincrby username productIdViewNum 1 給username這個用戶的productIdViewNum 這個屬性 進行自增 1

示例:hset student name Jacob、hget student name

 

三:List列表

List的Value是一個可重複的有序隊列,所以可以進行一些左右添加、彈出的,以及在獲取指定索引範圍內元素的操作。

常用於最新消息的存儲、Redis消息隊列

示例:rpush student Jacob Lisha Abell、lindex student 1 (獲取該key索引1出的元素)、lset student 1 Lili (修改該key索引1出的元素)

 

四:Set集合

Set的Value是不可重複並且無序的,因爲是集合所以可以進行一些集合間的操作,如取交集sinter、並集sunion、差集sdiff,還有可以隨機彈出一個元素等操作。

常用於共同好友、共同關注,隨機抽獎等場景。

示例:sadd names Jacob Lisha Abell(如果已存在那麼就不會添加--不是覆蓋是直接不添加,不存在就則會添加成功)、smembers names(獲取該key中的所有元素)、srandmember names 3(隨機獲取該key中的3個元素)

 

五:Sorted Set有序集合

Sorted Set是有序並沒有重複元素的,它的Value由兩部分組成,一個score分數,一個value值,其中score就是排序的依據。

常用於熱度排行榜、特價排行榜、關注度排行榜等場景中。

示例:zadd studentScore 66 Jacob 86 Lisha 79 Abell(實際會按照分數默認從小到大排序)、zscore studentScore Jacob(獲取Jacob的分數)、zrange studentScore 1 2 withscores(獲取2~3排名的元素並打印分值--打印分值可選項withscores)

 

六:BitMap位圖

BitMap主要是通過二進制數據進行存儲(主要是對位的一些操作),實現使用很小的內存實現高效存儲,例如布隆過濾器。

0 1 1 0 1 0 0 0 1 0

它裏面的運算有取並集、交集、非、異或操作,還可以獲取value中爲上爲1或者0的總數統計等。

使用場景一:假設某個網站用戶有1E,並且這些用戶主鍵是從1~1E,現在需要統計每天該網站用戶的登錄情況,就可以創造一個1E的位,表示從1~1E這些用戶,如果對應位上的用戶上線過線,則用1,否則用0表示,從而實現每日活動用戶的統計。

使用場景二:每日簽到,用該用戶做key,然後給一個31的位,哪天簽到了就給設置1,否則爲0。

示例:setbit mouth202002 0 1(設置mouth202002這個key對應的value第1位的值爲1)、bitcount mouth202002 0 10(獲取mouth202002這個Key對應value中從0~10索引之間出現1的次數的總和)。

 

七:HyperLogLog基數統計

HyperLogLog使用極小內存存儲某個統計數。首先該類型也是往key裏面存一個一個的元素,但是這些元素並不會真的存儲,而是把這些元素通過一個算法進行了記錄,從而實現該類型的特定功能,就是統計、合併!該類型就3個API,pfadd添加、pfmerge合併、pfcount統計。

該類型存在一定的誤差性,錯誤率在0.81%左右。

 

八:GEO地理信息定位

GEO主要是用來存放經緯度的,所以它主要功能是計算兩地的距離、範圍等的相關運算。

示例:geoadd  citis  116.28  39.55  bj  117.12  39.08 tj(往citis這個key中存放 bj和tj兩個地方的經緯度)、geopos  citis  bj(獲取bj的經緯度)、geodist  citis  bj  tj  km(查詢bj  tj兩個經緯度之間的距離)

 

九:Stream流

Stream流是5.0後才正式加入的數據類型,主要是用於解決發佈訂閱中相關數據的問題。

 

 

5:Redis主從複製模式

Redis主從複製主要是在slave上輔助master,數據流是單向從master流向slave的。實現主從複製可以通過在slave上執行slaveof命令,或者直接修改slave的配置文件。

單機版主從複製存在衆多問題,比如master掛了,寫操作無法進行。由於複製需要一定的時間,所以讀操作可能會讀不到數據或者讀到髒數據。也可能由於網絡故障導致主從複製無法正確全量完成等。所以出現了Sentinel模式。

 

 

6:Sentinel哨兵高可用模式

Sentinel主要是針對主從複製中各個節點Redis故障進行判斷、通知客戶端、故障轉移等的一些作用。

三個定時任務

1:每10秒  每個sentinel對master以及slave進行信息交換,從而時刻知曉各個節點的關係

2:在sentinel的master節點上有個channel通道,也就是一個發佈訂閱消息通道,每2秒 各個sentinel節點都會通過該節點進行信息互通,從而在故障轉移的時候確定Redis節點的上下線

3:每秒 每個sentinel都會與其他sentinel和Redis進行Ping操作,來發現各個節點的狀態

 

主觀下線:當一個sentinel發現某個Redis節點出現故障後,當前sentinel節點對該Redis節點標記爲下線操作。

客觀下線:當某個sentinel進行主觀下線後會通知其他sentinel我發現了故障,我要成爲sentinel的master對那個Redis進行進行下線操作,然後開始sentinel的選舉,各個sentinel對那個Redis節點進行信息交換,之後進行這次的選舉活動,如若選舉成功則進行Redis的客觀下線,實現故障轉移。

故障轉移:sentinel會共選擇一個slave做下一任master,而原來的master會變爲一個slave,當這個slave恢復正常後,回去同步新master的數據。

 

sentinel解決了故障轉移的問題,但是畢竟還只是單機多部署,單機的瓶頸依舊存在,所以需要使用Redis Cluster分片集羣模式來實現數據的擴展。

 

7:Redis Cluster模式

Redis Cluster主要是爲了解決單機多部署中數據量的瓶頸問題的,它類似於數據庫的拆錶行爲(水平拆分),把原本一個表的數據查分到多個表中,Redis Cluster則是把一個Redis數據庫數據分片拆分到多個Redis數據庫中,然後通過集羣實現分佈式高可用式Redis數據庫。

Redis Cluster主要有三個點:

1:節點  也就是分片爲幾個Redis Master,節點之間通過meet實現信息互通。

2:槽  由於是分片,所以需要確定每個片存放哪個範圍內的數據,Redis Cluster總共是16384個槽。

3:主從節點  主要是給每個master分配從節點,分配幾個自行決定,主要是爲了實現高可用。

 

Redis Cluster由於分片,所以不能進行批量操作,但是可以自己根據需要查詢的數據進行一定的邏輯處理,然後使用適當的方式進行獲取(比如 串行meet、並行IO、串行IO、hash_tag等),還有會出現ask重定向、moved異常等問題。當然實際中我們大多是直接使用smart客戶端來解決這些問題,比如JjedisCluster。

 

Redis Cluster中某些熱點key需要更新時主要可以選擇兩種方式:互斥鎖、永不過期機制。

互斥鎖:當需要更新某個熱點key時,那麼就是鎖住該key的獲取,然後進行重構,直至重構完成後再放開該key的獲取。

永不過期機制:當需要更新某個熱點key時,開啓一個異步更新操作,如果更新過程中有獲取key的操作,那麼就返回原來老的值,知道更新完成後才更新當前key的值。

 

 

8:Redis雪崩與穿透與擊穿

雪崩:主要是由於緩存過掉或者邏輯問題,導致大量訪問直接訪問數據庫,這裏訪問的數據一般都是數據庫存在的。

解決方法:主從結構,master宕機後從節點可以實現高可用。還有就是訪問源限流、資源熔斷、降級設置進行處理。

穿透:主要是大量請求訪問Redis,而Redis沒有該數據,然後去訪問數據庫,而數據庫也沒有該數據,整個過程就是一個穿透的過程(黑客或者爬蟲)。

解決方法:如果整個過程是一個穿透過程,那麼可以給緩存放一個一定時限的標識值,或者使用布隆過濾器。

擊穿:也就是某些熱點key更新時的瞬間,造成大量訪問直接請求數據庫。

解決方法:可通過互斥key或者永不過期機制進行處理。

 

 

如文中有所錯誤,還望各位多多指教。謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章