當前位置:歷史故事大全網 - 歷史上的今天 - Redis歷史

Redis歷史

Redis創造了壹種新的數據存儲理念。有了redis,我們在面對單調的數據庫時,不必再專註於如何把大象放進冰箱,而是利用redis靈活的數據結構和數據操作,為不同的大象搭建不同的冰箱。

Redis公共數據類型

redis最常用的數據類型主要包括以下五種:

混雜

目錄

設置

排序集合

在詳細描述這些數據類型之前,我們先通過壹張圖了解壹下如何描述redis內存管理中這些不同的數據類型:

首先,redis使用壹個redisobject對象來表示所有的鍵和值。Redisobject的主要信息如上圖所示:type代表壹。

什麽數據類型是值對象?編碼是不同數據類型在redis中的存儲方式。例如,type=string表示值存儲。

壹個普通的字符串,那麽對應的編碼可以是raw或者int。如果是int,說明實際redis按照數值類型存儲和表示這個字符串。當然,

前提是字符串本身可以用數值表示,比如“123”。

像“456”這樣的字符串。

這裏需要解釋壹下vm字段。只有打開redis的虛擬內存功能,這個字段才會真正分配內存。這個功能默認是關閉的,後面會詳細介紹這個功能。及格

在上圖中,我們可以發現redis使用redisobject來表示所有的鍵/值數據是對內存的浪費。當然,這些內存管理成本主要是給予

Redis為不同的數據類型提供了統壹的管理接口,實際作者也提供了各種方法來幫助我們盡可能的節省內存,後面會詳細討論。

讓我們逐壹分析這五種數據類型的用途和內部實現:

常見命令:

設置、獲取、減少、增加、管理等。

應用場景:

字符串是最常用的數據類型,普通的鍵/值存儲都可以歸入這壹類,這裏就不解釋了。

實施模式:

存儲在redis中的字符串默認是壹個字符串,被redisobject引用。當遇到incr、decr等運算時,會轉換成數值型進行計算。此時,redisobject的編碼字段是int。

混雜

常見命令:

Hget、hset、hgetall等。

應用場景:

我們舉壹個簡單的例子來描述hash的應用場景。例如,我們想存儲壹個用戶信息對象數據,它包含以下信息:

用戶id是要搜索的關鍵字,存儲值用戶對象包含姓名、年齡、生日等信息。如果它存儲在壹個公共的鍵/值結構中,有兩種主要的存儲方法:

第壹種方法將用戶id作為搜索關鍵字,並將其他信息封裝到壹個對象中,並以序列化的方式存儲。這種方法的缺點是增加了序列化/反序列化的成本,當其中壹個信息需要修改時,需要檢索整個對象,修改操作需要保護並發性,引入cas等復雜問題。

第二種方法是將用戶信息對象存儲為有多少個成員就有多少個鍵-值對,並使用用戶id+對應屬性的名稱作為惟壹標識符來獲取對應屬性的值。雖然消除了序列化開銷和並發問題,但是用戶id是重復存儲的,如果有大量這樣的數據,內存浪費還是非常可觀的。

那麽redis提供的hash很好的解決了這個問題。redis的hash其實就是內部存儲的值是壹個hashmap,它提供了壹個直接訪問這個map成員的接口,如下圖所示:

也就是說,密鑰仍然是用戶id,

Value是壹個映射,這個映射的鍵是成員的屬性名,value是屬性值,這樣就可以通過其內部映射的鍵直接修改和訪問數據(內部映射的鍵在Redis中稱為field)。

也就是通過key(用戶id)+field(屬性標簽)。

可以操縱對應的屬性數據,不需要重復存儲數據,也不會帶來序列化和並發修改控制的問題。它很好地解決了這個問題。

同時需要註意的是,redis提供了壹個接口(hgetall),可以直接獲取所有的屬性數據,但是如果內部映射的成員很多,就涉及到遍歷整個內部映射。

操作,由於redis單線程模型,這種遍歷操作可能比較耗時,而其他客戶端的請求完全沒有響應,需要特別註意。

實施模式:

關於redis已經說過了

對應於hash的值實際上是壹個hashmap。實際上,這裏有兩種不同的實現。當hash的成員數較少時,redis會使用類似壹維數組的方式進行緊湊存儲,而不是使用真正的hashmap結構和對應的值。

redisobject的編碼是zipmap,當成員數量增加時會自動變成真正的hashmap,編碼是ht。

目錄

常見命令:

Lpush、rpush、lpop、rpop、lrange等。

應用場景:

雷迪斯

List有很多應用場景,也是redis最重要的數據結構之壹。比如twitter的關註列表和粉絲列表,都可以通過redis的列表結構來實現,很好理解,這裏不再贅述。

實施模式:

雷迪斯

list的實現是雙向鏈表,可以支持反向搜索和遍歷,更容易操作,但是帶來了壹些額外的內存開銷。redis內部的許多實現,包括發送緩沖隊列,也使用這種數據結構。

設置

常見命令:

Sadd,spop,sembers,sunion等。

應用場景:

雷迪斯

set提供的功能和list類似,但特別之處在於set可以自動復制。當妳需要存儲壹個數據的列表,又不想要重復的數據時,set是壹個很好的選擇,set提供了壹個判斷成員是否在集合集合中的重要接口,這是list所不能提供的。

實施模式:

set的內部實現是壹個。

值始終為null的Hashmap實際上是通過計算hash來快速排序的,這也是為什麽set可以提供壹種判斷成員是否在集合中的方法。

排序集合

常見命令:

紮德、zrange、zrem、zcard等。

使用場景:

redis排序集的使用場景和set類似,只是set不自動排序,排序。

Set可以通過提供壹個額外的參數score來對成員進行排序,而且是有序插入,也就是自動排序。當您需要有序且不重復的收藏列表時,您可以選擇排序。

設置數據結構,比如twitter的public。

  • 上一篇:濰州詳細資料大全
  • 下一篇:中國古代有哪些10的酷刑?
  • copyright 2024歷史故事大全網