最近對華爲雲分佈式緩存產品Redis作了一些研究,因而整理了一些基本的知識拿出來與你們分享,首先跟你們分享的是,如何從不一樣的角度來詳細使用Redis。html
小編將從如下9個角度來進行詳細分析,但願能夠幫到你們。編程
1、網絡模型:緩存
Redis使用單線程的IO複用模型,本身封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有IO操做來講,單線程能夠將速度優點發揮到最大,可是Redis也提供了一些簡單的計算功能,好比排序、聚合等,對於這些操做,單線程模型實際會嚴重影響總體吞吐量,CPU計算過程當中,整個IO調度都是被阻塞住的。服務器
2、內存管理:網絡
Redis使用現場申請內存的方式來存儲數據,而且不多使用free-list等方式來優化內存分配,會在必定程度上存在內存碎片,Redis跟據存儲命令參數,會把帶過時時間的數據單獨存放在一塊兒,並把它們稱爲臨時數據,非臨時數據是永遠不會被剔除的,即使物理內存不夠,致使swap也不會剔除任何非臨時數據(但會嘗試剔除部分臨時數據),這點上Redis更適合做爲存儲而不是cache。數據結構
3、數據一致性問題:併發
在一致性問題上,我的感受Redis沒有memcached實現的好,Memcached提供了cas命令,能夠保證多個併發訪問操做同一份數據的一致性問題。 Redis沒有提供cas 命令,並不能保證這點,不過Redis提供了事務的功能,能夠保證一串命令的原子性,中間不會被任何操做打斷。框架
4、支持的KEY類型:dom
Redis除key/value以外,還支持list,set,sorted set,hash等衆多數據結構,提供了KEYS進行枚舉操做,但不能在線上使用,若是須要枚舉線上數據,Redis提供了工具能夠直接掃描其dump文件,枚舉出全部數據,Redis還同時提供了持久化和複製等功能。異步
5、客戶端支持:
Redis官方提供了豐富的客戶端支持,包括了絕大多數編程語言的客戶端,好比我這次測試就選擇了官方推薦了Java客戶端Jedis.裏面提供了豐富的接口、方法使得開發人員無需關係內部的數據分片、讀取數據的路由等,只需簡單的調用便可,很是方便。
6、數據複製:
從2.8開始,Slave會週期性(每秒一次)發起一個Ack確認複製流(replication stream)被處理進度, Redis複製工做原理詳細過程以下:
1. 若是設置了一個Slave,不管是第一次鏈接仍是重連到Master,它都會發出一個SYNC命令;
2. 當Master收到SYNC命令以後,會作兩件事:
a) Master執行BGSAVE:後臺寫數據到磁盤(rdb快照);
b) Master同時將新收到的寫入和修改數據集的命令存入緩衝區(非查詢類);
3. 當Master在後臺把數據保存到快照文件完成以後,Master會把這個快照文件傳送給Slave,而Slave則把內存清空後,加載該文件到內存中;
4. 而Master也會把此前收集到緩衝區中的命令,經過Reids命令協議形式轉發給Slave,Slave執行這些命令,實現和Master的同步;
5. Master/Slave此後會不斷經過異步方式進行命令的同步,達到最終數據的同步一致;
6. 須要注意的是Master和Slave之間一旦發生重連都會引起全量同步操做。但在2.8以後,也多是部分同步操做。
2.8開始,當Master和Slave之間的鏈接斷開以後,他們之間能夠採用持續複製處理方式代替採用全量同步。
Master端爲複製流維護一個內存緩衝區(in-memory backlog),記錄最近發送的複製流命令;同時,Master和Slave之間都維護一個複製偏移量(replication offset)和當前Master服務器ID(Masterrun id)。
當網絡斷開,Slave嘗試重連時:
a. 若是MasterID相同(即還是斷網前的Master服務器),而且從斷開時到當前時刻的歷史命令依然在Master的內存緩衝區中存在,則Master會將缺失的這段時間的全部命令發送給Slave執行,而後複製工做就能夠繼續執行了;
b. 不然,依然須要全量複製操做。
7、讀寫分離:
Redis支持讀寫分離,並且使用簡單,只需在配置文件中把Redis讀服務器和寫服務器進行配置,多個服務器使用逗號分開以下:
8、水平動態擴展:
歷時三年之久,終於等來了期待已由的Redis 3.0。新版本主要是實現了Cluster的功能,增刪集羣節點後會自動的進行數據遷移。實現 Redis 集羣在線重配置的核心就是將槽從一個節點移動到另外一個節點的能力。由於一個哈希槽實際上就是一些鍵的集合, 因此 Redis 集羣在重哈希(rehash)時真正要作的,就是將一些鍵從一個節點移動到另外一個節點。
9、數據淘汰策略:
Redis 內存數據集大小上升到必定大小的時候,就會施行數據淘汰策略。Redis 提供 6種數據淘汰策略:
volatile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰
volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
小編寫的都是一些偏新手向的東西,但願各位大咖見了不要笑話我,做爲一個菜鳥也但願可以幫到其餘人,畢竟入這一行着實須要不斷學習和總結,若是想進行深刻的探討歡迎來華爲雲社區論壇發帖,這裏大咖雲集,也能夠上華爲雲幫助中心,裏面的資料也是精心編寫的乾貨。感謝!