redis知识归纳
目錄
- Redis有哪些數(shù)據(jù)結(jié)構(gòu)?
- 有大量key需要設(shè)置同一時間過期,需要注意什么?
- Redis分布式鎖怎么回事?
- 假設(shè)Redis里有1億個key,其中有10萬個key是以同一個固定前綴開頭,如何將它們?nèi)空页?#xff1f;
- 如何用Redis做異步隊列?
- Redis是如何持久化的?
Redis有哪些數(shù)據(jù)結(jié)構(gòu)?
String、Hash、List、Set、SortedSet,還有HyperLoglog,Geo,Pub/Sub。
有大量key需要設(shè)置同一時間過期,需要注意什么?
會引發(fā)的問題:
大量的key過期時間設(shè)置過于集中時,過期時間點一到,redis可能會出現(xiàn)短暫的卡頓。嚴重情況下會出現(xiàn)緩存雪崩。
怎么解決:
一般在時間上加一個隨機值,使過期時間分散些。
造成緩存雪崩的說明:
——場景:電商首頁經(jīng)常使用定時任務(wù)刷新緩存。
——特殊情況下:可能大量數(shù)據(jù)失效時間特別集中,如果在失效時間點涌入大量用戶,就有可能造成緩存雪崩。
Redis分布式鎖怎么回事?
先用setnx來爭搶鎖,搶到后,用expire給鎖加一個過期時間來防止忘記釋放鎖。
——特殊情況下:setnx執(zhí)行之后,還沒用expire之前,進程意外crash或者重啟維護了會導(dǎo)致這個鎖永遠得不到釋放。
——建議:set指令有非常復(fù)雜的參數(shù),可以同時把setnx和expire合成一條指令。
假設(shè)Redis里有1億個key,其中有10萬個key是以同一個固定前綴開頭,如何將它們?nèi)空页?#xff1f;
使用keys指令可以掃出指定模式的key列表。
——特殊情況下:如果這個Redis正在給線上的業(yè)務(wù)提供服務(wù)。由于Redis是單線程的特性,keys指令會導(dǎo)致線程阻塞一段時間。線上服務(wù)會停頓,直到keys指令執(zhí)行完畢,服務(wù)才能恢復(fù)。
——建議:使用scan指令,scan指令是可以無阻塞的提取出指定模式的key列表。但是會有一定的重復(fù)概率,需要在客戶端做一次去重。但是整體花費時間會比keys指令長。
如何用Redis做異步隊列?
一般使用list結(jié)構(gòu)作為隊列,rpush生產(chǎn)消息,lpop消費消息。
——特殊情況下:當(dāng)lpop沒有消息的時候。
——建議:要適當(dāng)sleep一會再重試,或者使用blpop阻塞住直到有消息到來。
——能不能生產(chǎn)一次消費多次?使用pub/sub主題訂閱者模式,可以實現(xiàn)1:N的消息隊列。
Redis是如何持久化的?
RDB做鏡像全量持久化,AOF做增量持久化。
在redis重啟實例時,會使用RDB持久化文件,重新構(gòu)建內(nèi)存,再使用AOF重放近期的操作指令,來實現(xiàn)完整恢復(fù)到重啟前狀態(tài)。
可以把RDB理解為一整個表全量的數(shù)據(jù),AOF理解為每次操縱的日志。
——特殊情況下:機器掉電數(shù)據(jù)會怎么樣?取決于AOF日志sync屬性的配置。
——建議:不要求性能情況下,每條寫指令時都sync一下磁盤,就不會丟失數(shù)據(jù);高性能要求下,一般使用定時sync,比如1秒一次,這時候最多丟失1秒的數(shù)據(jù)。
參考來源:掘金-敖丙-redis基礎(chǔ)
總結(jié)
- 上一篇: java网页解析包_java 网页解析工
- 下一篇: 初探EntityFramework——来