Redis之高階特性

2022-09-20 20:45:13 字數 3412 閱讀 1767

expire key seconds:設定key的過期時間

ttl key:檢視key的過期時間

persist key:刪除key的過期時間

過期策略:

定時刪除[主動,集中處理]:會將每個設定了過期時間的 key 放入到乙個獨立的字典中,以後會定時遍歷這個字典來刪除到期的 key。

過期策略-定時刪除:

演算法:貪心演算法

頻率:預設1s10次,每次不超過25ms(cpu時間的25%)[防止阻塞使用者請求]

過程:1.從過期字典(儲存了所有key過期時間的字典)中隨機 20 個 key;

2.刪除這 20 個 key 中已經過期的 key;

3.如果過期的 key 比率超過 1/4,那就重複步驟 1;

(面試題)redis的大key會不會有什麼問題?對redis的影響是什麼?

大key:bigkey,指value比較大(資料過大、成員過多)的key。

乙個string型別的key,它的值為5mb(資料過大)

乙個list型別的key,它的列表數量為20000個(列表數量過多)

乙個zset型別的key,它的成員數量為10000個(成員數量過多)

乙個hash格式的key,它的成員數量雖然只有1000個但這些成員的value總大小為100mb(成員體積過大)

造成的問題:

1.占用過多的記憶體、可能觸發記憶體淘汰策略,重要的key被驅逐或者阻塞寫入

2..讀取占用伺服器網路頻寬

3.刪除乙個大key會造成redis較為長時間的阻塞

string的底層實現sds,釋放(sdsfree)的時間複雜度為o(n),n為長度

hash的底層實現hashtable,釋放(dictrelease)的時間複雜度為o(n),n為鍵值對數量

list的底層實現quicklist,釋放(quicklistrelease)的時間複雜度o(n),n為成員數量

zset的底層實現skiplist,釋放(zslfree)的時間複雜度為o(n),n為長度。

如何發現bigkey?

redis自帶工具:redis-cli --bigkeys

如何解決bigkey?

1.通過redis自帶工具發現bigkey,檢視是否符合業務場景,若不符合,則在業務層避免。

2.是否能夠使用其他nosql,若可以,則使用。

3.若無法避免,則應避免阻塞redis使用者執行緒,需要釋放bigkey時,應用程式使用unlink非同步釋放空間,不阻塞redis使用者執行緒。

最大記憶體淘汰策略:指redis的記憶體使用到達了配置的最大限制,如何淘汰記憶體中的key的策略。

redis的記憶體大小限制在redis.conf中配置

maxmemory :最大記憶體限制,預設64位系統不限制記憶體,32位系統最多使用3gb記憶體

maxmemory-policy 《策略名稱》:淘汰策略

淘汰策略:(沒有優劣,看場景)

volatile-lru:從已設定過期時間的資料集中挑選最近最少使用的資料淘汰。

volatile-ttl:從已設定過期時間的資料集中挑選將要過期的資料淘汰。

volatile-random:從已設定過期時間的資料集中任意選擇資料淘汰。

allkeys-lru:從資料集中挑選最近最少使用的資料淘汰。

allkeys-random:從資料集中任意選擇資料淘汰,當記憶體達到限制的時候,對所有資料集挑選隨機淘汰,直到可寫入新的資料集。

no-enviction:當記憶體達到限制的時候,不淘汰任何資料,不可寫入任何資料集,所有引起申請記憶體的命令會報錯。(常用)

淘汰過程:

客戶端發起了需要申請更多記憶體的命令(如set)。

redis檢查記憶體使用情況,如果已使用的記憶體大於maxmemory則開始根據使用者配置的不同淘汰策略來淘汰記憶體(key),從而換取一定的記憶體。

如果上面都沒問題,則這個命令執行成功。否則客戶端報錯

檢視redis記憶體使用情況:info指令

rdb:快照,指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟。預設為dump.rdb

rdb的執行過程:

優點: 檔案小,適合備份 恢復速度快

缺點: 宕機時,丟失的資料多(全量快照部分自然不能執行太頻繁) 需要通過fork子程序方式協助完成持久化,資料量較大時,可能會造成阻塞。

手工指令:

s**e:同步生成rdb檔案

bgs**e:非同步生成rdb檔案

aof的執行過程:

優點: 不易丟失資料

缺點: 體積較大

手工指令:

bgrewriteaof:非同步重寫aof檔案

(面試題)當不小心執行了flushall命令,如何恢復redis資料?

思路:利用redis的aof檔案

步驟:

1.關閉redis服務,shutdown nos**e

2.找到aof檔案,去除flushall命令的那一行

3.啟動redis服務

在redis4.0提供了rdb和aof的混合持久化策略

執行過程:rdb、aof的執行過程不變,只是rdb的快照覆蓋寫入aof檔案,到達了「rdb做全量,aof做增量」的效果

c 之高階特性

一.c 委託 概念 委託是一種引用型別,表示對方法的引用,這個方法是具有特定返回值型別和引數的方法。方式一 通過委託例項呼叫方法 方式二 使用委託把方法作為引數傳遞給其它方法。委託 方式一 的使用步驟 1.宣告委託 語法 delegate 返回值型別 委託名 引數列表 delegate string...

Python之高階特性(2)

一 列表生成式 1 生成abc與def的全排列 2 1 輸出列表裡的名字 並且第乙個字母大寫 2 當列表裡有名字是非法字元時候,輸出列表裡的名字 並且第乙個字母大寫 3 找出指定目錄下以.log結尾的檔案 import os模組 os.listdir 檔名 檢視目錄下面的所有檔案 二 生成器 為什麼...

python學習之高階特性

切片 對列表 元組 字串 字典取中間的一部分,在c中一般是通過for迴圈拷貝 memcpy strcat等操作。而python提供了更方便的切片操作符 m n 前閉後開,如果從0取m可以省略 如果只用 就是切整片 也可以從尾端切片 m 前後的閉區間。列表生成式 list range m,n 構造乙個...