redis 的簡單理論

2021-10-11 19:03:59 字數 3542 閱讀 6862

1.redis 的應用場景

會話快取

訊息佇列(排行榜,計數)

發布訂閱,訊息通知

redis資料型別
string(字串),hash(雜湊),list(列表),set(集合),zset(有序集合)
redis的持久化方式
1. rdb(快照):每隔一段時間對資料進行快照儲存。(會丟失最後一次的快照)

2. aof:持久化的每次記錄對伺服器寫的操作。當伺服器重啟的時候會執行這些命令來恢復資料。

redis還會的檔案進行後台重寫。以至於aof檔案不會太大。(資料相對完整)

3. 如果兩種方式都開啟。重啟服務,會優先載入aof檔案,因為資料aof檔案相對來說會更加完整。

redis事務
1. watch命令可以監控乙個或多個鍵,一旦其中有乙個鍵被修改(或刪除),之後的事務就不會執行。監控一直持續到exec命令(事務中的命令是在exec之後才執行的,所以在multi命令後可以修改watch監控的鍵值) 

2. 不支援事務回滾.

redis 快取穿透
快取擊穿表示惡意使用者模擬請求很多快取中不存在的資料,由於快取中都沒有,導致這些請求短時間內直接落在了資料庫上,導致資料庫異常。
解決:

布隆過濾器

bloomfilter就類似於乙個hashset,用於快速判某個元素是否存在於集合中,其典型的應用場景就是快速判斷乙個key是否存在於某容器,不存在就直接返回。

redis 雪崩
快取在同一時間內大量鍵過期(失效),接著來的一大波請求瞬間都落在了資料庫中導致連線異常。

解決方案:

方案1、也是像解決快取穿透一樣加鎖排隊,實現同上;

方案2、建立備份快取,快取a和快取b,a設定超時時間,b不設值超時時間,先從a讀快取,a沒有讀b,並且更新a快取和b快取;

方案3、設定快取超時時間的時候加上乙個隨機的時間長度,比如這個快取key的超時時間是固定的5分鐘加上隨機的2分鐘,醬紫可從一定程度上避免雪崩問題;

redis 分布式鎖
1.在加鎖和解鎖時一定要保原子性。

加鎖時:使用nx和ex操作,保證加鎖和過期時間的原子性。不要是固定字串,使用隨機字元。保證在解鎖的時候不會借掉別人的鎖。

解鎖時:使用指令碼,在查詢如果正確的時候直接解鎖。

指令碼是:如果key和uuid都是對的,那麼直接解鎖

2. 鎖的續期,設定鎖的時間為乙個長時間。將業務**放到try中。解鎖放到finally中。不管業務是奔潰還是成功都會解鎖

redis記憶體淘汰機制

有兩大類

1.lru(長時間沒有使用淘汰機制)

共有4種

lrulru-k

2qmq

2.lfu(使用次數最少淘汰機制)

lru 最簡單的記憶體淘汰機制

1.新資料插入到鍊錶頭部;

2.每當快取命中(即快取資料被訪問),則將資料移到鍊錶頭部;

3.當鍊表滿的時候,將鍊錶尾部的資料丟棄。

lru-k演算法

資料第一次被訪問,加入到fifo佇列中。

如果資料在歷史訪問中沒有達到k次訪問。則按照一定的規則(fifo,lru)淘汰。

如果達到k次,將資料索引從歷史列隊中刪除。存放到快取列隊中。並快取此資料。快取佇列按照時間排序。

快取佇列(lru)被重新訪問後,重新排序。

需要淘汰時,快取佇列(lru)排在末尾的資料,被淘汰。倒數第k次被訪問最久的被淘汰。

2q演算法

新訪問的資料插入到fifo佇列;

如果資料在fifo佇列中一直沒有被再次訪問,則最終按照fifo規則淘汰;

如果資料在fifo佇列中被再次訪問,則將資料移到lru佇列頭部;

如果資料在lru佇列再次被訪問,則將資料移到lru佇列頭部;

lru佇列淘汰末尾的資料。

mq演算法

新插入的資料放到q0中

每隔佇列按照lru來管理資料

當資料訪問到一定次數。需要提公升優先順序,將從當前佇列中刪除,加入到更高階的佇列中。

為了防止高優先順序永遠不對被刪除。所以在一定時間內沒有被訪問。那麼就會降級。從當前列表中刪除,加入到低優先順序的頭部。

需要刪除的時候從最低一級的佇列開始lru淘汰。每隔佇列淘汰資料時,將從快取中刪除,將資料放到歷史佇列的頭部。

如果歷史佇列的資料重新被訪問,則重新計算其優先順序,移動到目標佇列的頭部。

歷史佇列也按照lru淘汰。

lru 4中演算法對比

命中率lru-2 > mq(2) > 2q > lru

複雜度lru-2 > mq(2) > 2q > lru

代價lru-2 > mq(2) > 2q > lru

布隆過濾器

布隆過濾器可以理解成乙個不怎額精確的set結構。可以查詢物件是否存在。當布隆過濾器說某個值存在的時候,這個值可能不存在。當他說這個值不存在的時候那就肯定不存在。所以有誤判的可能。

bf.reserve 有三個引數,分別是 key, error_rate 和 initial_size。

提高初始值(initial_size)的元素數量,可以降低誤判的概率。

布隆過濾器的 initial_size 估計的過大,會浪費儲存空間,估計的過小,就會影響準確率,使用者在使用之前一定要盡可能地精確估計好元素數量,還需要加上一定的冗餘空間以避

免實際元素可能會意外高出估計值很多。

布隆過濾器的 error_rate 越小,需要的儲存空間就越大,對於不需要過於精確的場合,error_rate 設定稍大一點也無傷大雅。

布隆過濾原理

每個布隆過濾器對應到 redis 的資料結構裡面就是乙個大型的位陣列和幾個不一樣的無偏 hash 函式。所謂無偏就是能夠把元素的 hash 值算得比較均勻。

向布隆過濾器中新增 key 時,會使用多個 hash 函式對 key 進行 hash 算得乙個整數索

引值然後對位陣列長度進行取模運算得到乙個位置,每個 hash 函式都會算得乙個不同的位

置。再把位陣列的這幾個位置都置為 1 就完成了 add 操作。

向布隆過濾器詢問 key 是否存在時,跟 add 一樣,也會把 hash 的幾個位置都算出

來,看看位陣列中這幾個位置是否都位 1,只要有乙個位為 0,那麼說明布隆過濾器中這個

key 不存在。如果都是 1,這並不能說明這個 key 就一定存在,只是極有可能存在,因為這

些位被置為 1 可能是因為其它的 key 存在所致。

redis深度理論

建表 必須給出schema 型別 位元組寬度 存 傾向於行級儲存如果表有索引 增刪改查變慢 查詢速度 1.1個或者少量的查詢依然很快 2.併發大的時候會受到硬碟頻寬影響速度 相同 都是key value的形式 不同 memcached沒有型別的概念,redis有型別的區分首先,redis 是跑在單執...

Redis的簡單使用

redis 是完全開源免費的,遵守bsd協議,是乙個高效能的key value資料庫。redis 與其他 key value 快取產品有以下三個特點 tar zvxf redis 3.0.5.tar.gz cd redis 3.0.5 make redis server 這種方式是啟動的redis使...

redis的簡單使用

2.redis的安裝 a 解壓redis 3.2.3.tar.gz tar zxvf redis 3.2.3.tar.gz b 進入解壓後的目錄,執行make編譯原始碼。c 進入 opt redis 3.2.3 src 目錄,執行make install進行安裝。3.redis的啟動 關閉 檢視re...