1. 程式人生 > >Java編程細節-重構-為什麽 if-else 不是好代碼

Java編程細節-重構-為什麽 if-else 不是好代碼

就是 cached 吞吐量 epo 能力 無需 持久 所有 版本

一、緩存在系統中用來做什麽

  1. 少量數據存儲,高速讀寫訪問。通過數據全部in-momery 的方式來保證高速訪問,同時提供數據落地的功能,實際這正是Redis最主要的適用場景。

  2. 海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除。Redis3.0以後開始支持集群,實現了半自動化的數據分片,不過需要smart-client的支持。

二、從不同的角度來詳細介紹redis

網絡模型:Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。

內存管理:Redis使用現場申請內存的方式來存儲數據,並且很少使用free-list等方式來優化內存分配,會在一定程度上存在內存碎片,Redis跟據存儲命令參數,會把帶過期時間的數據單獨存放在一起,並把它們稱為臨時數據,非臨時數據是永遠不會被剔除的,即便物理內存不夠,導致swap也不會剔除任何非臨時數據(但會嘗試剔除部分臨時數據),這點上Redis更適合作為存儲而不是cache。

數據一致性問題:在一致性問題上,個人感覺redis沒有memcached實現的好,Memcached提供了cas命令,可以保證多個並發訪問操作同一份數據的一致性問題。 Redis沒有提供cas 命令,並不能保證這點,不過Redis提供了事務的功能,可以保證一串命令的原子性,中間不會被任何操作打斷。

支持的KEY類型:Redis除key/value之外,還支持list,set,sorted set,hash等眾多數據結構,提供了KEYS進行枚舉操作,但不能在線上使用,如果需要枚舉線上數據,Redis提供了工具可以直接掃描其dump文件,枚舉出所有數據,Redis還同時提供了持久化和復制等功能。

客戶端支持:redis官方提供了豐富的客戶端支持,包括了絕大多數編程語言的客戶端,比如我此次測試就選擇了官方推薦了Java客戶端Jedis.裏面提供了豐富的接口、方法使得開發人員無需關系內部的數據分片、讀取數據的路由等,只需簡單的調用即可,非常方便。

數據復制:從2.8開始,Slave會周期性(每秒一次)發起一個Ack確認復制流(replication stream)被處理進度

讀寫分離:redis支持讀寫分離,而且使用簡單,只需在配置文件中把redis讀服務器和寫服務器進行配置,多個服務器使用逗號分開如下:

水平動態擴展:歷時三年之久,終於等來了期待已由的Redis 3.0。新版本主要是實現了Cluster的功能,增刪集群節點後會自動的進行數據遷移。實現 Redis 集群在線重配置的核心就是將槽從一個節點移動到另一個節點的能力。因為一個哈希槽實際上就是一些鍵的集合, 所以 Redis 集群在重哈希(rehash)時真正要做的,就是將一些鍵從一個節點移動到另一個節點。

數據淘汰策略:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。

作者:Java高級架構
鏈接:https://www.jianshu.com/p/8079a3fb4c95
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。

Java編程細節-重構-為什麽 if-else 不是好代碼