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