欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

redis中的常用5大數(shù)據(jù)類型

 更新時(shí)間:2024年04月23日 09:34:07   作者:csdn_HZW  
這篇文章主要介紹了redis中的常用5大數(shù)據(jù)類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1、string(字符串)

String是Redis中最常用的一種數(shù)據(jù)類型,也是Redis中最簡(jiǎn)單的一種數(shù)據(jù)類型。

首先,表面上它是字符串,但其實(shí)他可以靈活的表示字符串、整數(shù)、浮點(diǎn)數(shù)3種值。

Redis會(huì)自動(dòng)的識(shí)別這3種值。

2、list(列表)

實(shí)際上是一個(gè)鏈表,before Node after , left,right 都可以插入值

  • 如果key 不存在,創(chuàng)建新的鏈表
  • 如果key存在,新增內(nèi)容
  • 如果移除了所有值,空鏈表,也代表不存在!

在兩邊插入或者改動(dòng)值,效率最高! 中間元素,相對(duì)來說效率會(huì)低一點(diǎn)~

消息排隊(duì)!消息隊(duì)列 (Lpush Rpop), 棧( Lpush Lpop)!

3、hash(哈希)

哈希的描述:

  • 哈希是一種鍵值對(duì)存儲(chǔ)結(jié)構(gòu),它類似于關(guān)聯(lián)數(shù)組或字典。
  • 在哈希中,每個(gè)鍵都唯一地對(duì)應(yīng)一個(gè)值,而值可以是字符串、數(shù)字或其他數(shù)據(jù)類型。
  • 哈希適合存儲(chǔ)具有結(jié)構(gòu)化數(shù)據(jù)的對(duì)象,比如用戶信息、產(chǎn)品信息等。
  • 在哈希中,可以對(duì)單個(gè)字段進(jìn)行讀寫操作,而不需要讀取整個(gè)數(shù)據(jù)結(jié)構(gòu)。

哈希的底層數(shù)據(jù)結(jié)構(gòu):

  • 哈希的底層數(shù)據(jù)結(jié)構(gòu)是哈希表(Hash Table)。
  • 在哈希表中,每個(gè)鍵值對(duì)被存儲(chǔ)在哈希表的一個(gè)桶(Bucket)中。
  • 桶是一個(gè)數(shù)組,它的大小取決于哈希表的大小,通常會(huì)隨著元素的增加而動(dòng)態(tài)調(diào)整。
  • 哈希表通過哈希函數(shù)將鍵映射到桶的位置,并在桶中存儲(chǔ)鍵值對(duì)。

下面舉個(gè)例子:

當(dāng)你插入一條數(shù)據(jù)到哈希中時(shí),它的存儲(chǔ)過程如下:

假設(shè)你要執(zhí)行以下命令將一條數(shù)據(jù)插入到哈希中:

HSET myhash field1 value1
  • 計(jì)算哈希值:對(duì)鍵 myhash 進(jìn)行哈希運(yùn)算,得到一個(gè)哈希值,該哈希值將確定數(shù)據(jù)在哈希表中的存儲(chǔ)位置。
  • 映射到桶:根據(jù)計(jì)算得到的哈希值,確定數(shù)據(jù)存儲(chǔ)在哈希表的哪個(gè)桶中。
  • 存儲(chǔ)鍵值對(duì):在確定的桶中,存儲(chǔ)鍵值對(duì)數(shù)據(jù) {field1: value1}。

讓我們假設(shè)經(jīng)過哈希計(jì)算后,得到的哈希值為 0x12345678,那么這條數(shù)據(jù)將存儲(chǔ)在哈希表中的桶 0x1234 中。

假設(shè)該桶中已經(jīng)有一些數(shù)據(jù)存在,哈希表和桶的存儲(chǔ)可能如下所示:

Hash Table:
Bucket 0x1234:   --> {field2: value2} --> {field1: value1}
                  --> {field3: value3} --> {field4: value4}
                  --> ...
 
Bucket 0x5678:   --> {field5: value5}
                  --> ...
 
Bucket ...       --> ...

在這個(gè)示例中:

  • 哈希表包含多個(gè)桶,每個(gè)桶存儲(chǔ)了一部分鍵值對(duì)數(shù)據(jù)。
  • 0x1234 中存儲(chǔ)了一些鍵值對(duì)數(shù)據(jù),其中包括 {field1: value1}。
  • 這個(gè)桶可能使用鏈表等數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù),以處理哈希沖突,確保每個(gè)鍵值對(duì)都可以被正確地存儲(chǔ)和檢索。

