久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Redis常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

共計(jì) 7607 個(gè)字符,預(yù)計(jì)需要花費(fèi) 20 分鐘才能閱讀完成。

這篇文章主要介紹“Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)”,在日常操作中,相信很多人在 Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)”的疑惑有所幫助!接下來,請(qǐng)跟著丸趣 TV 小編一起來學(xué)習(xí)吧!

Redis 常用數(shù)據(jù)結(jié)構(gòu)

Redis 提供了一些數(shù)據(jù)結(jié)構(gòu)供我們往 Redis 中存取數(shù)據(jù),最常用的的有 5 種,字符串(String)、哈希(Hash)、列表(list)、集合(set)、有序集合(ZSET)。

字符串(String)

字符串類型是 Redis 最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。首先鍵都是字符串類型,而且其他幾種數(shù)據(jù)結(jié)構(gòu)都是在字符串類型基礎(chǔ)上構(gòu)建的,所以字符串類型能為其他四種數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)奠定基礎(chǔ)。字符串類型的值實(shí)際可以是字符串(簡單的字符串、復(fù)雜的字符串(例如 JSON、XML))、數(shù)字(整數(shù)、浮點(diǎn)數(shù)),甚至是二進(jìn)制(圖片、音頻、視頻),但是值最大不能超過 512MB。

(雖然 Redis 是 C 寫的,C 里面有字符串 本質(zhì)使用 char 數(shù)組來實(shí)現(xiàn),但是處于種種考慮,Redis 還是自己實(shí)現(xiàn)了字符串類型)

操作命令 set 設(shè)置值

set key value

set 命令有幾個(gè)選項(xiàng):

ex seconds: 為鍵設(shè)置秒級(jí)過期時(shí)間。

px milliseconds: 為鍵設(shè)置毫秒級(jí)過期時(shí)間。

nx: 鍵必須不存在, 才可以設(shè)置成功,用于添加(分布式鎖常用)。

xx: 與 nx 相反, 鍵必須存在,才可以設(shè)置成功, 用于更新。

從執(zhí)行效果上看,ex 參數(shù)和 expire 命令基本一樣。還有一個(gè)需要特別注意的地方是如果一個(gè)字符串已經(jīng)設(shè)置了過期時(shí)間,然后你調(diào)用了 set 方法修改了它,它的過期時(shí)間會(huì)消失。

而 nx 和 xx 執(zhí)行效果如下

除了 set 選項(xiàng),Redis 還提供了 setex 和 setnx 兩個(gè)命令:

setex key
seconds value

setnx key value

setex 和 setnx 的作用和 ex 和 nx 選項(xiàng)是一樣的。也就是,setex 為鍵設(shè)置秒級(jí)過期時(shí)間,setnx 設(shè)置時(shí)鍵必須不存在, 才可以設(shè)置成功。

setex 示例:

setnx 示例:

因?yàn)殒I foo-ex 已存在, 所以 setnx 失敗, 返回結(jié)果為 0,鍵 foo-ex2 不存在,所以 setnx 成功, 返回結(jié)果為 1。

有什么應(yīng)用場(chǎng)景嗎? 以 setnx 命令為例子,由于 Redis 的單線程命令處理機(jī)制,如果有多個(gè)客戶端同時(shí)執(zhí)行 setnx key value,根據(jù) setnx 的特性只有一個(gè)客戶端能設(shè)置成功,setnx 可以作為分布式鎖的一種實(shí)現(xiàn)方案。當(dāng)然分布式鎖沒有不是只有一個(gè)命令就 OK 了,其中還有很多的東西要注意,我們后面會(huì)用單獨(dú)的章節(jié)來講述基于 Redis 的分布式鎖。

get 獲取值

如果要獲取的鍵不存在, 則返回 nil(空):

mset 批量設(shè)置值

通過 mset 命令一次性設(shè)置 4 個(gè)鍵值對(duì)

mget 批量獲取值

批量獲取了鍵 a、b、c、d 的值:

如果有些鍵不存在, 那么它的值為 nil(空),結(jié)果是按照傳入鍵的順序返回。

批量操作命令可以有效提高效率,假如沒有 mget 這樣的命令,要執(zhí)行 n 次 get 命令具體耗時(shí)如下:

n 次 get 時(shí)間 = n 次網(wǎng)絡(luò)時(shí)間 + n 次命令時(shí)間

