www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]Redis 中的 5 種數(shù)據(jù)結(jié)構(gòu)精講

Redis 中有 5 種數(shù)據(jù)結(jié)構(gòu),分別是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),因?yàn)槭褂?Redis 場(chǎng)景的開(kāi)發(fā)中肯定是無(wú)法避開(kāi)這些基礎(chǔ)結(jié)構(gòu)的,所以熟練掌握它們也就成了一項(xiàng)必不可少的能力。

字符串類型

字符串是 Red ?is 中的最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),我們保存到 Redis 中的 key,也就是鍵,就是字符串結(jié)構(gòu)的。除此之外,Redis 中其它數(shù)據(jù)結(jié)構(gòu)也是在字符串的基礎(chǔ)上設(shè)計(jì)的,可見(jiàn)字符串結(jié)構(gòu)對(duì)于 Redis 是多么重要。

Redis 中的字符串結(jié)構(gòu)可以保存多種數(shù)據(jù)類型,如:簡(jiǎn)單的字符串、JSON、XML、二進(jìn)制等,但有一點(diǎn)要特別注意:在 Redis 中字符串類型的值最大只能保存 512 MB。

?

命令

下面通過(guò)命令了解一下對(duì)字符串類型的操作:

?

1.設(shè)置值



1

set key value [EX seconds] [PX milliseconds] [NX|XX]

set 命令有幾個(gè)非必須的選項(xiàng),下面我們看一下它們的具體說(shuō)明:

  • EX seconds:為鍵設(shè)置秒級(jí)過(guò)期時(shí)間

  • PX milliseconds:為鍵設(shè)置毫秒級(jí)過(guò)期時(shí)間

  • NX:鍵必須不存在,才可以設(shè)置成功,用于添加

  • XX:鍵必須存在,才可以設(shè)置成功,用于更新

set 命令帶上可選參數(shù) NX 和 XX 在實(shí)際開(kāi)發(fā)中的作用與 setnx 和 setxx 命令相同。我們知道 setnx 命令只有當(dāng)?key 不存在的時(shí)候才能設(shè)置成功,換句話說(shuō),也就是同一個(gè) key 在執(zhí)行 setnx 命令時(shí),只能成功一次,并且由于 Redis 的單線程命令處理機(jī)制,即使多個(gè)客戶端同時(shí)執(zhí)行 setnx 命令,也只有一個(gè)客戶端執(zhí)行成功。所以,基于 setnx 這種特性,setnx 命令可以作為分布式鎖的一種解決方案。

而 setxx 命令則可以在安全性比較高的場(chǎng)景中使用,因?yàn)?set 命令執(zhí)行時(shí),會(huì)執(zhí)行覆蓋的操作,而 setxx 在更新 key 時(shí)可以確保該 key 已經(jīng)存在了,所以為了保證 key 中數(shù)據(jù)類型的正確性,可以使用 setxx 命令。

?

2.獲取值



1

get key

?

3.批量設(shè)置值



1

mset key value

?

4.批量獲取值



1

mget key

如果有些鍵不存在,那么它的值將為 nil,也就是空,并且返回結(jié)果的順序與傳入時(shí)相同。

?

5.計(jì)數(shù)



1

incr key

incr 命令用于對(duì)值做自增操作,返回的結(jié)果分為 3 種情況:

  • 如果值不是整數(shù),那么返回的一定是錯(cuò)誤

  • 如果值是整數(shù),那么返回自增后的結(jié)果

  • 如果鍵不存在,那么就會(huì)創(chuàng)建此鍵,然后按照值為 0 自增, 就是返回 1

除了有 incr 自增命令外,Redis 中還提供了其它對(duì)數(shù)字處理的命令。例如:


1

2

3

4

decr key 自減

incrby kek increment 自增指定數(shù)字

decrby key decrement 自減指定數(shù)字

incrbyfloat key increment 自增浮點(diǎn)數(shù)

?

6.追加值



1

append key value

append 命令可以向字符串尾部追加值。

?

7.字符串長(zhǎng)度



1

strlen key

由于每個(gè)中文占用 3 個(gè)字節(jié),所以 jilinwula 這個(gè)鍵,返回是字符串長(zhǎng)度為 12,而不是 4。

?

8.設(shè)置并返回原值



1

getset key value

?

9.設(shè)置指定位置的字符



1

setrange key offeset value

?

10.獲取部分字符串



1

getrange key start end

?

時(shí)間復(fù)雜度