注意:

哈希和下面要介紹的set的底層數(shù)據(jù)結(jié)構(gòu)有點(diǎn)相似,但是哈希里面存儲(chǔ)的是鍵值對(duì),偏向于鍵值對(duì);set中偏向于值的集合。

4、set(集合)

集合的描述

  • 集合是一種無序、唯一的數(shù)據(jù)結(jié)構(gòu),它類似于數(shù)學(xué)上的集合。
  • 在集合中,每個(gè)元素都是唯一的,且無序存儲(chǔ)。
  • 集合適合存儲(chǔ)不重復(fù)的元素,比如用戶的標(biāo)簽、商品的標(biāo)簽等。
  • 集合支持添加、刪除、查詢等操作,可以對(duì)整個(gè)集合進(jìn)行操作,也可以對(duì)單個(gè)元素進(jìn)行操作。

集合(Set)的底層數(shù)據(jù)結(jié)構(gòu)可以有兩種形式:整數(shù)集合(IntSet)和哈希表(Hash Table)。

整數(shù)集合主要用于存儲(chǔ)數(shù)字類型的元素,而哈希表則用于存儲(chǔ)其他類型的元素或者大數(shù)量的元素。

整數(shù)集合(IntSet):

  • 整數(shù)集合是一種特殊的數(shù)據(jù)結(jié)構(gòu),它專門用于存儲(chǔ)整數(shù)類型的元素。
  • 整數(shù)集合采用緊湊的數(shù)組形式存儲(chǔ)元素,這樣可以節(jié)省內(nèi)存空間。
  • 當(dāng)集合中的元素都是整數(shù)類型,并且數(shù)量較小時(shí),Redis 會(huì)使用整數(shù)集合作為集合的底層數(shù)據(jù)結(jié)構(gòu)。

哈希表(Hash Table):

  • 哈希表是一種通用的數(shù)據(jù)結(jié)構(gòu),它可以存儲(chǔ)任意類型的元素,并且支持動(dòng)態(tài)擴(kuò)容。
  • 當(dāng)集合中的元素包含了其他類型,或者數(shù)量較大時(shí),Redis 會(huì)使用哈希表作為集合的底層數(shù)據(jù)結(jié)構(gòu)。

在插入數(shù)據(jù)時(shí),底層數(shù)據(jù)結(jié)構(gòu)可能會(huì)發(fā)生變化,具體取決于當(dāng)前集合的類型和大?。?/p>

對(duì)于整數(shù)集合(IntSet):

  • 如果集合中的元素都是整數(shù)類型,并且待插入的元素可以表示為整數(shù),則 Redis 將嘗試將元素添加到現(xiàn)有的整數(shù)集合中。
  • 如果插入的元素?zé)o法表示為整數(shù),或者整數(shù)集合無法容納新的元素,Redis 將會(huì)將整數(shù)集合轉(zhuǎn)換為哈希表,然后將新的元素插入到哈希表中。

對(duì)于哈希表(Hash Table):

  • 如果集合已經(jīng)使用哈希表作為底層數(shù)據(jù)結(jié)構(gòu),Redis 將直接將新的元素添加到哈希表中。
  • 如果集合中的元素都是整數(shù)類型,但哈希表的性能更好(例如,集合數(shù)量較大),Redis 也會(huì)將整數(shù)集合轉(zhuǎn)換為哈希表,然后將新的元素插入到哈希表中。

當(dāng)插入非整數(shù)類型的元素到哈希表時(shí),Redis 會(huì)通過一系列步驟將該元素插入到哈希表中。

下面是這個(gè)過程的簡(jiǎn)要描述

  • 計(jì)算哈希值:對(duì)于要插入的元素,Redis 首先會(huì)計(jì)算其哈希值,以確定在哈希表中的存儲(chǔ)位置。
  • 映射到桶:根據(jù)計(jì)算得到的哈希值,Redis 確定了元素應(yīng)該存儲(chǔ)在哈希表的哪個(gè)桶中。
  • 處理哈希沖突:由于不同的元素可能具有相同的哈希值,所以可能會(huì)發(fā)生哈希沖突。在這種情況下,Redis 會(huì)采取適當(dāng)?shù)姆椒▉斫鉀Q沖突,例如使用開放定址法、鏈地址法等。
  • 存儲(chǔ)元素:一旦確定了存儲(chǔ)位置并解決了哈希沖突,Redis 就會(huì)在哈希表的相應(yīng)桶中存儲(chǔ)該元素。