使用 mget 命令后,要執(zhí)行 n 次 get 命令操作具體耗時(shí)如下:

n 次 get 時(shí)間 = 1 次網(wǎng)絡(luò)時(shí)間 + n 次命令時(shí)間

Redis 可以支撐每秒數(shù)萬的讀寫操作,但是這指的是 Redis 服務(wù)端的處理能力,對(duì)于客戶端來說,一次命令除了命令時(shí)間還是有網(wǎng)絡(luò)時(shí)間,假設(shè)網(wǎng)絡(luò)時(shí)間為 1 毫秒,命令時(shí)間為 0.1 毫秒(按照每秒處理 1 萬條命令算),那么執(zhí)行 1000 次 get 命令需要 1.1 秒(10001+10000.1=1100ms),1 次 mget 命令的需要 0.101 秒(11+10000.1=101ms)。

Incr 數(shù)字運(yùn)算

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

值不是整數(shù), 返回錯(cuò)誤。

值是整數(shù),返回自增后的結(jié)果。

鍵不存在,按照值為 0 自增, 返回結(jié)果為 1。

除了 incr 命令,Redis 提供了 decr(自減)、incrby(自增指定數(shù)字)、decrby(自減指定數(shù)字)、incrbyfloat(自增浮點(diǎn)數(shù)),具體效果請(qǐng)同學(xué)們自行嘗試。

append 追加指令

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

strlen 字符串長度

返回字符串長度

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

注意:每個(gè)中文占 3 個(gè)字節(jié)

getset 設(shè)置并返回原值

getset 和 set 一樣會(huì)設(shè)置值, 但是不同的是,它同時(shí)會(huì)返回鍵原來的值

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

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

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

下標(biāo)從 0 開始計(jì)算。

getrange 截取字符串

getrange 截取字符串中的一部分,形成一個(gè)子串,需要指明開始和結(jié)束的偏移量,截取的范圍是個(gè)閉區(qū)間。

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

命令的時(shí)間復(fù)雜度

字符串這些命令中,除了 del、mset、mget 支持多個(gè)鍵的批量操作,時(shí)間復(fù)雜度和鍵的個(gè)數(shù)相關(guān),為 O(n),getrange 和字符串長度相關(guān),也是 O(n),其余的命令基本上都是 O(1)的時(shí)間復(fù)雜度,在速度上還是非常快的。

使用場(chǎng)景

字符串類型的使用場(chǎng)景很廣泛:

緩存功能

Redis 作為緩存層,MySQL 作為存儲(chǔ)層,絕大部分請(qǐng)求的數(shù)據(jù)都是從 Redis 中獲取。由于 Redis 具有支撐高并發(fā)的特性, 所以緩存通常能起到加速讀寫和降低后端壓力的作用。

計(jì)數(shù)

使用 Redis 作為計(jì)數(shù)的基礎(chǔ)工具,它可以實(shí)現(xiàn)快速計(jì)數(shù)、查詢緩存的功能, 同時(shí)數(shù)據(jù)可以異步落地到其他數(shù)據(jù)源。

共享 Session

一個(gè)分布式 Web 服務(wù)將用戶的 Session 信息(例如用戶登錄信息)保存在各自服務(wù)器中,這樣會(huì)造成一個(gè)問題,出于負(fù)載均衡的考慮,分布式服務(wù)會(huì)將用戶的訪問均衡到不同服務(wù)器上,用戶刷新一次訪問可能會(huì)發(fā)現(xiàn)需要重新登錄,這個(gè)問題是用戶無法容忍的。

為了解決這個(gè)問題, 可以使用 Redis 將用戶的 Session 進(jìn)行集中管理,,在這種模式下只要保證 Redis 是高可用和擴(kuò)展性的, 每次用戶更新或者查詢登錄信息都直接從 Redis 中集中獲取。

限速

比如,很多應(yīng)用出于安全的考慮, 會(huì)在每次進(jìn)行登錄時(shí), 讓用戶輸入手機(jī)驗(yàn)證碼, 從而確定是否是用戶本人。但是為了短信接口不被頻繁訪問, 會(huì)限制用戶每分鐘獲取驗(yàn)證碼的頻率,例如一分鐘不能超過 5 次。一些網(wǎng)站限制一個(gè) IP 地址不能在一秒鐘之內(nèi)方問超過 n 次也可以采用類似的思路。

