當前位置:首頁 » 存儲配置 » jedis存儲list

jedis存儲list

發布時間: 2025-03-31 04:15:25

① Redis數據結構(二)-List、Hash、Set及Sorted Set的結構實現

List類型通常被用作非同步消息隊列、文章列表查詢等;存儲有序可重復數據或作為簡單的消息推送機制時,可以使用Redis的List類型。這類數據的存儲通常會使用鏈表或者數組作為存儲結構。如果能夠將鏈表和數組的特點結合起來,就能夠很好地處理List類型的數據存儲。


Redis在早期使用了ZipList作為List類型的存儲結構。ZipList是一個連續的內存塊,由表頭、若干個entry節點和壓縮列表尾部標識符zlend組成。通過一系列編碼規則,提高了內存的利用率,適用於存儲整數和短字元串。每次增加和刪除數據時,所有數據都在同一個ZipList中進行搬移操作。如果將一個組數據按閾值進行拆分出多個數據,就能保證每次只操作某一個ZipList。3.2之後,Redis開始使用QuickList作為更有效的List實現。


QuickList維護了一種宏觀上的雙端鏈表,每個節點為對ZipList的包裝,即quicklistNode。每個quicklistNode都會通過前後指針相互指向,QuickList包含頭、尾quicklistNode的指針。QuickList使用每個ziplist的最大容量、數據壓縮范圍和單個ziplist節點最大存儲量來提升數據存取效率。通過設置這些參數,可以調整數據壓縮的程度,以優化性能。例如,-5表示最大容量為64KB,適用於非正常工作負載;-4表示最大容量為32KB,不推薦;-3表示最大容量為16KB,可能不推薦;-2表示最大容量為8KB,較好;-1表示最大容量為4KB,較好。


Redis的鏈表實現具有以下特性:


1. 通過快速增加或減少節點,鏈表可以自動調整大小,以適應存儲的數據量變化。
2. QuickList允許在鏈表的頭部和尾部進行高效插入和刪除操作。
3. 通過鏈表的結構,可以實現快速的數據訪問,尤其是對於需要頻繁訪問數據的場景。


Hash


Hash數據結構在存儲一個對象時,可以直接將該對象進行序列化後使用String類型存儲,然後通過反序列化獲取對象。對於只需要獲取對象的某個屬性的場景,可以將每個屬性分別存儲,但這樣會導致Redis的dict中存在大量key,影響鍵的生命周期管理效率。使用Map結構可以將屬性與值關聯起來,減少存儲空間,提高效率。


Redis的Hash數據結構也是使用dict實現的。當數據量較小或單個元素較小時,底層使用ZipList存儲。配置如下:



  • ziplist元素個數超過512時,將改為hashtable編碼。

  • 單個元素大小超過64位元組時,將改為hashtable編碼。


Set


Set類型適合用於對不重復集合的操作,可以判斷元素是否存在於集合中。Set數據結構底層實現為value為null的dict,當數據可以使用整型表示時,Set集合將被編碼為intset結構。整數集合是一個有序的、存儲整型數據的結構,可以保存大范圍的整型數據,並保證集合中不會有重復數據。


Sorted Set


Sorted Set是一種有序集合,連續空間存儲數據,每次增加數據都會對全量數據進行搬運。對於有序鏈表查找指定元素,只能通過頭、尾節點遍歷方式進行查找。如果將每個數據增加不定層數的索引,索引之間相互關聯,就可以通過遍歷層級的索引來確定元素所處范圍,減少空間復雜度。跳躍表是一種可以對有序鏈表進行近似二分查找的數據結構,Redis在兩個地方使用了跳躍表,一個是實現有序集合,另一個是在集群節點中用作內部數據結構。


ZSet數據結構底層實現為字典(dict) + 跳躍表(skiplist)。跳躍表通過在每個節點中維持多個指向其他節點的指針,實現快速訪問節點的目的。它支持平均O(logN)、最壞O(N)復雜度的節點查找,並且還可以通過順序性操作來批量處理節點。數據量較少時,使用ziplist編碼結構存儲;數據量較多或有序集合中元素是較長字元串時,Redis使用跳躍表作為有序集合鍵的底層實現。


配置如下:



  • 元素個數超過128時,用skiplist編碼。

  • 單個元素大小超過64位元組時,用skiplist編碼。


總結


