1.Redis中的數(shù)據(jù)結(jié)構(gòu)
答:字符串String叮称、字典Hash酣藻、列表List、集合Set程储、有序集合SortedSet蹭沛、HyperLogLog(基數(shù)統(tǒng)計)、Geo(地理位置)章鲤、Pub/Sub(發(fā)布訂閱)摊灭。Redis Module、RedisSearch败徊、Redis-ML是什么鬼帚呼,后續(xù)要學習一下。BlomFilter過濾器即多個Hash函數(shù)判定一個Key是否存在皱蹦,在允許一定誤判場景下煤杀,BloomFilter是有用的,擴展BloomFilter等沪哺。
2.Redis分布式鎖
setnx + expire命令或者set ex nx命令沈自,推薦使用后者。因為辜妓,setnx + expire為兩條指令并非原子操作枯途,在setnx命令執(zhí)行成功,expire命令執(zhí)行失敗的情況下會導(dǎo)致該key被一直鎖住籍滴,因為平常使用分布式鎖時酪夷,推薦使用set ex nx命令的原子操作。
3. Redis key處理相關(guān)
Redis中提供了keys命令可以我們按照指定模式進行key查找异逐。例如捶索,查找某一前綴的所有key,可以這么搞keys prefix灰瞻。像這種按模式匹配key查找的命令是要進行整個鍵空間的掃描的且Redis是單線程的腥例,掃描大量的鍵空間,會導(dǎo)致線上服務(wù)停頓酝润,直到該指令執(zhí)行完畢燎竖,服務(wù)才能恢復(fù)。通常采用scan這種無阻塞的方法進行整個鍵空間的增量式迭代要销。例如构回,scan mykey 0 match prefix,返回指定匹配模式的鍵疏咐,采用這種方法可能存在key重復(fù)的情況纤掸,應(yīng)用程序代碼中需要進行去重處理。
4.Redis異步隊列
Redis中一般使用List作為隊列浑塞,rpush生產(chǎn)消息借跪,lpop消費消息,阻塞式消費消息采用blpop或brpop命令酌壕。如果需要實現(xiàn)一對多的生產(chǎn)消費掏愁,則需要結(jié)合Redis的Pub/Sub發(fā)布訂閱機制,實現(xiàn)1:N的消息隊列卵牍。使用發(fā)布訂閱機制果港,在消費者下線的情況下,生產(chǎn)的消息將會丟失糊昙,必須使用專業(yè)的消息隊列辛掠。
Redis中延時隊列的實現(xiàn)方法:采用sortedset(有序集合),其中score值采用時間戳释牺,應(yīng)用程序代碼按照時間段輪詢萝衩,每次通過sortedset提供的zrangebyscore命令獲取某段時間內(nèi)相關(guān)的key,進行相應(yīng)處理
5. Redis過期處理
Redis在處理某一時刻大量key過期的情況下船侧,會存在短暫的卡頓現(xiàn)象欠气。正確地設(shè)置過期時間的方法是在某一固定時間的基礎(chǔ)上增加一個隨機偏移。
6. Redis持久化
bgsave做鏡像全量持久化镜撩,aof做增量持久化预柒。因為bgsave會耗費較長時間,不夠?qū)崟r袁梗,在停機的時候會導(dǎo)致大量丟失數(shù)據(jù)宜鸯,所以需要aof來配合使用。在redis實例重啟時遮怜,優(yōu)先使用aof來恢復(fù)內(nèi)存的狀態(tài)淋袖,如果沒有aof日志,就會使用rdb文件來恢復(fù)锯梁。
如果再問aof文件過大恢復(fù)時間過長怎么辦即碗?你告訴面試官焰情,Redis會定期做aof重寫,壓縮aof文件日志大小剥懒。如果面試官不夠滿意内舟,再拿出殺手锏答案,Redis4.0之后有了混合持久化的功能初橘,將bgsave的全量和aof的增量做了融合處理验游,這樣既保證了恢復(fù)的效率又兼顧了數(shù)據(jù)的安全性。這個功能甚至很多面試官都不知道保檐,他們肯定會對你刮目相看耕蝉。
如果對方追問那如果突然機器掉電會怎樣?取決于aof日志sync屬性的配置夜只,如果不要求性能垒在,在每條寫指令時都sync一下磁盤,就不會丟失數(shù)據(jù)盐肃。但是在高性能的要求下每次都sync是不現(xiàn)實的爪膊,一般都使用定時sync,比如1s1次砸王,這個時候最多就會丟失1s的數(shù)據(jù)推盛。
如果對方追問bgsave的原理是什么?你給出兩個詞匯就可以了谦铃,fork和cow耘成。fork是指redis通過創(chuàng)建子進程來進行bgsave操作,cow指的是copy on write驹闰,子進程創(chuàng)建后瘪菌,父子進程共享數(shù)據(jù)段,父進程繼續(xù)提供讀寫服務(wù)嘹朗,寫臟的頁面數(shù)據(jù)會逐漸和子進程分離開來师妙。
7. Redis pipeline
Redis pipeline可以將多次I/O往返的時間縮減為一次,能夠使用pipeline的前提是各個指令之間沒有因果關(guān)系屹培。redis-benchmark進行壓測的時候顯示影響redis qps峰值的一個重要因素是pipeline批次指令的數(shù)目默穴。
8. Redis同步機制
Redis可以使用主從同步,從從同步褪秀。第一次同步時蓄诽,主節(jié)點做一次bgsave,并同時將后續(xù)修改操作記錄到內(nèi)存buffer媒吗,待完成后將rdb文件全量同步到復(fù)制節(jié)點仑氛,復(fù)制節(jié)點接受完成后將rdb鏡像加載到內(nèi)存。加載完成后,再通知主節(jié)點將期間修改的操作記錄同步到復(fù)制節(jié)點進行重放就完成了同步過程锯岖。
9. Redis集群
Redis Sentinal著眼于高可用介袜,在master宕機時自動將slave提升為master,繼續(xù)提供服務(wù)嚎莉。
Redis Cluster著眼于擴展性米酬,在單機內(nèi)存不足的情況下沛豌,使用Cluster進行數(shù)據(jù)分片存儲趋箩。