哈希(Hash)

Java 里提供了 HashMap,Redis 中也有類似的數(shù)據(jù)結(jié)構(gòu),就是哈希類型。但是要注意,哈希類型中的映射關(guān)系叫作 field-value,注意這里的 value 是指 field 對(duì)應(yīng)的值,不是鍵對(duì)應(yīng)的值。

操作命令

基本上,哈希的操作命令和字符串的操作命令很類似,很多命令在字符串類型的命令前面加上了 h 字母,代表是操作哈希類型,同時(shí)還要指明要操作的 field 的值。

hset 設(shè)值

hset user:1 name lijin

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

如果設(shè)置成功會(huì)返回 1,反之會(huì)返回 0。此外 Redis 提供了 hsetnx 命令,它們的關(guān)系就像 set 和 setnx 命令一樣, 只不過作用域由鍵變?yōu)?field。

hget 取值

hget user:1 name

如果鍵或 field 不存在,會(huì)返回 nil。

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

hdel 刪除 field

hdel 會(huì)刪除一個(gè)或多個(gè) field,返回結(jié)果為成功刪除 field 的個(gè)數(shù)。

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

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

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

hmset 批量設(shè)值

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

hmget 批量取值

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

hexists 判斷 field 是否存在

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

若存在返回 1,不存在返回 0

hkeys 獲取所有 field

它返回指定哈希鍵所有的 field

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

hvals 獲取所有 value

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

hgetall 獲取所有 field 與 value

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

在使用 hgetall 時(shí),如果哈希元素個(gè)數(shù)比較多,會(huì)存在阻塞 Redis 的可能。如果只需要獲取部分 field,可以使用 hmget,如果一定要獲取全部 field-value,可以使用 hscan 命令,該命令會(huì)漸進(jìn)式遍歷哈希類型,hscan 將在后面的章節(jié)介紹。

hincrby 增加

hincrby 和 hincrbyfloat,就像 incrby 和 incrbyfloat 命令一樣,但是它們的作用域是 filed。

hstrlen 計(jì)算 value 的字符串長度

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

命令的時(shí)間復(fù)雜度

哈希類型的操作命令中,hdel,hmget,hmset 的時(shí)間復(fù)雜度和命令所帶的 field 的個(gè)數(shù)相關(guān) O(k),hkeys,hgetall,hvals 和存儲(chǔ)的 field 的總數(shù)相關(guān),O(N)。其余的命令時(shí)間復(fù)雜度都是 O(1)。

使用場(chǎng)景

從前面的操作可以看出,String 和 Hash 的操作非常類似,那為什么要弄一個(gè) hash 出來存儲(chǔ)。

哈希類型比較適宜存放對(duì)象類型的數(shù)據(jù),我們可以比較下,如果數(shù)據(jù)庫中表記錄 user 為:

idnameage1lijin182msb20

1、使用 String 類型

需要一條條去插入獲取。

set user:1:name lijin;

set user:1:age  18;

set user:2:name msb;

set user:2:age  20;

優(yōu)點(diǎn):簡單直觀,每個(gè)鍵對(duì)應(yīng)一個(gè)值

缺點(diǎn):鍵數(shù)過多,占用內(nèi)存多,用戶信息過于分散,不用于生產(chǎn)環(huán)境

2、將對(duì)象序列化存入 redis

set user:1 serialize(userInfo);

優(yōu)點(diǎn):編程簡單,若使用序列化合理內(nèi)存使用率高

缺點(diǎn):序列化與反序列化有一定開銷,更新屬性時(shí)需要把 userInfo 全取出來進(jìn)行反序列化,更新后再序列化到 redis

3、使用 hash 類型

hmset user:1 name lijin age 18

hmset user:2 name msb age 20

優(yōu)點(diǎn):簡單直觀,使用合理可減少內(nèi)存空間消耗

缺點(diǎn):要控制內(nèi)部編碼格式,不恰當(dāng)?shù)母袷綍?huì)消耗更多內(nèi)存

列表(list)

列表 (list) 類型是用來存儲(chǔ)多個(gè)有序的字符串,a、b、c、c、b 四個(gè)元素從左到右組成了一個(gè)有序的列表, 列表中的每個(gè)字符串稱為元素 (element),一個(gè)列表最多可以存儲(chǔ)(2^32-1) 個(gè)元素(4294967295)。

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

