什么是Redis
Redis 是一個開源(BSD許可)的,記憶體中的資料結構存盤系統,它可以用作資料庫、快取和訊息中間件,
它支持多種型別的資料結構,如字串, 散列, 串列, 集合, 有序集合與范圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢,
Redis 內置了復制,LUA腳本, LRU驅動事件,事務和不同級別的磁盤持久化, 并通過 Redis哨兵(Sentinel)和自動磁區(Cluster)提供高可用性,
以上來自redis.cn 上的介紹,簡單的說,Redis是一個支持多種資料結構并且能夠持久化的高性能NoSQL 資料庫,
Redis 的存盤實作
Redis作為一個性能高達10萬qps的key/value存盤型別的NoSQL資料庫,大致的存盤實作體系如下:

一個RedisServer包含了N個redisDb,redisDb有dict的指標和失效時間的指標,核心是dictEntry 指標鏈表的指標,每一個具體的dictEntry鏈表節點存盤了任意型別的key 和 value,不論是key還是value 都可以是redisObject,可以認為,指標鏈表的特性對redis的性能做出重要的作用,
Redis 中的資料結構與存盤實作關系如下:

INT壓縮存盤String,常量數字物件是共享的,SDS 存盤string,變長的字符陣列以及共享的常用字串等,雙端串列LINKEDLIST來存盤list,支持雙向遍歷,HT是hash表,存盤set和hash,根據填充率縮放,支持事件觸發,INTSET壓縮存盤set,編碼為int16_t/ int32_t/ int64_t,SKIPLIST存盤有序集,聯合dict處理zset,ZIPLIST通過雙端指標壓縮存盤hash、list和zset,
Redis存盤實作中的網路模型支持Epoll/Select/Kqueue等,事件模型主要是TimeEvent/FileEvent,由于FileEvent處理器是單執行緒的,所以 redis 是單執行緒的模型,Redis 單執行緒模型是純記憶體操作,核心是基于非阻塞的 IO 多路復用機制,單執行緒反而避免了多執行緒的頻繁背景關系切換問題,因而整體的存盤實作性能很高,
Redis 的常見命令集
Redis 簡潔易用,為了方便記憶,命令集分類如下:



訪問Redis的客戶端型別豐富,幾乎涵蓋了大多數的主流編程語言:

Redis 的集群部署
Redis 自2.4 版本開始就可以在生產環境上穩定可用了,在2.6版本引入了Lua腳本和Watch dog,2.8版本對主從同步進行了優化,并開始支持Sentinel 和 HyperLog,Redis 2.x 的集群主要是通過主從同步實作的,資料是異步復制和增量同步,
有限狀態機在主從同步和資料持久化方面起到了重要的作用,資料持久化是通過快照實作的,通信協議是RESP,一種便于實作和理解的二進制安全協議,AOF 最終通過fsync寫入磁盤實作資料的持久化,
從3.0開始,Redis 支持cluster,cluster內部的各節點間采用的Gossip分布式協議,通過多數原則判斷節點是否宕機,由gossip協議傳播判活資訊,選舉出新的替代者,由gossip協議傳播選舉結果,

Redis 集群可以實作自動故障切換,副本遷移和在線的重新分片,分片變化,資料遷移同樣通過gossip協議達成一致,
然而,Redis cluster 同樣存在著不足,例如隨著節點的增加,故障切換會有大幅的增加,gossip傳播資訊需要一段時間,整機房切換比較慢,按key同步阻塞的遷移對讀寫影響較大,Gossip協議的除錯非常困難,給故障的排除會帶來諸多的不便,
關注redis 的官方網站,可以看到redis 4.0 以來的諸多新變化,
Redis 的常見應用
Redis 的應用十分廣泛,在key/value 的NoSQL中有著突出的性能體現,甚至和檔案型NoSQL——MongoDB 在某些方面有著類似的作用,Redis, Memcache和MongoDB 的對比如下圖所示:

根據用戶標識獲取用戶的相關資料在互聯網應用中是一種常見的場景,這類資料具有讀寫量大,但單條資料不長,并且對某些欄位經常進行更新等特點,一般都會使用redis 這樣型別key/value 資料庫來實作,Redis在記憶體中對數字進行遞增或遞減的操作實作的非常好,集合(Set)和有序集合(Sorted Set)也使得在執行這些操作時非常簡單,Redis正好提供了這兩種資料結構,因而對排行榜類的場景
對于分布式鎖的業務,Redis 可以提供高性能的分布式鎖服務,例如電商業務的秒殺場景,全域自增ID等等,
對于系統架構而言, Redis 有時候甚至成為了快取的代名詞,關于Redis 在分布式快取方面的各種應用,可以參考《深入分布式快取——從原理到應用》一書中的諸多章節,
深入Redis,還可以發現很多有趣的用法,例如將redis 作為訊息佇列等等,一文難以描述Redis,但可以作為全堆疊需要掌握的一個基礎,
最后
私信回復 資料 領取一線大廠Java面試題總結+阿里巴巴泰山手冊+各知識點學習思維導+一份300頁pdf檔案的Java核心知識點總結!
這些資料的內容都是面試時面試官必問的知識點,篇章包括了很多知識點,其中包括了有基礎知識、Java集合、JVM、多執行緒并發、spring原理、微服務、Netty 與RPC 、Kafka、日記、設計模式、Java演算法、資料庫、Zookeeper、分布式快取、資料結構等等,
作者: 半吊子全堆疊工匠

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137671.html
標籤:Java
上一篇:c語言陣列指標
