乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      全棧必備 Redis基礎(chǔ)

       DuerOS布道師 2021-04-29

      在《老碼農(nóng)眼中的簡(jiǎn)明AI》一文中提到了圖靈機(jī)和馮諾伊曼的計(jì)算機(jī)體系結(jié)構(gòu),數(shù)據(jù)存儲(chǔ)是整個(gè)計(jì)算機(jī)軟件系統(tǒng)中的一個(gè)關(guān)鍵節(jié)點(diǎn)。從個(gè)人電腦上的軟件到基于計(jì)算機(jī)網(wǎng)絡(luò)的分布式系統(tǒng),存儲(chǔ)系統(tǒng)更是基礎(chǔ)環(huán)節(jié),而且還承擔(dān)著整個(gè)系統(tǒng)的數(shù)據(jù)責(zé)任。

      應(yīng)用程序離不開數(shù)據(jù)存儲(chǔ),關(guān)系型數(shù)據(jù)庫的誕生為軟件系統(tǒng)的發(fā)展揭開了一個(gè)新的時(shí)代,而互聯(lián)網(wǎng)應(yīng)用中大量的非結(jié)構(gòu)化數(shù)據(jù)為非關(guān)系型數(shù)據(jù)庫——NoSQL,提供了廣泛的應(yīng)用場(chǎng)景。

      NoSQL 技術(shù)與高伸縮性無縫融合,很多技術(shù)同時(shí)具備了高分布性和高性能, 也是大數(shù)據(jù)分析的存儲(chǔ)基石。大多數(shù)時(shí)間里,它們使 現(xiàn)有RDBMS 技術(shù)所實(shí)現(xiàn)的架構(gòu)更加完整,例如 作為緩存服務(wù)器,搜索引擎,非結(jié)構(gòu)化存儲(chǔ),易變信息存儲(chǔ)等。大約可以分為4類:

      • Key/value型NoSQL

      • 列存儲(chǔ)型NoSQL

      • 面向文檔的存儲(chǔ)型NoSQL

      • 圖存儲(chǔ)型NoSQL

      關(guān)于這些NoSQL 的應(yīng)用場(chǎng)景可以參見《NoSQL 之于大數(shù)據(jù)》。

      面對(duì)這些NoSQL, 如果只需掌握一種NoSQL,那可能就是key/value型的Redis了。

      什么是Redis

      Redis 是一個(gè)開源(BSD許可)的,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),它可以用作數(shù)據(jù)庫、緩存和消息中間件。

      它支持多種類型的數(shù)據(jù)結(jié)構(gòu),如字符串, 散列, 列表, 集合, 有序集合與范圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 

      Redis 內(nèi)置了復(fù)制,LUA腳本, LRU驅(qū)動(dòng)事件,事務(wù)和不同級(jí)別的磁盤持久化, 并通過 Redis哨兵(Sentinel)和自動(dòng)分區(qū)(Cluster)提供高可用性。

      以上來自 上的介紹,簡(jiǎn)單的說,Redis是一個(gè)支持多種數(shù)據(jù)結(jié)構(gòu)并且能夠持久化的高性能NoSQL 數(shù)據(jù)庫。

      Redis 的存儲(chǔ)實(shí)現(xiàn)

      Redis作為一個(gè)性能高達(dá)10萬qps的key/value存儲(chǔ)類型的NoSQL數(shù)據(jù)庫,大致的存儲(chǔ)實(shí)現(xiàn)體系如下:

      一個(gè)RedisServer包含了N個(gè)redisDb,redisDb有dict的指針和失效時(shí)間的指針,核心是dictEntry 指針鏈表的指針,每一個(gè)具體的dictEntry鏈表節(jié)點(diǎn)存儲(chǔ)了任意類型的key 和 value,不論是key還是value 都可以是redisObject。可以認(rèn)為,指針鏈表的特性對(duì)redis的性能做出重要的作用。

      Redis 中的數(shù)據(jù)結(jié)構(gòu)與存儲(chǔ)實(shí)現(xiàn)關(guān)系如下:

      INT壓縮存儲(chǔ)String,常量數(shù)字對(duì)象是共享的。SDS 存儲(chǔ)string,變長的字符數(shù)組以及共享的常用字符串等。雙端列表LINKEDLIST來存儲(chǔ)list,支持雙向遍歷。HT是hash表,存儲(chǔ)set和hash,根據(jù)填充率縮放,支持事件觸發(fā)。INTSET壓縮存儲(chǔ)set,編碼為int16_t/ int32_t/ int64_t。SKIPLIST存儲(chǔ)有序集,聯(lián)合dict處理zset。ZIPLIST通過雙端指針壓縮存儲(chǔ)hash、list和zset。

      Redis存儲(chǔ)實(shí)現(xiàn)中的網(wǎng)絡(luò)模型支持Epoll/Select/Kqueue等,事件模型主要是TimeEvent/FileEvent。由于FileEvent處理器是單線程的,所以 redis 是單線程的模型。Redis 單線程模型是純內(nèi)存操作,核心是基于非阻塞的 IO 多路復(fù)用機(jī)制,單線程反而避免了多線程的頻繁上下文切換問題,因而整體的存儲(chǔ)實(shí)現(xiàn)性能很高。

      Redis 的常見命令集

      Redis 簡(jiǎn)潔易用,為了方便記憶,命令集分類如下: 

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

      Redis 的集群部署

      Redis 自2.4 版本開始就可以在生產(chǎn)環(huán)境上穩(wěn)定可用了,在2.6版本引入了Lua腳本和Watch dog,2.8版本對(duì)主從同步進(jìn)行了優(yōu)化,并開始支持Sentinel 和 HyperLog。Redis 2.x 的集群主要是通過主從同步實(shí)現(xiàn)的,數(shù)據(jù)是異步復(fù)制和增量同步。

      有限狀態(tài)機(jī)在主從同步和數(shù)據(jù)持久化方面起到了重要的作用。數(shù)據(jù)持久化是通過快照實(shí)現(xiàn)的,通信協(xié)議是RESP,一種便于實(shí)現(xiàn)和理解的二進(jìn)制安全協(xié)議。AOF 最終通過fsync寫入磁盤實(shí)現(xiàn)數(shù)據(jù)的持久化。

      從3.0開始,Redis 支持cluster,cluster內(nèi)部的各節(jié)點(diǎn)間采用的Gossip分布式協(xié)議。通過多數(shù)原則判斷節(jié)點(diǎn)是否宕機(jī),由gossip協(xié)議傳播判活信息,選舉出新的替代者,由gossip協(xié)議傳播選舉結(jié)果。

      Redis 集群可以實(shí)現(xiàn)自動(dòng)故障切換,副本遷移和在線的重新分片。分片變化,數(shù)據(jù)遷移同樣通過gossip協(xié)議達(dá)成一致。

      然而,Redis cluster 同樣存在著不足,例如隨著節(jié)點(diǎn)的增加,故障切換會(huì)有大幅的增加,gossip傳播信息需要一段時(shí)間,整機(jī)房切換比較慢。按key同步阻塞的遷移對(duì)讀寫影響較大,Gossip協(xié)議的調(diào)試非常困難,給故障的排除會(huì)帶來諸多的不便。

      關(guān)注redis 的官方網(wǎng)站,可以看到redis 4.0 以來的諸多新變化。

      Redis 的常見應(yīng)用

      Redis 的應(yīng)用十分廣泛,在key/value 的NoSQL中有著突出的性能體現(xiàn),甚至和文檔型NoSQL——MongoDB 在某些方面有著類似的作用。Redis, Memcache和MongoDB 的對(duì)比如下圖所示: 

      根據(jù)用戶標(biāo)識(shí)獲取用戶的相關(guān)數(shù)據(jù)在互聯(lián)網(wǎng)應(yīng)用中是一種常見的場(chǎng)景,這類數(shù)據(jù)具有讀寫量大,但單條數(shù)據(jù)不長,并且對(duì)某些字段經(jīng)常進(jìn)行更新等特點(diǎn),一般都會(huì)使用redis 這樣類型key/value 數(shù)據(jù)庫來實(shí)現(xiàn)。Redis在內(nèi)存中對(duì)數(shù)字進(jìn)行遞增或遞減的操作實(shí)現(xiàn)的非常好。集合(Set)和有序集合(Sorted Set)也使得在執(zhí)行這些操作時(shí)非常簡(jiǎn)單,Redis正好提供了這兩種數(shù)據(jù)結(jié)構(gòu),因而對(duì)排行榜類的場(chǎng)景

      對(duì)于分布式鎖的業(yè)務(wù),Redis 可以提供高性能的分布式鎖服務(wù),例如電商業(yè)務(wù)的秒殺場(chǎng)景,全局自增ID等等。

      對(duì)于系統(tǒng)架構(gòu)而言, Redis 有時(shí)候甚至成為了緩存的代名詞,關(guān)于Redis 在分布式緩存方面的各種應(yīng)用,可以參考《深入分布式緩存——從原理到應(yīng)用》一書中的諸多章節(jié)。

      深入Redis,還可以發(fā)現(xiàn)很多有趣的用法,例如將redis 作為消息隊(duì)列等等,一文難以描述Redis,但可以作為全棧需要掌握的一個(gè)基礎(chǔ)。

      【參考閱讀】

        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多