在 Redis 中,可以對(duì)列表兩端插入 (push) 和彈出(pop),還可以獲取指定范圍的元素列表、獲取指定索引下標(biāo)的元素等。列表是一種比較靈活的數(shù)據(jù)結(jié)構(gòu),它可以充當(dāng)棧和隊(duì)列的角色,在實(shí)際開發(fā)上有很多應(yīng)用場(chǎng)景。

列表類型有兩個(gè)特點(diǎn):

第一、列表中的元素是有序的,這就意味著可以通過索引下標(biāo)獲取某個(gè)元素或者某個(gè)范圍內(nèi)的元素列表。

第二、列表中的元素可以是重復(fù)的。

操作命令 lrange 獲取指定范圍內(nèi)的元素列表(不會(huì)刪除元素)

key start end

索引下標(biāo)特點(diǎn):從左到右為 0 到 N -1

lrange 0 - 1 命令可以從左到右獲取列表的所有元素

rpush 向右插入

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

lpush 向左插入

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

linsert 在某個(gè)元素前或后插入新元素

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

這三個(gè)返回結(jié)果為命令完成后當(dāng)前列表的長度,也就是列表中包含的元素個(gè)數(shù),同時(shí) rpush 和 lpush 都支持同時(shí)插入多個(gè)元素。

lpop 從列表左側(cè)彈出(會(huì)刪除元素)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)r

請(qǐng)注意,彈出來元素就沒了。

rpop 從列表右側(cè)彈出

rpop 將會(huì)把列表最右側(cè)的元素 d 彈出。

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

lrem 對(duì)指定元素進(jìn)行刪除

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

lrem 命令會(huì)從列表中找到等于 value 的元素進(jìn)行刪除,根據(jù) count 的不同分為三種情況:

count 0,從左到右, 刪除最多 count 個(gè)元素。

count 0,從右到左, 刪除最多 count 絕對(duì)值個(gè)元素。

count=0,刪除所有。

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

返回值是實(shí)際刪除元素的個(gè)數(shù)。

ltirm 按照索引范圍修剪列表

例如想保留列表中第 0 個(gè)到第 1 個(gè)元素

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)ls

lset 修改指定索引下標(biāo)的元素

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

lindex 獲取列表指定索引下標(biāo)的元素

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)l

llen 獲取列表長度

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

blpop 和 brpop 阻塞式彈出元素

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,除此之外還支持多個(gè)列表類型,也支持設(shè)定阻塞時(shí)間,單位秒,如果阻塞時(shí)間為 0,表示一直阻塞下去。我們以 brpop 為例說明。

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

A 客戶端阻塞了(因?yàn)闆]有元素就會(huì)阻塞)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

A 客戶端一直處于阻塞狀態(tài)。此時(shí)我們從另一個(gè)客戶端 B 執(zhí)行

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

A 客戶端則輸出

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

注意:brpop 后面如果是多個(gè)鍵,那么 brpop 會(huì)從左至右遍歷鍵,一旦有一個(gè)鍵能彈出元素,客戶端立即返回。

使用場(chǎng)景

列表類型可以用于比如:

消息隊(duì)列,Redis 的 lpush+brpop 命令組合即可實(shí)現(xiàn)阻塞隊(duì)列,生產(chǎn)者客戶端使用 lrpush 從列表左側(cè)插入元素,多個(gè)消費(fèi)者客戶端使用 brpop 命令阻塞式的“搶”列表尾部的元素, 多個(gè)客戶端保證了消費(fèi)的負(fù)載均衡和高可用性。

文章列表

每個(gè)用戶有屬于自己的文章列表,現(xiàn)需要分頁展示文章列表。此時(shí)可以考慮使用列表, 因?yàn)榱斜聿坏怯行虻? 同時(shí)支持按照索引范圍獲取元素。

實(shí)現(xiàn)其他數(shù)據(jù)結(jié)構(gòu)

lpush+lpop =Stack(棧)

lpush +rpop =Queue(隊(duì)列)

lpsh+ ltrim =Capped Collection(有限集合)

lpush+brpop=Message Queue(消息隊(duì)列)

集合(set)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

