redis的基本結構從redis的8大特性說起

今天閒暇時跟朋友聊起關於redis的幾種模式和數據一致性的算法,今天從redis的幾種數據結構開始給大家用幾篇文章的時間聊一下我的一些見解。


首先圍繞redis的8大特性對redis做一些剖析;

一、速度快

為什麼速度快,首先它是將數據存放內存中的,內存的讀取速度會大量減少硬盤中的掃描、尋道時間,並且Redis是單線程的,線程在內存中是效率最高;redis也是使用C編寫,不同於memcached使用java編寫,不僅需要jvm的管理,而且在速度方面也是遜於C的內存管理。

二、持久化

Redis的持久化可以保證將內存中的數據每隔一段時間就保存在磁盤中,重啟的時候會重新加載到內存中。方式有RDB和AOF。RDB通俗的說類似於一個定時備份,缺點很明顯就是不夠實時,而AOP則是將所有操作記錄記錄下來,缺點就是備份的文件較大,當然也可以通過配置相應的重寫機制去對數據進行定期的覆蓋。

三、支持多種數據結構

  • String
  • Hash
  • List
  • Set
  • Sorted set

我簡單說一下常用的幾個吧:

STRING自然就是一個典型的key、value結構,你可進行get、set、incr、decr等操作

HASH我們來看下Hash的應用場景,比如我們要存儲一個用戶信息對象數據,包含以下信息:

用戶ID為查找的key,存儲的value用戶對象包含姓名,年齡,生日等信息,如果用普通的key/value結構來存儲,可能會有以下2種存儲方式:

redis的基本結構從redis的8大特性說起

第一種方式將用戶ID作為查找key,把其他信息封裝成一個對象以序列化的方式存儲,這種方式的缺點是,當要對它進行修改的時候需要將整個對象取回,在進行相應的序列化和反序列化,並且在此操作期間要處理好併發的處理

redis的基本結構從redis的8大特性說起

第二種方法是這個用戶信息對象有多少成員就存成多少個key-value對兒,用用戶ID+對應屬性的名稱作為唯一標識來取得對應屬性的值,但是很明顯內存浪費很嚴重

那麼Redis提供的Hash很好的解決了這個問題,Redis的Hash實際是內部存儲的Value為一個HashMap,並提供了直接存取這個Map成員的接口,如下圖:

redis的基本結構從redis的8大特性說起

也就是說,Key仍然是用戶ID, value是一個Map,這個Map的key是成員的屬性名,value是屬性值,這樣對數據的修改和存取都可以直接通過其內部Map的Key(Redis裡稱內部Map的key為field), 也就是通過 key(用戶ID) + field(屬性標籤) 就可以操作對應屬性數據了,既不需要重複存儲數據,也不會帶來序列化和併發修改控制的問題。很好的解決了問題。

LIST 本身為一個雙向鏈表,也就是說list既可以做棧、也可以做隊列,比較常用的就是消息隊列啦。

四、支持多種編程語言

支持Java、PHP、Python等眾多編程語言。

五、功能豐富

如發佈訂閱、Lua腳本、事物、Pipeline(管道,即當指令到達一定數量後,客戶端才會執行)。

六、簡單

不依賴外部庫、單線程、只有23000行的Code。

七、主從複製

八、高可用和分佈式

關於第七和第八點我將在下一篇中對Redis哨兵、複製、集群的設計原理,以及區別,並且簡單聊一下redis的數據一致性;


分享到:


相關文章: