Redis緩存

雜文論 發佈 2022-08-10T05:39:56.661102+00:00

1. Redis緩存Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作資料庫、緩存和消息中間件。它是基於高性能的Key-Value、並提供多種語言的 API的非關係型資料庫。不過與傳統資料庫不同的是 redis 的數據是存在內存中的,所以存寫速度非常快。

1. redis緩存

Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作資料庫、緩存和消息中間件。

它是基於高性能的Key-Value、並提供多種語言的 API的非關係型資料庫。不過與傳統資料庫不同的是 redis 的數據是存在內存中的,所以存寫速度非常快。

它支持多種類型的數據結構,如 字符串(Strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)

2. 為什麼需要使用緩存

說明:使用緩存可以有效的降低用戶訪問物理設備的頻次,有效的減少並發的壓力。保護後端真實的伺服器。

主要從「高性能」和「高並發」兩點來看:

2.1高性能

2.2高並發

直接操作緩存能夠承受的請求是遠遠大於直接訪問資料庫的,所以我們可以考慮把資料庫中的部分數據轉移到緩存中去,這樣用戶的一部分請求會直接到緩存這裡而不用經過資料庫。

3.Redis的架構模式

3.1 主從模式

Redis的複製功能允許用戶根據一個Redis伺服器來創建任意多個該伺服器的複製品,其中被複製的伺服器為主伺服器(master),而通過複製創建出來的伺服器複製品則為從伺服器(slave)。只要主從伺服器之間的網絡連接正常,主從伺服器兩者會具有相同的數據,主伺服器就會一直將發生在自己身上的數據更新同步 給從伺服器,從而一直保證主從伺服器的數據相同。

特點:

1、master/slave 角色

2、master/slave 數據相同

3、降低 master 讀壓力在轉交從庫

問題:

1、無法保證高可用

2、沒有解決 master 寫的壓力

3.2 哨兵模式

Redis sentinel 是一個分布式系統中監控Redis主從伺服器,並在主伺服器下線時自動進行故障轉移。

它具備三個特徵:監控、提醒、自動故障遷移。

特點:

1、保證高可用

2、監控各個節點

3、自動故障遷移

缺點:

1、主從模式,切換需要時間丟數據

2、沒有解決 master 寫的壓力

3.3 分片模式

雖然redis可以擴展內存空間的大小。但是如果需要存儲海量的數據一味的擴大內存,其實效率不高。

分片介紹: 準備多台redis,共同為用戶提供緩存服務。在保證效率的前提下,實現了內存的擴容。用戶在使用分片機制時,將多台redis當做1台使用。

**1.那麼數據是依據什麼算法存儲到Redis分片緩存中的呢?

一致性哈希算法(下文介紹)

**2.關於redis分片總結

1)當redis節點宕機之後,用戶訪問必然受到影響,該節點中的數據可能丟失

2)redis分片可以實現內存數據的擴容

3)redis分片機制中Hash運算發生在業務伺服器中,redis只負責存取,不負責計算,所以效率高。

3.4 集群模式

從redis 3.0之後版本支持redis-cluster集群,Redis-Cluster採用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接。

特點:

1、無中心架構(不存在哪個節點影響性能瓶頸),少了 proxy 層。

2、數據按照 slot 存儲分布在多個節點,節點間數據共享,可動態調整數據分布。

3、可擴展性,可線性擴展到 1000 個節點,節點可動態添加或刪除。

4、高可用性,部分節點不可用時,集群仍可用。通過增加 Slave 做備份數據副本

5、實現故障自動 failover,節點之間通過 gossip 協議交換狀態信息,用投票機制完成 Slave到 Master 的角色提升。

缺點:

1、資源隔離性較差,容易出現相互影響的情況。

2、數據通過異步複製,不保證數據的強一致性

4.一致性Hash算法介紹

一致性哈希算法在1997年由麻省理工學院提出,是一種特殊的哈希算法,目的是解決分布式緩存的問題。在移除或者添加一個伺服器時,能夠儘可能小地改變已存在的服務請求與處理請求伺服器之間的映射關係。一致性哈希解決了簡單哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的動態伸縮等問題 。

4.1 一致性Hash原理

目的:解決數據如何在分布式環境下進行存儲

hash取值區間:8位16進位數 共有2^32種可能性

1)數據如何存儲

2)當節點發生變化時,節點中的對應的數據可以動態的遷移。

原則:當發生了節點變化時,應該儘可能小的影響其他節點。

4.2 一致性Hash特徵

一致性哈希算法是在哈希算法基礎上提出的,在動態變化的分布式環境中,哈希算法應該滿足的幾個條件:

①平衡性(均衡性)是指hash的結果應該平均分配到各個節點,這樣從算法上解決了負載均衡問題。利用虛擬節點實現數據平衡(相對而已的平均)

②單調性是指在新增或者刪除節點時,不影響系統正常運行,可以實現動態的數據遷移。

③分散性是指數據應該分散地存放在分布式集群中的各個節點,不必每個節點都存儲所有數據。

5.Hash槽算法介紹

RedisCluster採用此分區,所有的鍵根據哈希函數(CRC16[key]%16384)映射到0 - 16383槽內,工16384個槽位,每個節點維護部分槽及槽所映射的鍵值數據。根據主節點的個數,均衡劃分區間。