集合(set)類型也是用來保存多個(gè)的字符串元素, 但和列表類型不一樣的是,集合中不允許有重復(fù)元素, 并且集合中的元素是無序的, 不能通過索引下標(biāo)獲取元素。

一個(gè)集合最多可以存儲(chǔ) 2 的 32 次方 - 1 個(gè)元素。Redis 除了支持集合內(nèi)的增刪改查,同時(shí)還支持多個(gè)集合取交集、并集、差集,合理地使用好集合類型, 能在實(shí)際開發(fā)中解決很多實(shí)際問題。

集合內(nèi)操作命令 sadd 添加元素

允許添加多個(gè),返回結(jié)果為添加成功的元素個(gè)數(shù)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

srem 刪除元素

允許刪除多個(gè),返回結(jié)果為成功刪除元素個(gè)數(shù)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

scard 計(jì)算元素個(gè)數(shù)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

sismember 判斷元素是否在集合中

如果給定元素 element 在集合內(nèi)返回 1,反之返回 0

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

srandmember 隨機(jī)從集合返回指定個(gè)數(shù)元素

指定個(gè)數(shù)如果不寫默認(rèn)為 1

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

spop 從集合隨機(jī)彈出元素

同樣可以指定個(gè)數(shù),如果不寫默認(rèn)為 1,注意,既然是彈出,spop 命令執(zhí)行后, 元素會(huì)從集合中刪除, 而 srandmember 不會(huì)。

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

smembers 獲取所有元素(不會(huì)彈出元素)

返回結(jié)果是無序的

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

集合間操作命令

現(xiàn)在有兩個(gè)集合, 它們分別是 set1 和 set2

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

sinter 求多個(gè)集合的交集

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

suinon 求多個(gè)集合的并集

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

sdiff 求多個(gè)集合的差集

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

將交集、并集、差集的結(jié)果保存

sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]復(fù)制代碼

集合間的運(yùn)算在元素較多的情況下會(huì)比較耗時(shí),所以 Redis 提供了上面三個(gè)命令 (原命令 +store) 將集合間交集、并集、差集的結(jié)果保存在 destination key 中,例如:

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

使用場(chǎng)景

集合類型比較典型的使用場(chǎng)景是標(biāo)簽(tag)。例如一個(gè)用戶可能對(duì)娛樂、體育比較感興趣,另一個(gè)用戶可能對(duì)歷史、新聞比較感興趣,這些興趣點(diǎn)就是標(biāo)簽。有了這些數(shù)據(jù)就可以得到喜歡同一個(gè)標(biāo)簽的人,以及用戶的共同喜好的標(biāo)簽,這些數(shù)據(jù)對(duì)于用戶體驗(yàn)以及增強(qiáng)用戶黏度比較重要。

例如一個(gè)電子商務(wù)的網(wǎng)站會(huì)對(duì)不同標(biāo)簽的用戶做不同類型的推薦,比如對(duì)數(shù)碼產(chǎn)品比較感興趣的人,在各個(gè)頁面或者通過郵件的形式給他們推薦最新的數(shù)碼產(chǎn)品,通常會(huì)為網(wǎng)站帶來更多的利益。

除此之外,集合還可以通過生成隨機(jī)數(shù)進(jìn)行比如抽獎(jiǎng)活動(dòng),以及社交圖譜等等。

有序集合(ZSET)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

有序集合相對(duì)于哈希、列表、集合來說會(huì)有一點(diǎn)點(diǎn)陌生, 但既然叫有序集合, 那么它和集合必然有著聯(lián)系, 它保留了集合不能有重復(fù)成員的特性, 但不同的是, 有序集合中的元素可以排序。但是它和列表使用索引下標(biāo)作為排序依據(jù)不同的是, 它給每個(gè)元素設(shè)置一個(gè)分?jǐn)?shù) (score) 作為排序的依據(jù)。

有序集合中的元素不能重復(fù),但是 score 可以重復(fù),就和一個(gè)班里的同學(xué)學(xué)號(hào)不能重復(fù), 但是考試成績可以相同。

有序集合提供了獲取指定分?jǐn)?shù)和元素范圍查詢、計(jì)算成員排名等功能,合理的利用有序集合,能幫助我們?cè)趯?shí)際開發(fā)中解決很多問題。

集合內(nèi)操作命令 zadd 添加成員

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

