《redis設計與實現》
提高系統架構的效能,增加快取層是常見的優化方式,redis和memcache是當前採用較多的快取元件,redis被稱為資料結構資料庫
redis和memcache的區別:
redis和memcahce都是基於記憶體的key-value儲存
memcache的事件模型是多執行緒reactor模型, 效能更好,但是隻支援一種key-value型別,複雜的資料結構需要使用者自己做序列化
redis是單執行緒,但是支援更多的資料結構,並且支援持久化和主從複製
redis常作為網際網路高併發請時的中介軟體,但是會有以下常見的三種問題:
1.快取穿透:查詢的資料不存在,快取和資料庫中都沒有,大量的這種請求就會對資料庫造成壓力
解決方案:
a.使用布隆過濾器,即點陣圖bitmap,儘可能將所有可能的不存在資料都儲存下來,過濾掉不存在的請求
b.即使資料不存在,也要新增到redis快取裡,將value設成空,避免頻繁訪問資料庫
2.快取擊穿:查詢的某一條熱點資料在快取中已過期,此時有大量針對此條資料的訪問,由於快取查詢不到會造成都到資料庫中查詢,導致資料庫壓力飆升
解決方案:
a.利用redis自帶的setnx實現分散式鎖,當key已過期時,加上分散式鎖,獲取到鎖就到資料庫中查詢並更新快取,獲取不到鎖說明有其他執行緒已經在查詢資料庫,睡眠一會嘗試再次從redis快取中查詢
3.快取雪崩:當redis重啟或者大量key同時全部過期,此時若有大量請求,稱為快取雪崩,會對資料庫造成更大的壓力
解決方案:
a.和快取擊穿一樣,使用分散式鎖或者佇列減輕資料庫壓力,但是會造成請求堵塞
b.針對大量key全部過期這種,可以在設定過期時間設定隨機值,防止同時過期
以下是redis的部分實現:
1.獨有字串結構封裝,大概類似std::string的實現,自動擴充套件,動態伸縮
2.redis字典使用雜湊表,兩張雜湊表支援rehash重新雜湊,採用漸進rehash,大量資料不能一次性重新雜湊完畢
3.redis使用的資料結構有動態字串、雙端連結串列、雜湊表、跳躍表、整數集合、壓縮列表
4.redis為鍵值儲存,鍵都是字串,值有五大物件,字串物件(SET)、列表物件(RPUSH)、雜湊物件(HSET)、集合物件(SADD)、有序集合物件(ZADD)
5.每種物件都有2種編碼方式,有序集合列表中可以使用整數集合或者ZSET結構,ZSET結構是由跳躍表加字典方式實現,跳躍表保證集合有序,插入logn,字典保證訪問O1
6.過期刪除支援毫秒、秒、具體時間,過期鍵刪除方式是惰性刪除加定期刪除
7.rdb支援手動備份,save阻塞,bgsave子程式建立不阻塞,rdb儲存資料結構,aof儲存命令可能重複,所以支援aof重寫採用子程式加重寫緩衝區去重
兩種持久化方式的區別:
rdb方式為定時快照方式,一次性儲存記憶體中所有資料,採用子程式不阻塞主程式,無資料重複,體積小,重新載入恢復也快,缺點是定時儲存過程中出現當機,相比aof會丟失更多資料
aof方式每條命令都會立刻重新整理到aof檔案裡,資料儲存更完整,缺點是當機後重新載入檔案相比rdb較慢,另外aof開啟了強制同步磁碟的話redis效能相較rdb稍微有所降低
8.redis採用事件驅動,分為檔案事件和時間事件,其中檔案事件就是reactor模型,為單執行緒reactor模型(I/O多路複用+非阻塞I/O)
為什麼redis是單執行緒?
因為redis是純記憶體操作,並且內部資料結構設計的比較好,且內部耗時操作都採用子程式操作,所以cpu不是redis的瓶頸,既然cpu不是redis瓶頸,單執行緒又能減少鎖競爭消耗,所以使用單執行緒
8.redis支援主從複製、哨兵叢集、叢集節點部署
主從複製:提供資料備份功能,從節點複製主節點資料,但是隻有主節點提供服務,主節點當機,從節點立刻轉主,選主演算法是raft演算法,最先獲得其他半數以上節點支援的成為主節點
哨兵:redis高可用方案,負責主從複製故障轉移
叢集節點:每個節點都提供服務,每個節點協商分別處理不同的槽,也可以和主從複製結合使用,因為redis是單執行緒,當資料量大的時候,可以採用redis叢集多程式的方式加大吞吐量
9.redis也支援釋出與訂閱,可以用作訊息中介軟體,但是效率應該沒有kafka好
10.redis支援事務,具有原子性、一致性、永續性,但是redis不支援事務回滾,如果事務處理過程中某一條指令報錯,後續指令會繼續執行
11.redis還支援lua語言、排序、二進位制陣列、慢查詢、監視器
相關文章
- Redis設計與實現Redis
- Redis 設計與實現 4:字典Redis
- Redis 設計與實現 (九)--LuaRedis
- <Redis設計與實現>筆記【轉】Redis筆記
- Redis 設計與實現:資料庫Redis資料庫
- Redis 設計與實現 3:字串 SDSRedis字串
- Redis 設計與實現 (七)--事務Redis
- Redis | 第7章 Redis 伺服器《Redis設計與實現》Redis伺服器
- Redis 設計與實現 5:壓縮列表Redis
- Redis | 第12章 Sentinel 哨兵模式《Redis設計與實現》Redis模式
- 《redis設計與實現》2-資料庫實現篇Redis資料庫
- 《Redis設計與實現》知識點目錄Redis
- Redis設計與實現學習筆記(一)Redis筆記
- Redis 設計與實現 (六)--釋出訂閱Redis
- 帶讀 |《Redis 設計與實現》(英文名:The Design and Implementation of Redis)Redis
- Redis(設計與實現):---釋出與訂閱介紹Redis
- Redis 設計與實現 (五)--多機資料庫的實現Redis資料庫
- 探索Redis設計與實現12:淺析Redis主從複製Redis
- 探索Redis設計與實現15:Redis分散式鎖進化史Redis分散式
- Redis | 第5章 Redis 中的持久化技術《Redis設計與實現》Redis持久化
- 《Redis設計與實現》筆記 -- 資料結構與物件Redis筆記資料結構物件
- 探索Redis設計與實現14:Redis事務淺析與ACID特性介紹Redis
- 《redis設計與實現》1-資料結構與物件篇Redis資料結構物件
- Redis設計於實現之字典Redis
- 探索Redis設計與實現10:Redis的事件驅動模型與命令執行過程Redis事件模型
- 簡讀筆記-Redis設計與實現第二章筆記Redis
- 探索Redis設計與實現2:Redis內部資料結構詳解——dictRedis資料結構
- 探索Redis設計與實現3:Redis內部資料結構詳解——sdsRedis資料結構
- 探索Redis設計與實現4:Redis內部資料結構詳解——ziplistRedis資料結構
- 探索Redis設計與實現5:Redis內部資料結構詳解——quicklistRedis資料結構UI
- 探索Redis設計與實現6:Redis內部資料結構詳解——skiplistRedis資料結構
- 探索Redis設計與實現7:Redis內部資料結構詳解——intsetRedis資料結構
- 探索Redis設計與實現1:Redis 的基礎資料結構概覽Redis資料結構
- Redis設計與實現閱讀總結(二)單機資料庫的實現Redis資料庫
- 簡讀筆記-Redis設計與實現第四章筆記Redis
- 簡讀筆記-Redis設計與實現第三章筆記Redis
- Redis(設計與實現):---叢集之ASK錯誤、ASKING命令、REDIS_ASKING標識Redis
- Redis | 第一部分:資料結構與物件 上篇《Redis設計與實現》Redis資料結構物件