開放定址法和鏈地址法是解決哈希沖突的兩種常見方法。

開放定址法

  • 在開放定址法中,當(dāng)發(fā)生哈希沖突時(shí),不是將沖突的元素放入一個(gè)單獨(dú)的鏈表中,而是通過一系列的步驟在哈希表中尋找另一個(gè)空槽來存放沖突的元素。
  • 具體的步驟包括線性探查、二次探查、雙重哈希等。例如,在線性探查中,如果發(fā)生沖突,就會(huì)依次檢查哈希表中的下一個(gè)位置,直到找到一個(gè)空槽。
  • 開放定址法的優(yōu)點(diǎn)是節(jié)省了存儲(chǔ)空間,因?yàn)樗恍枰~外的鏈表來存儲(chǔ)沖突的元素。但是如果哈希表填滿了大部分槽位,性能會(huì)下降。

鏈地址法

  • 在鏈地址法中,哈希表的每個(gè)槽位都維護(hù)一個(gè)鏈表,用于存儲(chǔ)哈希值相同的元素。
  • 當(dāng)發(fā)生哈希沖突時(shí),新的元素將被插入到相應(yīng)槽位的鏈表中,而不是直接放入槽位中。
  • 這樣,哈希表中的每個(gè)槽位都可能對(duì)應(yīng)著一個(gè)鏈表,鏈表中存儲(chǔ)了所有哈希值相同的元素。
  • 鏈地址法的優(yōu)點(diǎn)是解決了哈希沖突,保證了元素的正確存儲(chǔ)和檢索。但是需要額外的空間來存儲(chǔ)鏈表,可能會(huì)占用更多的內(nèi)存。

總的來說,開放定址法通過不斷尋找空槽位來解決沖突,而鏈地址法通過維護(hù)鏈表來存儲(chǔ)沖突的元素。

5、zset(有序集合)

有序集合(Sorted Set,通常簡(jiǎn)稱為 ZSET)是 Redis 中的一種數(shù)據(jù)結(jié)構(gòu),它類似于集合(SET),但每個(gè)成員都關(guān)聯(lián)了一個(gè)分?jǐn)?shù)(Score),從而實(shí)現(xiàn)了元素的有序存儲(chǔ)。

ZSET 的底層數(shù)據(jù)結(jié)構(gòu)主要由兩部分組成:跳躍表(Skip List)和哈希表(Hash Table)。

  • 跳躍表(Skip List):跳躍表是一種隨機(jī)化數(shù)據(jù)結(jié)構(gòu),用于有序元素的快速查找和插入。它是通過在元素的層級(jí)之間建立索引來實(shí)現(xiàn)快速查找的。跳躍表中的每個(gè)節(jié)點(diǎn)都包含一個(gè)成員(Member)和一個(gè)分?jǐn)?shù)(Score),以及若干個(gè)指向其他節(jié)點(diǎn)的指針,這些指針用于在不同層級(jí)之間快速跳躍。通過跳躍表,ZSET 可以實(shí)現(xiàn)基于分?jǐn)?shù)的范圍查詢、快速的成員查找和插入操作。
  • 哈希表(Hash Table):除了跳躍表外,ZSET 還使用了一個(gè)哈希表,用于存儲(chǔ)成員到分?jǐn)?shù)的映射關(guān)系。在哈希表中,鍵是成員,值是分?jǐn)?shù)。通過哈希表,可以快速地查找指定成員的分?jǐn)?shù),或者更新成員的分?jǐn)?shù)。哈希表使得 ZSET 可以在常數(shù)時(shí)間內(nèi)完成成員與分?jǐn)?shù)之間的映射操作,而不需要遍歷跳躍表。

讓我們來看一個(gè)示例,假設(shè)我們有一個(gè) ZSET,存儲(chǔ)了一些成員及其對(duì)應(yīng)的分?jǐn)?shù)。

假設(shè)我們有以下 ZSET:

