新手向:从不同的角度来详细分析Redis
最近對華為云分布式緩存產(chǎn)品Redis做了一些研究,于是整理了一些基本的知識拿出來與大家分享,首先跟大家分享的是,如何從不同的角度來詳細使用Redis。
小編將從以下9個角度來進行詳細分析,希望可以幫到大家。
一、網(wǎng)絡(luò)模型:
Redis使用單線程的IO復(fù)用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現(xiàn)了epoll、kqueue和select,對于單純只有IO操作來說,單線程可以將速度優(yōu)勢發(fā)揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對于這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調(diào)度都是被阻塞住的。
二、內(nèi)存管理:
Redis使用現(xiàn)場申請內(nèi)存的方式來存儲數(shù)據(jù),并且很少使用free-list等方式來優(yōu)化內(nèi)存分配,會在一定程度上存在內(nèi)存碎片,Redis跟據(jù)存儲命令參數(shù),會把帶過期時間的數(shù)據(jù)單獨存放在一起,并把它們稱為臨時數(shù)據(jù),非臨時數(shù)據(jù)是永遠不會被剔除的,即便物理內(nèi)存不夠,導(dǎo)致swap也不會剔除任何非臨時數(shù)據(jù)(但會嘗試剔除部分臨時數(shù)據(jù)),這點上Redis更適合作為存儲而不是cache。
三、數(shù)據(jù)一致性問題:
在一致性問題上,個人感覺Redis沒有memcached實現(xiàn)的好,Memcached提供了cas命令,可以保證多個并發(fā)訪問操作同一份數(shù)據(jù)的一致性問題。 Redis沒有提供cas 命令,并不能保證這點,不過Redis提供了事務(wù)的功能,可以保證一串命令的原子性,中間不會被任何操作打斷。
四、支持的KEY類型:
Redis除key/value之外,還支持list,set,sorted set,hash等眾多數(shù)據(jù)結(jié)構(gòu),提供了KEYS進行枚舉操作,但不能在線上使用,如果需要枚舉線上數(shù)據(jù),Redis提供了工具可以直接掃描其dump文件,枚舉出所有數(shù)據(jù),Redis還同時提供了持久化和復(fù)制等功能。
五、客戶端支持:
Redis官方提供了豐富的客戶端支持,包括了絕大多數(shù)編程語言的客戶端,比如我此次測試就選擇了官方推薦了Java客戶端Jedis.里面提供了豐富的接口、方法使得開發(fā)人員無需關(guān)系內(nèi)部的數(shù)據(jù)分片、讀取數(shù)據(jù)的路由等,只需簡單的調(diào)用即可,非常方便。
六、數(shù)據(jù)復(fù)制:
從2.8開始,Slave會周期性(每秒一次)發(fā)起一個Ack確認復(fù)制流(replication stream)被處理進度, Redis復(fù)制工作原理詳細過程如下:
1. 如果設(shè)置了一個Slave,無論是第一次連接還是重連到Master,它都會發(fā)出一個SYNC命令;
2. 當(dāng)Master收到SYNC命令之后,會做兩件事:
a) Master執(zhí)行BGSAVE:后臺寫數(shù)據(jù)到磁盤(rdb快照);
b) Master同時將新收到的寫入和修改數(shù)據(jù)集的命令存入緩沖區(qū)(非查詢類);
3. 當(dāng)Master在后臺把數(shù)據(jù)保存到快照文件完成之后,Master會把這個快照文件傳送給Slave,而Slave則把內(nèi)存清空后,加載該文件到內(nèi)存中;
4. 而Master也會把此前收集到緩沖區(qū)中的命令,通過Reids命令協(xié)議形式轉(zhuǎn)發(fā)給Slave,Slave執(zhí)行這些命令,實現(xiàn)和Master的同步;
5. Master/Slave此后會不斷通過異步方式進行命令的同步,達到最終數(shù)據(jù)的同步一致;
6. 需要注意的是Master和Slave之間一旦發(fā)生重連都會引發(fā)全量同步操作。但在2.8之后,也可能是部分同步操作。
2.8開始,當(dāng)Master和Slave之間的連接斷開之后,他們之間可以采用持續(xù)復(fù)制處理方式代替采用全量同步。
Master端為復(fù)制流維護一個內(nèi)存緩沖區(qū)(in-memory backlog),記錄最近發(fā)送的復(fù)制流命令;同時,Master和Slave之間都維護一個復(fù)制偏移量(replication offset)和當(dāng)前Master服務(wù)器ID(Masterrun id)。
當(dāng)網(wǎng)絡(luò)斷開,Slave嘗試重連時:
a. 如果MasterID相同(即仍是斷網(wǎng)前的Master服務(wù)器),并且從斷開時到當(dāng)前時刻的歷史命令依然在Master的內(nèi)存緩沖區(qū)中存在,則Master會將缺失的這段時間的所有命令發(fā)送給Slave執(zhí)行,然后復(fù)制工作就可以繼續(xù)執(zhí)行了;
b. 否則,依然需要全量復(fù)制操作。
七、讀寫分離:
Redis支持讀寫分離,而且使用簡單,只需在配置文件中把Redis讀服務(wù)器和寫服務(wù)器進行配置,多個服務(wù)器使用逗號分開如下:
八、水平動態(tài)擴展:
歷時三年之久,終于等來了期待已由的Redis 3.0。新版本主要是實現(xiàn)了Cluster的功能,增刪集群節(jié)點后會自動的進行數(shù)據(jù)遷移。實現(xiàn) Redis 集群在線重配置的核心就是將槽從一個節(jié)點移動到另一個節(jié)點的能力。因為一個哈希槽實際上就是一些鍵的集合, 所以 Redis 集群在重哈希(rehash)時真正要做的,就是將一些鍵從一個節(jié)點移動到另一個節(jié)點。
九、數(shù)據(jù)淘汰策略:
Redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候,就會施行數(shù)據(jù)淘汰策略。Redis 提供 6種數(shù)據(jù)淘汰策略:
volatile-lru:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰? ?
小編寫的都是一些偏新手向的東西,希望各位大咖見了不要笑話我,作為一個菜鳥也希望能夠幫到其他人,畢竟入這一行著實需要不斷學(xué)習(xí)和總結(jié),如果想進行深入的探討歡迎來華為云社區(qū)論壇發(fā)帖,這里大咖云集,也可以上華為云幫助中心,里面的資料也是精心編寫的干貨。感謝!
轉(zhuǎn)載于:https://www.cnblogs.com/husterindg/p/10615963.html
總結(jié)
以上是生活随笔為你收集整理的新手向:从不同的角度来详细分析Redis的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android进阶:六、在子线程中直接使
- 下一篇: python常用内建函数