此文純屬個(gè)人筆記
redis知識點(diǎn):
- 5種數(shù)據(jù)結(jié)構(gòu)
- 主從復(fù)制
- 哨兵模式
- 持久化
1. 5種數(shù)據(jù)結(jié)構(gòu):
(1)String(字符串):
應(yīng)用場景:微博數(shù)碟案,粉絲數(shù)价说;set key value; get key
(2)Hash(哈希)鳖目;應(yīng)用場景:存儲(chǔ)部分變更的數(shù)據(jù)领迈,如用戶信息等。
我們可以將hashes 類型看成具有string key 和string value的map容器;
(3)list(列表):應(yīng)用場景 消息隊(duì)列系統(tǒng)尘喝,比如sina微博朽褪。
list類型是按照插入順序排序的字符串鏈表缔赠。和數(shù)據(jù)結(jié)構(gòu)中的普通鏈表一樣戴质,我們可以在其頭部和尾部添加新的元素置森。在插入時(shí)凫海,如果該鍵并不存在行贪,redis將為該鍵創(chuàng)建一個(gè)新的鏈表。 rpush key [value]
(4)set(無序集合):應(yīng)用場景:在微博應(yīng)用中啰脚,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合荸实;redis還為集合提供了求交集准给、并集露氮、差集等操作畔规,可以非常方便的實(shí)現(xiàn)如共同關(guān)注详民、共同喜歡沈跨、二度好友等功能,對上面的所有集合操作涧窒,你還可以使用不同的命令選擇將結(jié)果返回給客戶端還是存到一個(gè)新的集合中;
sadd key number1 number2
smembers key 返回key 中所有元素
sismember key number 判斷number是否是集合key的成員
sdiff key1 key2 獲取集合的差集
sinter key1 key2 返回兩集合的交集
sunion key1 key2 返回兩集合的并集
(5)sorted-sets (有序集合):sorted-sets中的每一個(gè)成員都會(huì)有一個(gè)分?jǐn)?shù)與之關(guān)聯(lián)锭亏,redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序纠吴,成員是唯一的,但是分?jǐn)?shù)卻是可以重復(fù)的慧瘤;集合是通過哈希表 實(shí)現(xiàn)的戴已,所以添加,刪除糖儡,查找的復(fù)雜度都是O(1),集合中最大的成員數(shù)為232-1
2. 主從復(fù)制
主從:主對于數(shù)據(jù)可讀可寫怔匣,從默認(rèn)只讀不寫握联。當(dāng)從連接上主時(shí),主會(huì)將數(shù)據(jù)同步到從上每瞒;
redis是怎么實(shí)現(xiàn)主從的數(shù)據(jù)同步的金闽?
全量同步
1)從服務(wù)器連接到主服務(wù)器,發(fā)送SYNC命令独泞;
2)主服務(wù)器接收到sync命名后呐矾,開始執(zhí)行bgsave命令生成RDB文件并使用緩沖區(qū)記錄此后執(zhí)行的所有寫命令;
3)主服務(wù)器bgsave執(zhí)行完后懦砂,向所有從服務(wù)器發(fā)送快照文件,并在發(fā)送期間繼續(xù)記錄被執(zhí)行的寫命令组橄;
4)從服務(wù)器收到快照文件后丟棄所有舊數(shù)據(jù)荞膘,載入收到的快照;
5)主服務(wù)器快照發(fā)送完畢后開始向從服務(wù)器發(fā)送緩沖區(qū)中的寫命令玉工;
6)從服務(wù)器完成對快照對載入羽资,開始接收命令請求,并執(zhí)行來自主服務(wù)器緩沖區(qū)對寫命令遵班;
增量同步:
假設(shè)發(fā)送網(wǎng)絡(luò)抖動(dòng)或者別的情況屠升,暫時(shí)失去了連接潮改,等slave重新連上的時(shí)候,slave向master發(fā)送自己的offset和runid主服務(wù)器把自己擠壓緩沖區(qū)里面偏移量在offset之后的數(shù)據(jù)全部同步給從服務(wù)器腹暖。
3.哨兵模式:監(jiān)控redis系統(tǒng)的運(yùn)行狀況汇在;
redis的哨兵系統(tǒng)用于管理多個(gè)redis服務(wù)器,該系統(tǒng)執(zhí)行以下三個(gè)任務(wù):
a.監(jiān)控:哨兵會(huì)不斷檢查你的Master和slave是否運(yùn)作正常脏答;
b.提醒:當(dāng)被監(jiān)控的某個(gè)redis出現(xiàn)問題時(shí)糕殉,哨兵可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知
c.自動(dòng)故障遷移,當(dāng)一個(gè)master不能正常工作時(shí)殖告,哨兵會(huì)開始一次自動(dòng)故障遷移操作阿蝶,它會(huì)將失效, master的其中一個(gè)slave升級為新的master,并讓失效master的其他撒略改為復(fù)制新的master黄绩。當(dāng)客戶端試圖連接失效的master時(shí)羡洁,集群也會(huì)向客戶端返回新的master的地址,使得集群可以使用新的master爽丹;
4.redis持久化
redis 提供了多種不同級別的持久化方式:一種是RDB焚廊,另一種是AOF
A. RDB持久化:
可以在指定的時(shí)間間隔內(nèi)生成數(shù)據(jù)集的時(shí)間點(diǎn)快照,RDB是一個(gè)非常緊湊的文件习劫,它保存另redis在某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)集咆瘟,這種文件非常適合用于進(jìn)行備份,比如說诽里,你可以在最近的24小時(shí)內(nèi)袒餐,每小時(shí)備份一次RDB文件,并且在每個(gè)月的每一天谤狡,也備份一個(gè)RDB文件灸眼。RDB非常適用于災(zāi)難恢復(fù):它只有一個(gè)文件,并且內(nèi)容非常緊湊墓懂,可以(在加密后)將它傳到別的數(shù)據(jù)中焰宣。RDB可以最大化redis的性能:父進(jìn)程在保存RDB文件時(shí)唯一要做的就是fork出一個(gè)子進(jìn)程,然后這個(gè)子進(jìn)程就會(huì)處理接下來所有保存工作捕仔,父進(jìn)程無須執(zhí)行任何磁盤I/O操作匕积;RDB 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比AOF的恢復(fù)速度快
B. AOF持久化
(1)使用AOF會(huì)讓你的redis更加耐久,你可以使用不同的fsync策略榜跌,無fsync闪唆,每秒fsync,每次寫的時(shí)候fsync钓葫,使用默認(rèn)的每秒fsync策略悄蕾,redis的性能依然會(huì)好(fsync是由后臺線程進(jìn)行處理的,主線程會(huì)盡力處理客戶端請求)础浮,一旦出現(xiàn)故障帆调,最多丟失1秒的數(shù)據(jù)奠骄。
(2)redis可以在aof文件體積變得過大時(shí),自動(dòng)的在后臺對AOF進(jìn)行重寫:重寫后的新AOF文件包含另恢復(fù)當(dāng)前數(shù)據(jù)所需的最小命令集合番刊,整個(gè)重寫操作是絕對安全的因?yàn)閞edis在創(chuàng)建新AOF文件的過程中含鳞,會(huì)繼續(xù)將命令追加到現(xiàn)有的AOF文件里面,即使重寫過程中發(fā)生停機(jī)撵枢,現(xiàn)有AOF文件也不會(huì)丟失,一旦新AOF文件創(chuàng)建完畢民晒,redis就會(huì)從舊AOF文件切換到新AOF文件,并開始對新AOF文件進(jìn)行追加操作锄禽。AOF文件有序的保存了對數(shù)據(jù)庫執(zhí)行的所有寫入操作潜必,這些寫入操作以redis協(xié)議的格式保存,因此AOF文件的內(nèi)容非常容易被人讀懂沃但,對文件進(jìn)行分析也很輕松磁滚,導(dǎo)出aof文件也非常簡單。
當(dāng)redis啟動(dòng)時(shí)宵晚,如果rdb持久化和aof持久化都被打開了垂攘,那么程序會(huì)優(yōu)先使用AOF,因?yàn)閍of保存當(dāng)數(shù)據(jù)通常是最完整的;
缺點(diǎn):對于相同對數(shù)據(jù)集來說淤刃,AOF文件的體積通常要大于RDB文件的體積
- 什么是緩存穿透晒他、緩存擊穿、緩存雪崩 以及他們的解決方式逸贾?
(1)緩存穿透:大量請求中的key不存在redis中陨仅,會(huì)造成大量請求訪問數(shù)據(jù)庫,造成數(shù)據(jù)庫崩潰
解決方法:做參數(shù)校驗(yàn)铝侵,將一些請求不合法的請求參數(shù)拋出異常返回給前端灼伤;如果請求的key不頻繁變化的話,第一次在緩存和數(shù)據(jù)庫中都查不到的話咪鲜,就存到redis中狐赡,設(shè)置value為null; 布隆過濾器
(2)緩存雪崩 :緩存在同一時(shí)間失效,致使全部請求落到數(shù)據(jù)庫上
解決方法:隨機(jī)設(shè)置過期時(shí)間