ZADD myzset 10 member1
ZADD myzset 20 member2
ZADD myzset 30 member3

在底層,這個(gè) ZSET 的數(shù)據(jù)可能會(huì)被存儲(chǔ)如下:

跳躍表(Skip List)

Level 2:        member3 ---------------> NULL
Level 1:        member2 -------> member3
Base Level:     member1 -> member2 -> member3

在跳躍表中,每個(gè)節(jié)點(diǎn)包含成員和分?jǐn)?shù)信息,并且包含指向同一層級(jí)下一個(gè)節(jié)點(diǎn)的指針。

較高層級(jí)的節(jié)點(diǎn)包含更多的指針,以實(shí)現(xiàn)更快的跳躍。

哈希表(Hash Table)

Key:     Value:
member1  10
member2  20
member3  30

在哈希表中,鍵是成員,值是成員對(duì)應(yīng)的分?jǐn)?shù)。

通過哈希表,Redis 可以快速地查找成員對(duì)應(yīng)的分?jǐn)?shù),或者更新成員的分?jǐn)?shù)。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis分片集群的實(shí)現(xiàn)示例

    Redis分片集群的實(shí)現(xiàn)示例

    本文介紹了搭建Redis分片集群,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 淺談Redis處理接口冪等性的兩種方案

    淺談Redis處理接口冪等性的兩種方案

    本文主要介紹了淺談Redis處理接口冪等性的兩種方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • redis主從復(fù)制原理的深入講解

    redis主從復(fù)制原理的深入講解

    這篇文章主要給大家介紹了關(guān)于redis主從復(fù)制原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 在redis中存儲(chǔ)ndarray的示例代碼

    在redis中存儲(chǔ)ndarray的示例代碼

    在Redis中存儲(chǔ)NumPy數(shù)組(ndarray)通常需要將數(shù)組轉(zhuǎn)換為二進(jìn)制格式,然后將其存儲(chǔ)為字符串,這篇文章給大家介紹了在redis中存儲(chǔ)ndarray的示例代碼,感興趣的朋友一起看看吧
    2024-02-02
  • Windows下Redis的安裝使用圖解

    Windows下Redis的安裝使用圖解

    Redis是一個(gè)key-value存儲(chǔ)系統(tǒng)。Redis的出現(xiàn),很大程度補(bǔ)償了memcached這類key/value存儲(chǔ)的不足,在部分場(chǎng)合可以對(duì)關(guān)系數(shù)據(jù)庫起到很好的補(bǔ)充作用。這篇文章小編為大家分享了在Windows下進(jìn)行安裝和使用Redis的技巧。
    2015-09-09
  • spring?boot集成redis基礎(chǔ)入門實(shí)例詳解

    spring?boot集成redis基礎(chǔ)入門實(shí)例詳解

    redis在spring?boot項(xiàng)目開發(fā)中是常用的緩存套件,常見使用的是spring-boot-starter-data-redis,這篇文章主要介紹了spring?boot集成redis基礎(chǔ)入門,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • redis并發(fā)之跳表的實(shí)現(xiàn)

    redis并發(fā)之跳表的實(shí)現(xiàn)

    跳表是一種用于實(shí)現(xiàn)有序集合的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了redis并發(fā)之跳表的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • redis的底層數(shù)據(jù)結(jié)構(gòu)詳解

    redis的底層數(shù)據(jù)結(jié)構(gòu)詳解

    Redis性能高得益于其優(yōu)化的數(shù)據(jù)結(jié)構(gòu),Redis的數(shù)據(jù)結(jié)構(gòu)分為對(duì)外暴露的和內(nèi)部底層的兩種,對(duì)外暴露的數(shù)據(jù)結(jié)構(gòu)包括String、list、hash、set、zset等,而內(nèi)部底層的數(shù)據(jù)結(jié)構(gòu)則包括SDS、hashtable、ziplist、linkedlist、quicklist、intset、skiplist等
    2025-02-02
  • 使用redis-plus-plus庫連接redis的實(shí)現(xiàn)方法

    使用redis-plus-plus庫連接redis的實(shí)現(xiàn)方法

    本文主要介紹了使用redis-plus-plus庫連接redis的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Redis集群Lettuce主從切換問題解決方案

    Redis集群Lettuce主從切換問題解決方案

    這篇文章主要為大家介紹了Redis集群Lettuce主從切換問題解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論