返回結(jié)果代表成功添加成員的個(gè)數(shù)

要注意:

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

zadd 命令還有四個(gè)選項(xiàng) nx、xx、ch、incr 四個(gè)選項(xiàng)

nx: member 必須不存在,才可以設(shè)置成功,用于添加。

xx: member 必須存在,才可以設(shè)置成功, 用于更新。

ch: 返回此次操作后, 有序集合元素和分?jǐn)?shù)發(fā)生變化的個(gè)數(shù)

incr: 對(duì) score 做增加,相當(dāng)于后面介紹的 zincrby

zcard 計(jì)算成員個(gè)數(shù)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

zscore 計(jì)算某個(gè)成員的分?jǐn)?shù)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

如果成員不存在則返回 nil

zrank 計(jì)算成員的排名

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

zrank 是從分?jǐn)?shù)從低到高返回排名

zrevrank 反之

很明顯,排名從 0 開始計(jì)算。

zrem 刪除成員

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

允許一次刪除多個(gè)成員。

返回結(jié)果為成功刪除的個(gè)數(shù)。

zincrby 增加成員的分?jǐn)?shù)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

zrange 和 zrevrange 返回指定排名范圍的成員

有序集合是按照分值排名的,zrange 是從低到高返回,zrevrange 反之。如果加上
withscores 選項(xiàng),同時(shí)會(huì)返回成員的分?jǐn)?shù)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

zrangebyscore 返回指定分?jǐn)?shù)范圍的成員

zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores][limit offset count]復(fù)制代碼

其中 zrangebyscore 按照分?jǐn)?shù)從低到高返回,zrevrangebyscore 反之。例如下面操作從低到高返回 200 到 221 分的成員,withscores 選項(xiàng)會(huì)同時(shí)返回每個(gè)成員的分?jǐn)?shù)。

同時(shí) min 和 max 還支持開區(qū)間(小括號(hào))和閉區(qū)間(中括號(hào)),-inf 和 +inf 分別代表無限小和無限大:

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

zcount 返回指定分?jǐn)?shù)范圍成員個(gè)數(shù)

zcount key min max

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

zremrangebyrank 按升序刪除指定排名內(nèi)的元素

zremrangebyrank key start end

zremrangebyscore 刪除指定分?jǐn)?shù)范圍的成員

zremrangebyscore key min max

集合間操作命令 zinterstore 交集

zinterstoreRedis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

這個(gè)命令參數(shù)較多,下面分別進(jìn)行說明

destination: 交集計(jì)算結(jié)果保存到這個(gè)鍵。

numkeys: 需要做交集計(jì)算鍵的個(gè)數(shù)。

key [key …]: 需要做交集計(jì)算的鍵。

weights weight
[weight …]: 每個(gè)鍵的權(quán)重,在做交集計(jì)算時(shí),每個(gè)鍵中的每個(gè) member 會(huì)將自己分?jǐn)?shù)乘以這個(gè)權(quán)重, 每個(gè)鍵的權(quán)重默認(rèn)是 1。

aggregate sum/
min |max: 計(jì)算成員交集后,分值可以按照 sum(和)、min(最小值)、max(最大值)做匯總, 默認(rèn)值是 sum。

不太好理解,我們用一個(gè)例子來說明。(算平均分)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)

zunionstore 并集

該命令的所有參數(shù)和 zinterstore 是一致的,只不過是做并集計(jì)算,大家可以自行實(shí)驗(yàn)。

到此,關(guān)于“Redis 常用數(shù)據(jù)結(jié)構(gòu)有哪些及怎么實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-13發(fā)表,共計(jì)7607字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒有評(píng)論)
主站蜘蛛池模板: 东宁县| 大埔区| 获嘉县| 康平县| 汾阳市| 荆门市| 辛集市| 图们市| 定日县| 全州县| 正宁县| 丰顺县| 南城县| 漾濞| 襄樊市| 观塘区| 龙州县| 杭锦旗| 龙川县| 吉隆县| 达州市| 威宁| 宝山区| 社旗县| 呼图壁县| 长海县| 抚州市| 寿阳县| 通化县| 虹口区| 双城市| 利辛县| 曲水县| 武功县| 阳江市| 乐都县| 龙川县| 漾濞| 连云港市| 文安县| 白银市|