redis&memcached&SQL&NoSQL
Why
- 一個應用確定有兩部分邏輯:數據邏輯和業務邏輯。
- 數據邏輯包括各類I/O,和內部的數據的處理,也就是在內部如何組織數據結構,變量也屬於這一部分。
- 當一個應用變成一個進程,它負責數據邏輯的部分就有了兩個選擇:
- 將數據存在內存中,存在內存中的數據若是變得很重要,就須要保存進磁盤,因此有可能須要持久化的邏輯。爲了更好的使用數據,須要有很好的數據結構建模,雖然基本的數據結構,甚至一些複雜的在程序語言或者庫中都有集成,可是語言不負責執行,因此執行這一塊仍是進程本身在作。
- 將數據存在磁盤中,這須要有存/取得邏輯,在取的這一部分,基於業務可能要有強大的檢索邏輯
- 當應用的數據規模變得很大,相應的數據邏輯和業務邏輯也會變得很複雜
- 從效率上來講,是時候考慮分佈式了,因此咱們有必要將和數據有關的邏輯獨立出去,好比磁盤上的檢索,內存中數據的持久化等。
- 從開發和維護的角度來講,集中精力在業務而不是數據,可使得代碼量變少,開發速度和可維護性都大大提升。
How
- 顯然要將數據邏輯儘量獨立出去,就要用到工具軟件,redis、memcached、Sql,NoSql都是這個目的的工具
- redis、memcached 側重於內存中的數據
- 內存中的數據都有時效性,因此這兩個工具都支持expire
- memcached 只負責 數據的存、取和超時,在取得部分也不考慮複雜得檢索邏輯
- redis則更強大,它支持了5中數據結構,針對這些數據結構得操做也能夠分離給它,同時還支持持久化,更強大的還支持主備、集羣,可見它爲分佈式作了很好的工做。
- Sql、NoSql 側重於磁盤側數據
- 須要存在磁盤的每每是重要數據,這些數據更偏現實,是人類可讀的,不像內存中的數據好比堆棧、整型這樣的。這種數據咱們稱之爲用戶數據,又或者事務數據。這類數據每每很大,因此檢索成了一個基本要求。
- NoSql 提供簡單的檢索,或者說基於算法的檢索,好比hash、值比較、正則匹配等
- Sql 則提供複雜的檢索,或者說基於事物的檢索,而事務是複雜,很難一次建模的,爲此咱們用現實分類的方式建表,將數據冗餘的存於多個表,從而得到強大的事務描述能力,稱之爲關係型數據庫,關係便是現實的數據模型的複雜聯繫。關係型數據庫使得咱們事務數據建模的難度大大下降,也就使得開發和維護的程度大大下降。另外一方面,Sql集成了強大的數據分析能力,使得數據分析的使用門檻下降不少。
- 無論是Sql仍是NoSql都是C/S架構,很顯然也使得分佈式變得很容易
When
- 從上面能夠看出偏內存的,選擇redis或者memcache,偏磁盤的選擇Sql、NoSql
- Nosql能作的,Sql都能作,memcached能作的redis都能作
- Nosql 更簡單,面向不是很複雜的事務數據模型,用不到很複雜的檢索和建模,選擇Nosql能夠更快開發和檢索。好比圖書關的檢索系統,圖書的數據模型很簡單,也不須要很事務的檢索,這些檢索用NoSql就能夠作。這時候用NoSql速度快,開發快。
- memcached又比redis簡單,若是僅僅是數據量大,好比一個Web後端它對鏈接的一些記錄例如cookie等,還有爲了加快速度作的一些緩存,數據簡單,設計的算法反倒不復雜,咱們選memcached就很合適,速度更快,開發更快。
- 在須要數據持久化的時候,memcached不適合,這時候選redis。
- 在一些分佈式架構中選redis,是由於它爲分佈式作了更多的工做,好比甚至提供了Publish/Subscribe 功能。memcached在分佈式中最大作緩存,而redis是能夠承接相似「中立交換語言」如json、xml所起的做用。
- 能夠用redis或者memcached的場合,理論上SQl、NoSql也能夠作,可是前者在內存中,速度確定快不少。
歡迎關注本站公眾號,獲取更多信息