在 Redis 中執(zhí)行任何命令時(shí),都有相應(yīng)的時(shí)間復(fù)雜度,復(fù)雜度越高也就越費(fèi)時(shí)間,所以在執(zhí)行 Redis 中的命令時(shí),如果要執(zhí)行的命令復(fù)雜度越高,就越要慎重。下面是字符串命令時(shí)間復(fù)雜度類型表:

命令時(shí)間復(fù)雜度
set key valueO(1)
get keyO(1)
del keyO(k) k是鍵的個(gè)數(shù)
mset key valueO(k) k是鍵的個(gè)數(shù)
mget keyO(k) k是鍵的個(gè)數(shù)
incr keyO(1)
decr keyO(1)
incrby key incrementO(1)
decrby keky incrementO(1)
incrbyfloat key iincrementO(1)
append key valueO(1)
strlen keyO(1)
setrange key offset valueO(1)
getrange key start endO(n) n是字符串長(zhǎng)度

?

內(nèi)部編碼

在 Redis 中字符串類型的內(nèi)部編碼有 3 種:

  • int:8 個(gè)字節(jié)的長(zhǎng)整型

  • embstr:小于等于 39 個(gè)字節(jié)的字符串

  • raw:大于 39 個(gè)字節(jié)的字符串

?

哈希類型

大部分語(yǔ)言基本都提供了哈希類型,如 Java 語(yǔ)言中的 Map 類型及 Python 語(yǔ)言中的字典類型等等。雖然語(yǔ)言不同,但它們基本使用都是一樣的,也就是都是鍵值對(duì)結(jié)構(gòu)的。例如:


1

