Redis 復(fù)盤
一、應(yīng)用層
Redis是內(nèi)存數(shù)據(jù)庫蚕苇、他的所有操作都是在內(nèi)存中去執(zhí)行、所以他效率也非常高凿叠;雖然他也有持久化的操作涩笤、比如 RDB 全量 、AOF 的增量 但是他在不開啟AOF的情況下效率是不會被影響的盒件。而RDB存儲也只是鏡像備份蹬碧,通過fork子線程來操作,所以不影響客戶端對Redis服務(wù)端的讀寫性能炒刁。
RDB提供了分鐘級別的同步刷盤恩沽;如果掛了的情況也會導(dǎo)致分鐘級別的數(shù)據(jù)丟失。存儲是二進(jìn)制的文件存儲空間要比AOF要小翔始。數(shù)據(jù)恢復(fù)也會比AOF要快很多罗心。
AOF提供三種策略:每秒進(jìn)行同步片吊,每修改一次同步,和不同步协屡。如果對數(shù)據(jù)一致性要求強(qiáng)烈的話AOF是再好不過了俏脊。但是存儲占用很大,因為都是字符串肤晓。比如設(shè)置每秒爷贫;如果系統(tǒng)掛了也是1秒的數(shù)據(jù)丟失。
Redis也提供了很豐富的數(shù)據(jù)結(jié)構(gòu)我們可以根據(jù)業(yè)務(wù)情況去選擇比如常用的string/hash/set/list等等....
二补憾、網(wǎng)絡(luò)層
Redis網(wǎng)絡(luò)層是通過單線程Reactor模型來處理客戶端/服務(wù)端連接的漫萄。而Reactor 底層用的IO多路復(fù)用Epoll技術(shù)來實現(xiàn),而Epoll 處理多少連接是受限于系統(tǒng)句柄數(shù),而系統(tǒng)句柄數(shù)受限于系統(tǒng)物理內(nèi)存盈匾,所以在物理內(nèi)存夠用的情況下腾务;能夠處理非常多的連接數(shù);理論上是無上限的。
這也是Redis官網(wǎng)數(shù)據(jù)說能夠秒級處理10WQPS的勇氣削饵。
在Redis6.0以后使用的是多線程來實現(xiàn)岩瘦、其實也是Reactor的加強(qiáng)版;單Reactor多線程,其實彌補了大Key處理的能力窿撬,因為在單Reactor模型的情況下启昧,如果有大Key處理會有阻塞的情況影響了整體處理指令效率,通過多線程來彌補了這個缺點劈伴,提高了整體吞吐率(所以很多時候別人說memcached處理大Key能力優(yōu)于Redis就是用了多線程)密末。
三、存儲層
Redis存儲層有兩種模式分別RDB跛璧、AOF严里;
- RDB 是全量備份存儲的是 key value二進(jìn)制文件,可以設(shè)置1秒同步多少個key追城;如果是在極端的情況下會造成丟失數(shù)據(jù)的可能性刹碾。比如說在通過BGSAVE fork子線程備份期間服務(wù)器掛了。
- AOF 是增量備份 存儲的是 所有語句包括key vale內(nèi)容;文件占用內(nèi)存比較大(不過AOF有個優(yōu)化機(jī)制就是重寫漓柑,定期會把AOF文件合并一次如果多個指令針對同一個Key操作會合并起來 降低冗余存儲壓力)教硫,可以設(shè)置每個指令都刷磁盤,所以在極端的情況下只會丟失1個指令數(shù)據(jù)辆布。就是會性能會非常低瞬矩。
如果系統(tǒng)同時開啟RDB/AOF 其實就是一個NOSQL數(shù)據(jù)庫了、但是在系統(tǒng)掛了恢復(fù)的時候會優(yōu)先使用AOF來恢復(fù)锋玲。
四景用、數(shù)據(jù)結(jié)構(gòu)層
- Redis 數(shù)據(jù)結(jié)構(gòu)是屬于Hash散列結(jié)構(gòu);這種數(shù)據(jù)結(jié)構(gòu)查找時間復(fù)雜度是O(1)的非常快,比如Redis默認(rèn)是有16384的槽位;我一個key存儲的時候,他會通過crc16(Key)%16384去定位到那個槽位去存儲伞插。
- 那么取值的時候也也根據(jù)過crc16(Key)%16384去定位到那個槽位去取數(shù)據(jù)割粮。不像mysql B+數(shù)(時間復(fù)雜度O(logn))的數(shù)據(jù)結(jié)構(gòu)還要通過索引去遍歷,去比較才能夠查到最終的值媚污;在Redis集群的時候比如有三個節(jié)點他會把槽位均衡去分配到各個節(jié)點舀瓢。
五、架構(gòu)層
redis特點就是協(xié)調(diào)者+主從+集群+分片
- 協(xié)調(diào)者:監(jiān)控主從狀態(tài)耗美、如果掛了通過協(xié)調(diào)者做切換達(dá)到故障轉(zhuǎn)移的效果京髓。
- 主從:主從提高性能、可用性商架、主從都可以提供讀能力 分擔(dān)壓力提高吞吐率堰怨、當(dāng)主節(jié)點掛了、可切換從節(jié)點提高可用性蛇摸。
- 集群:多個主從組成小集群备图;主要提高寫能力;畢竟數(shù)據(jù)寫入只有master才能寫赶袄;
- 分片:降低存儲壓力揽涮、把數(shù)據(jù)分片到多個節(jié)點中;擴(kuò)展充分提高存儲能力弃鸦。
六绞吁、Redis缺點
- redis 宕機(jī)可能會造成數(shù)據(jù)丟失問題。
- redis 做分布式鎖唬格;主從切換會導(dǎo)致重復(fù)獲鎖問題。
- redis 高峰20W QPS - 會造成偶發(fā)耗時較長的情況颜说、可能達(dá)到他的瓶頸购岗。如果追求極致性能不建議使用。
- redis 大Key處理可能會導(dǎo)致整體性能下降(畢竟6.0之前的版本都是單線程處理)门粪。
- redis 集群擴(kuò)容需要重新分配槽位;線上擴(kuò)容遷移槽位非常麻煩喊积,帶來不可控風(fēng)險。
- redis 緩存穿透/雪崩問題玄妈、需要通過布隆過濾器乾吻、或者null key、或者分布式鎖來解決拟蜻。
- redis mysql強(qiáng)一致性問題;需要通過Cannl來同步實現(xiàn);讓Cannl作為mysql從節(jié)點;同步binlog文件绎签;Cannl會把binlog轉(zhuǎn)換成json數(shù)據(jù);解析json數(shù)據(jù)再寫到redis中!
七酝锅、使用場景
诡必。。搔扁。爸舒。結(jié)合自己業(yè)務(wù)來看蟋字。