Redis提供了多種數據結構,包括List、Hash、Set和Sorted Set。這些數據結構在不同的應用場景中具有獨特的優點,能夠高效地處理不同類型的數據操作。通過合理選擇和配置存儲結構,可以優化Redis的性能,滿足各種業務場景的需求。


京東雲開發者社區提供了豐富的學習資源和交流平台,歡迎開發者們積極參與學習和討論,共同提升技術水平。更多關於Redis數據結構的知識和實踐,可以參考相關文檔和社區討論。

② 怎樣在Redis通過StackExchange.Redis 存儲集合類型List

StackExchange 是由StackOverFlow出品, 是對Redis的.NET封裝,被越來越多的.NET開發者使用在項目中。
絕大部分原先使用ServiceStack的開發者逐漸都轉了過來,由於SS在其新版中不再開源,並對免費版本有所限制。

實際問題

那麼用.NET的開發者會發現,其根本沒有對List類型的存儲封裝,那麼要實現一個類似如下需求:
假如我有一個Customer的模型。

java">publicclassCustomer
{
publicstringFirstName{get;set;}
publicstringLastName{get;set;}
publicstringAddress1{get;set;}
publicstringCity{get;set;}
publicstringState{get;set;}
}

var customers = new List<Customer>();

怎樣將List<customer> customers 存入Redis中呢?

來龍去脈

是由於StackExchange.Redis是一個純客戶端的代理,他僅僅實現了Redis自由的功能,並不額外封裝其它功能。 也不具備像ORM那樣的自動類型匹配。

他僅僅存儲鍵值對 像string 或者
byte[]。所以你明白了吧,必須序列化存儲,用類似Json格式一樣。像用第三方NewtonSoft或者是Google公司流行的ProtocolBuffers
序列化格式的Protobuf-Net 也是不錯的選擇。

Redis支持存儲的類型有五種String ,Hash ,List ,Set ,和Sorted Set, 正如上面說的,這些存儲類型全部由字元串構成。

其中Set類型是沒有順序的,並且值必須唯一, List類型有順序且允許重復。

解決方案

如果你僅僅為了緩存存一批量的 List<Customer> 數據, 那麼自己封裝一個ListGet() 和 ListSet()方法吧。

我對比過使用 List 和 String 兩種類型存儲。

Redis 的List類型和 .NET領域還有所不同,實際上,它是一個雙向隊列,可以左右插入值。

所以如果是批量數據插入 那麼必須一個個插入, 代碼比較簡單如下:

//封裝的ListSet
publicvoidListSet<T>(stringkey,List<T>value)
{
.....
//下面的database是redis的資料庫對象.
foreach(varsingleinvalue)
{
vars=ConvertJson(single);//序列化
database.ListRightPush(key,s);//要一個個的插入
}
}

//封裝的ListGet
publicvoidListGet<T>(stringkey)
{
...
//ListRange返回的是一組字元串對象
//需要逐個反序列化成實體
varvList=database.ListRange(key);
List<T>result=newList<T>();
foreach(variteminvList)
{
varmodel=ConvertObj<T>(item);//反序列化
result.Add(model);
}
returnresult;
}

當然測試了一下性能,取20W條數據平均時間

③ redis的list可以存放結構體嗎

當然可以有結構體,而且像你這樣用當然不行find(start,stop,target)是從start到stop尋找數據是target的那個iterator,而你這里呢,List_d.begin()的reference_type是structdd,所以你也只能找structdd型的東西(當然你也必須有structdd的operator==),而你給的第三個參數是個int,這當然沒戲。

熱點內容
用電腦做伺服器能同時訪問多少人 發布:2025-04-01 23:10:04 瀏覽:144
caffe與python 發布:2025-04-01 23:00:51 瀏覽:754
倩女怎麼查伺服器 發布:2025-04-01 22:56:46 瀏覽:30
全民k歌上傳不了 發布:2025-04-01 22:27:14 瀏覽:148
php時差 發布:2025-04-01 22:20:52 瀏覽:799
亞馬遜搭建魚池伺服器 發布:2025-04-01 22:04:04 瀏覽:57
伺服器如何退出陣列卡模式 發布:2025-04-01 22:04:02 瀏覽:985
手機存儲卡怎麼看 發布:2025-04-01 21:44:46 瀏覽:427
gunzip解壓文件夾 發布:2025-04-01 21:37:32 瀏覽:860
c語言實現cd 發布:2025-04-01 21:19:00 瀏覽:31