value={{field1, value1}

通過(guò)下圖可以直觀感受一下字符串類型和哈希類型的區(qū)別:

Redis 中哈希類型都是鍵值對(duì)結(jié)構(gòu)的,所以要特別注意這里的 value 并不是指 Redis 中 key 的 value,而是哈希類型中的 field 所對(duì)應(yīng)的 value。

?

命令

下面我們還是和介紹字符串類型一樣,了解一下 Redis 中哈希類型的相關(guān)命令。

?

1.設(shè)置值



1

hset key field value

我們看上圖執(zhí)行的命令知道,hset 命令也是有返回值的。如果 hset 命令設(shè)置成功,則返回 1,否則返回 0。除此之外 Redis 也為哈希類型提供了 hsetnx 命令。在前文對(duì)字符串的介紹中,我們知道 nx 命令只有當(dāng) key 不存在的時(shí)候,才能設(shè)置成功,同樣的,hsetnx 命令在 field 不存在的時(shí)候,才能設(shè)置成功。

?

2.獲取值



1

hget key field

我們看 hget 命令和 get 有很大的不同,get 命令在獲取的時(shí)候,只要寫(xiě)一個(gè)名字就可以了,而 hget 命令則要寫(xiě)兩個(gè)名字,第一個(gè)名字是 key,第二個(gè)名字是 field。當(dāng)然 key 或者 field 不存在時(shí),返回的結(jié)果都是 nil。

?

3.刪除 field



1

hdel key field [field ...]

hdel 命令刪除的時(shí)候,也會(huì)有返回值,并且這個(gè)返回就是成功刪除 field 的個(gè)數(shù)。當(dāng) field 不存在時(shí),并不會(huì)報(bào)錯(cuò),而是直接返回 0。

?

4.計(jì)算 field 個(gè)數(shù)



1

hlen key

hlen 命令返回的就是當(dāng)前 key 中 field 的個(gè)數(shù),如果 key 不存在,則返回 0。

?

5.批量設(shè)置或獲取 field-value



1

2

hmget key field [field ...]

hmset key field value [field value ...]

hmset 命令和 hmget 命令分別是批量設(shè)置和獲取值的,hmset 命令沒(méi)有什么要注意的,但 hmget 命令要特別注意,當(dāng)我們獲取一個(gè)不存在的 key 或者不存在的 field 時(shí),Redis 并不會(huì)報(bào)錯(cuò),而是返回 nil。并且有幾個(gè) field 不存在,則 Redis 返回幾個(gè) nil。

?

6.判斷 field 是否存在



1

hexists key field

當(dāng)執(zhí)行 hexists 命令時(shí),如果當(dāng)前 key 包括 field,則返回 1,否則返回 0。

?

7.獲取所有 field



1

hkeys key

?

8.獲取所有 value



1

hvals key

?

9.獲取所有的 field-value



1

hgetall key

hgetall 命令會(huì)返回當(dāng)前 key 中的所有 field-value,并按照順序依次返回。

?

10.計(jì)數(shù)



1

2

hincrby key field increment

hincrbyfloat key field increment

hincrby 命令和 incrby 命令的使用功能基本一樣,都是對(duì)值進(jìn)行增量操作的,唯一不同的就是 incrby 命令的作用域是 key,而 hincrby 命令的作用域則是 field。

?

11.計(jì)算 value 的字符串長(zhǎng)度



1

hstrlen key field

hstrlen 命令返回的是當(dāng)前 key 中 field 中字符串的長(zhǎng)度,如果當(dāng)前 key 中沒(méi)有 field 則返回 0。

?

時(shí)間復(fù)雜度

命令時(shí)間復(fù)雜度
hset key field valueO(1)
hget key fieldO(1)
hdel key field [field …]O(k) ,k是field個(gè)數(shù)
hlen keyO(1)
hgetall keyO(n) ,n是field總數(shù)
hmget key field [field …]O(k) ,k是field個(gè)數(shù)
hmset key field value [field value …]O(k) ,k是field個(gè)數(shù)
hexists key fieldO(1)
hkeys keyO(n) ,n是field總數(shù)
hvals keyO(n) ,n是field總數(shù)
hsetnx key field valueO(1)
hincrby key field incrementO(1)
hincrbyfloat key field incrementO(1)
hstrlen key fieldO(1)

?

內(nèi)部編碼

Redis 哈希類型的內(nèi)部編碼有兩種,它們分別是:

  • ziplist(壓縮列表):當(dāng)哈希類型中元素個(gè)數(shù)小于 hash-max-ziplist-entries 配置(默認(rèn) 512 個(gè)),同時(shí)所有值都小于 hash-max-ziplist-value 配置(默認(rèn) 64 字節(jié))時(shí),Redis 會(huì)使用 ziplist 作為哈希的內(nèi)部實(shí)現(xiàn)。

  • hashtable(哈希表):當(dāng)上述條件不滿足時(shí),Redis 則會(huì)采用 hashtable 作為哈希的內(nèi)部實(shí)現(xiàn)。

下面我們通過(guò)以下命令來(lái)演示一下 ziplist 和 hashtable 這兩種內(nèi)部編碼。

當(dāng) field 個(gè)數(shù)比較少并且 value 也不是很大時(shí)候 Redis 哈希類型的內(nèi)部編碼為 ziplist:

當(dāng) value 中的字節(jié)數(shù)大于 64 字節(jié)時(shí)(可以通過(guò) hash-max-ziplist-value 設(shè)置),內(nèi)部編碼會(huì)由 ziplist 變成 hashtable。

當(dāng) field 個(gè)數(shù)超過(guò) 512(可以通過(guò) hash-max-ziplist-entries 參數(shù)設(shè)置),內(nèi)部編碼也會(huì)由 ziplist 變成 hashtable。

由于直接手動(dòng)創(chuàng)建 512 個(gè) field 不方便,為了更好的驗(yàn)證該功能,我將用程序的方式,動(dòng)態(tài)創(chuàng)建 512 個(gè) field 來(lái)驗(yàn)證此功能,下面為具體的代碼:


1

2

3

4

5

6

7

8

import redis

r = redis.Redis(host='127.0.0.1', port=6379)

print('Key為【userinfo】的字節(jié)編碼為【%s】' % r.object('encoding', 'userinfo').decode('utf-8'))

for i in range(1,513):????

????r.hset('userinfo', i, '吉林烏拉')

print('Key為【userinfo】的字節(jié)編碼為【%s】' % r.object('encoding', 'userinfo').decode('utf-8'))

Key為【userinfo】的字節(jié)編碼為【ziplist】

Key為【userinfo】的字節(jié)編碼為【hashtable】

?

列表類型

Redis 中列表類型可以簡(jiǎn)單地理解為存儲(chǔ)多個(gè)有序字符串的一種新類型,這種類型除了字符串類型中已有的功能外,還提供了其它功能,如可以對(duì)列表的兩端插入和彈出元素(在列表中的字符串都可以稱之為元素),除此之外還可以獲取指定的元素列表,并且還可以通過(guò)索引下標(biāo)獲取指定元素等等。下面我們通過(guò)下圖來(lái)看一下 Redis 中列表類型的插入和彈出操作:

下面我們看一下 Redis 中列表類型的獲取與刪除操作:

Redis 列表類型的特點(diǎn)如下:

  • 列表中所有的元素都是有序的,所以它們是可以通過(guò)索引獲取的,也就是上圖中的 lindex 命令。并且在 Redis 中列表類型的索引是從 0 開(kāi)始的。

  • 列表中的元素是可以重復(fù)的,也就是說(shuō)在 Redis 列表類型中,可以保存同名元素,如下圖所示:

?

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