哈希函數:Hash()=CRC16[key]%16384

如圖所示:

當redis集群中插入數據時,首先將key進行計算,之後將計算結果匹配到具體的某一個槽的區間內,之後再將數據set到管理該槽的節點中。

如圖所示:

6.Redis的持久化策略

Redis的數據都保存在內存中,如果斷電或者宕機,則內存數據將擦除,導致數據的丟失。為了防止數據丟失,Redis內部有持久化機制。

當第一次Redis服務啟動時,根據配置文件中的持久化要求,進行持久化操作。如果不是第一次啟動,則在服務啟動時會根據持久化文件的配置,讀取指定的持久化文件,實現內存數據的恢復。

6.1 RDB模式

特點:

1.rdb模式是redis中默認的持久化策略。

2.rdb模式定期持久化。保存的是Redis中的內存數據快照,持久化文件占用空間較小。

3.rdb模式可能導致內存數據丟失。

前提:需要在redis的客戶端中執行.

1.save 命令 立即持久化,會導致其他操作陷入阻塞.

2.bgsave 命令 開啟後台運行。 以異步的方式進行持久化,不會造成其他操作的阻塞。

6.2 AOF模式

特點:

1.AOF模式默認條件下是關閉狀態.。如果需要開啟則需要修改配置文件。

2.AOF模式可以實現數據的實時持久化操作,AOF模式記錄的是用戶的操作過程。

3.只要開啟了AOF模式,則持久化方式以AOF模式為主。

6.3 持久化總結

1.如果用戶允許少量的數據丟失,則可以選用RDB模式. 效率更高

2.如果用戶不允許數據丟失,則選用AOF模式.

3.可以2種方式都選, 需要搭建組從結構 , 主機選用RDB模式, 從機選用AOF模式,可以保證業務允許.

7.Redis的內存策略

redis伺服器運行在內存中,數據也在內存中保存。 如果一直往裡存,總有一天內存資源不夠用,所以需要研究如何優化內存。

7.1 LRU算法

維度:時間

lru(Least Recently Used)即最近最少使用,是一種常見的頁面(數據)置換算法,選擇最近最久未使用的頁面(數據)予以淘汰。該算法賦予每個頁面(數據)一個訪問欄位,用來記錄一個頁面(數據)自上次被訪問以來所經歷的時間t,當必須淘汰一個頁面(數據)時,選擇現有頁面(數據)中其t值最大的,即最近最少使用的頁面(數據)予以淘汰。

7.2 LFU算法

維度:引用次數

lfu(least frequently used (LFU) page-replacement algorithm)。即最不經常使用頁置換算法,要求在頁置換時置換引用計數最小的頁,因為經常使用的頁應該有一個較大的引用次數。但是有些頁在開始時使用次數很多,但以後就不再使用,這類頁將會長時間留在內存中,因此可以將引用計數寄存器定時右移一位,形成指數衰減的平均使用次數。

7.3 隨機算法

滅霸響指,隨機刪除頁面(數據)

7.4 TTL算法

將設定了超時時間的數據提前刪除

7.5 Redis中內存優化策略

volatile-lru 設定超時時間的數據採用lru算法

allkeys-lru .所有的數據採用lru算法

volatile-lfu設定超時時間的數據採用LFU算法 .

allkeys-lfu 所有的數據才能lfu算法

volatile-random設定了超時時間的數據採用隨機算法

allkeys-random 所有數據採用隨機算法

volatile-ttl設定超時時間的數據採用TTL算法

noeviction 該配置為模式配置 表示內存滿時 只報錯,不刪除數據.

8.Redis的數據類型及其應用場景

一)string 常用命令: set,get,decr,incr,mget 等。

最常規的set/get操作,value可以是String也可以是數字。一般做一些複雜的計數功能的緩存。

二)hash 常用命令: hget,hset,hgetall 等。

這裡value存放的是結構化的對象,比較方便的就是操作其中的某個欄位。

三)list 常用命令: lpush,rpush,lpop,rpop,lrange等

使用list的數據結構,可以做簡單的消息隊列的功能。另外一個就是,可以利用lrange命令,做基於redis的分頁功能,性能極佳,用戶體驗好。

四)set 常用命令: sadd,spop,smembers,sunion 等

set堆放的是一堆不重複值的集合,所以可以做全局去重的功能。

五)sorted set 常用命令: zadd,zrange,zrem,zcard等

多了一個權重參數score,集合中的元素能夠按score進行排列。可以做排行榜應用,取TOPN操作。

9. Redis為什麼是單線程的

官方FAQ表示,因為Redis是基於內存的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器內存的大小或者網絡帶寬。既然單線程容易實現,而且CPU不會成為瓶頸,那就順理成章地採用單線程的方案了(畢竟採用多線程會有很多麻煩!)Redis利用隊列技術將並發訪問變為串行訪問

單線程的redis為什麼這麼快?

1)絕大部分請求是純粹的內存操作(非常快速)

2)採用單線程,避免了不必要的上下文切換和競爭條件

3)非阻塞IO優點:

1.速度快,因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)

2.支持豐富數據類型,支持string,list,set,sorted set,hash

3.支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行

4.豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除如何解決redis的並發競爭key問題

關鍵字: