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 構造乙個...