redis數(shù)據(jù)結(jié)構(gòu)

「Redis」五種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)及應(yīng)用場景

Redis 有 5 種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),分別為:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。



一. string (字符串)

字符串 string 是 Redis 最簡單的數(shù)據(jù)結(jié)構(gòu)。Redis 所有的數(shù)據(jù)結(jié)構(gòu)都是以唯一的 key 字符串作為名稱,然后通過這個唯一 key 值來獲取相應(yīng)的 value 數(shù)據(jù)。不同類型的數(shù)據(jù)結(jié)構(gòu)的差異就在于 value 的結(jié)構(gòu)不一樣。字符串結(jié)構(gòu)使用非常廣泛,一個常見的用途就是緩存用戶信息。我們將用戶信息結(jié)構(gòu)體使用 JSON 序列化成字符串,然后將序列化后的字符串塞進 Redis 來緩存。同樣,取用戶信息會經(jīng)過一次反序列化的過程。


1. string的常用操作

(1) 鍵值對

# 存入字符串鍵值對

set key value

# 獲取一個字符串鍵值對

get key

# 刪除

del key

復(fù)制代碼

(2) 批量操作鍵值對

可以批量對多個字符串進行讀寫,節(jié)省網(wǎng)絡(luò)耗時開銷


# 批量存儲字符串鍵值對

mset ket value [key value .....]

# 批量獲取字符串鍵值對

mget key [key ......]

復(fù)制代碼

(3) 過期和 set 命令擴展

# 設(shè)置一個鍵(key)的過期時間(seconds)

expire key seconds

# setex 等價于 set + expire

setex key seconds value

# 存入一個不存在的字符串鍵值對

setnx key value

復(fù)制代碼


(4) 原子操作

如果 value 值是一個整數(shù),還可以對它進行自增操作。自增是有范圍的,它的范圍是 signed long 的最大最小值,超過了這個值,Redis 會報錯


# 將 key 中存儲的值加1

incr key

# 將 key 中存儲的值減1

decr key

# 將 key 中存儲的值加increment

incrby key increment

# 將 key 中存儲的值減decrement

decrby key decrement

復(fù)制代碼


2. string的應(yīng)用場景

Redis應(yīng)用場景:常規(guī)key-value緩存應(yīng)用、常規(guī)計數(shù):微信公眾號閱讀次數(shù),粉絲數(shù)等、分布式鎖等


(1)單值緩存

set key value

get key

復(fù)制代碼

(2)對象緩存


set user:1 value(json格式數(shù)據(jù))

mset user:1:name zhuge user:1:balance 1888

mget user:1:name user:1:balance

復(fù)制代碼

(3)計數(shù)器


incr article:readcount:{文章id}

get article:readcount:{文章id}

復(fù)制代碼

(4)分布式鎖

(5)web集群session共享

這里推薦王松大神的一篇文章:

wangsong.blog.csdn.net/article/det…


(6)分布式系統(tǒng)全局序列號

redis批量生成序列號提升性能


二. hash (哈希)

String類型存儲的困惑


對象類數(shù)據(jù)的存儲如果具有較為頻繁的更新需求,操作會顯得笨重,存容易,改麻煩。

為了區(qū)別與Redis中的鍵值對的稱呼,hash中的鍵成為field,而key特指Redis的鍵。


hash類型

新的存儲需求:對一系列存儲的數(shù)據(jù)進行編組,方便管理,典型應(yīng)用存儲對象信息

需要的內(nèi)存結(jié)構(gòu):一個存儲空間保存多少個鍵值對數(shù)據(jù)

hash類型:底層使用哈希表結(jié)構(gòu)實現(xiàn)數(shù)據(jù)存儲,相當(dāng)于 Java 語言里面的 HashMap,它是無序字典。內(nèi)部實現(xiàn)結(jié)構(gòu)上同 Java 的HashMap 也是一致的,同樣的數(shù)組 + 鏈表二維結(jié)構(gòu)。第一維 hash 的數(shù)組位置碰撞時,就會將碰撞的元素使用鏈表串接起來。

1. hash的常用操作

(1)操作單個數(shù)據(jù)

# 添加修改數(shù)據(jù)

hset key field value

# 獲取數(shù)據(jù)

hget key field

# 刪除數(shù)據(jù)

hdel key field1 [field2 ...]

復(fù)制代碼

(2)操作多個數(shù)據(jù)

# 添加/修改多個數(shù)據(jù)

hmset key field1 value1 field2 calue2

#獲取多個數(shù)據(jù)

hmget key field1 field2 …

# 獲取哈希表key中field的數(shù)量

hlen key

# 獲取哈希表key中所有的鍵值

hgetall key

# 獲取哈希表中是否存在指定的字段

hexists key field

復(fù)制代碼

(3)原子操作

# 將 field 中存儲的值加 increment

hincrby key field increment

# float 值

hincrbyfloat key field increment

復(fù)制代碼

2. hash的應(yīng)用場景

(1)對象緩存


hmset user {userId}:name value {userId}:balance value

hmset user {1}:name zhuge {1}:balance 1888

復(fù)制代碼

(2)購物車

業(yè)務(wù)場景:電商網(wǎng)站購物車的設(shè)計與實現(xiàn)。


解決方案:

以客戶id作為key,每位用戶創(chuàng)建一個hash存儲結(jié)構(gòu)存儲對應(yīng)的購物車信息。

將商品編號作為field,購買數(shù)量作為value進行存儲。

添加商品:追加全新的field與value。 hset cart:101 1001 1

瀏覽:遍歷hash。 hgetall cart:101

更改數(shù)量:自增/自減,設(shè)置value值。 hincrby cart:101 1001 1

刪除商品:刪除field。 hdel cart:101 1001

清空:刪除key。

3. hash的優(yōu)缺點

優(yōu)點

同類數(shù)據(jù)歸類整合儲存,方便數(shù)據(jù)管理。

相比string操作消耗內(nèi)存與cpu更小。

相比string儲存更節(jié)省空間。

缺點

過期功能不能使用在field上,只能用在key上。

Redis集群架構(gòu)下不適合大規(guī)模使用。

redis集群架構(gòu)



三. List(列表)

數(shù)據(jù)存儲需求:存儲多個數(shù)據(jù),并對數(shù)據(jù)進入存儲空間的順序進行區(qū)分

需要的存儲數(shù)據(jù):一個存儲空間保存多個數(shù)據(jù),且通過數(shù)據(jù)可以體現(xiàn)進入順序

list類型:保存多個數(shù)據(jù),底層使用 雙向鏈表 存儲結(jié)構(gòu)實現(xiàn)

1. list的常用操作

(1)添加/修改數(shù)據(jù)

# 將一個或多個值value插入到key列表的表頭(最左邊)

lpush key value1 [value2 …]

# 將一個或多個值value插入到key列表的表尾(最右邊)

rpush key value1 [value2 …]

復(fù)制代碼

(2)獲取并移除數(shù)據(jù)

# 移除并返回key列表的頭元素

lpop key

# 移除并返回key列表的尾元素

rpop key

復(fù)制代碼

(3)獲取數(shù)據(jù)

# 獲取列表key中指定區(qū)間內(nèi)的元素,從左數(shù)第start到stop個元素,從0開始

lrange key start stop

# 查詢第i個元素

lindex key index

# list的長度

llen key

復(fù)制代碼

(4)規(guī)定時間內(nèi)獲取并移除數(shù)據(jù)

# 從key列表表頭彈出一個元素,若列表中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待

blpop key1 [key2 ...] timeout

# 從key列表表尾彈出一個元素,若列表中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待

brpop key1 [key2 ...] timeout

復(fù)制代碼

開兩個客戶端,一個設(shè)置15s內(nèi)獲取list1中的值,此時list1位空一直等待(阻塞),在15秒內(nèi)另一個客戶端存入到list1中數(shù)據(jù),此時就被獲取到。


(5)移除指定數(shù)據(jù)

# 根據(jù)參數(shù)count的值,移除列表中與參數(shù)value相等的元素。count為移除的數(shù)量,value為移除哪個值

lrem key count value

復(fù)制代碼

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

Stack(棧) = lpush + lpop → filo

Queue(隊列) = lpush + rpop

Blocking MQ(阻塞隊列) = lpush + brpop

3. list的應(yīng)用場景

(1)最新消息的展示

業(yè)務(wù)場景


新浪微博、twitter中個人用于的關(guān)注列表需要按照用戶的關(guān)注順序進行展示,粉絲列表需要將最近關(guān)注的粉絲列在前面。

公眾號、新聞、資訊類網(wǎng)站如何將最新的新聞或資訊按照發(fā)生的事件順序展示。

企業(yè)運營過程中,系統(tǒng)將產(chǎn)生出大量的運營數(shù)據(jù),如何保障墮胎服務(wù)器操作日志的統(tǒng)一順序輸出?

解決方案


依賴list的數(shù)據(jù)具有順序的特征對信息進行管理。

使用隊列模型解決多路信息匯總合并的問題。

使用棧模型解決最新消息的問題。

# 河北日報發(fā)了消息,消息id為1

lpush msg:user_id 1

# 央視網(wǎng)發(fā)了消息,消息id為2

lpush msg:user_id 2

# 查看最新公眾號消息

lrange msg:user_id 0 5

復(fù)制代碼

四. set(集合)

新的存儲需求:存儲大量的數(shù)據(jù),在查詢方面提供更高的效率

需要的存儲結(jié)構(gòu):能夠保存大量的數(shù)據(jù),高效的內(nèi)部存儲機制,便于查詢

set類型:與hash存儲結(jié)構(gòu)完全相同,僅存儲鍵,不存儲值(nil),并且值是不允許重復(fù)的。也就是只有鍵沒有值的hash

1. set的常用操作

(1)添加數(shù)據(jù)

# 將一個或多個member元素加入到集合key當(dāng)中,已經(jīng)存在于集合的member元素將被忽略。若key不存在,則創(chuàng)建一個只包含member元素作成員的集合

sadd key member [member ...]

復(fù)制代碼

(2)獲取數(shù)據(jù)

# 獲取集合 key 中的所有成員

smembers key

# 獲取集合key中元素的數(shù)量

scard key


# 判斷集合key中是否存在member元素

sismember key member


# 獲取集合key中的count個隨機元素,并從集合key中移除

spop key [count]

# 獲取集合key中的count個隨機元素,不從集合key中移除

srandmember key [count]

復(fù)制代碼

(3)刪除數(shù)據(jù)

# 移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略

srem key member [member ...]

復(fù)制代碼

2. set的運算操作

(1)交集

返回一個集合的全部成員,該集合是所有給定集合的交集。 sinter key


代碼示例:

redis> smembers group_1

1) "LI LEI"

2) "TOM"

3) "JACK"


redis> smembers group_2

1) "HAN MEIMEI"

2) "JACK"


redis> sinter group_1 group_2

1) "JACK"

復(fù)制代碼

將交集結(jié)果保存到destination集合,如果destination集合已經(jīng)存在,則將其覆蓋。destination可以是key本身。 sinterstore destination key [key …]


代碼示例:

redis> smembers songs

1) "good bye joe"

2) "hello,peter"


redis> smembers my_songs

1) "good bye joe"

2) "falling"


redis> sintrestore song_interset songs my_songs

(integer) 1


redis> smembers song_interset

1) "good bye joe"

復(fù)制代碼

(2)并集

返回一個集合的全部成員,該集合是所有給定集合的并集。 sunion key [key ...]


代碼示例:

redis> smembers songs

1) "Billie Jean"


redis> smembers my_songs

1) "Believe Me"


redis> sunion songs my_songs

1) "Billie Jean"

2) "Believe Me"

復(fù)制代碼

將并集結(jié)果保存到destination集合,如果destination集合已經(jīng)存在,則將其覆蓋。destination可以是key本身。 sunionstore destination key [key …]


代碼示例:

redis> smembers NoSQL

1) "MongoDB"

2) "Redis"


redis> smembers SQL

1) "sqlite"

2) "MySQL"


redis> sunionstore db NoSQL SQL

(integer) 4


redis> smembers db

1) "MySQL"

2) "sqlite"

3) "MongoDB"

4) "Redis"

復(fù)制代碼

(3)差集

返回一個集合的全部成員,該集合是所有給定集合之間的差集。 sdiff key [key ...]


代碼示例:

redis> smembers peters_movies

1) "bet man"

2) "start war"

3) "2012"


redis> smembers joes_movies

1) "hi, lady"

2) "Fast Five"

3) "2012"


redis> sdiff peters_movies joes_movies

1) "bet man"

2) "start war"

復(fù)制代碼

將差集結(jié)果保存到destination集合,如果destination集合已經(jīng)存在,則將其覆蓋。destination可以是key本身。 sdiffstore destination key [key …]


代碼示例:

redis> smembers joes_movies

1) "hi, lady"

2) "Fast Five"

3) "2012"


redis> smembers peters_movies

1) "bet man"

2) "start war"

3) "2012"


redis> sdiffstore joe_diff_peter joes_movies peters_movies

(integer) 2


redis> smembers joe_diff_peter

1) "hi, lady"

2) "Fast Five"

復(fù)制代碼

3. set的應(yīng)用場景

(1)微信抽獎小程序


點擊參加抽獎加入set集合

sadd key {user_id}

復(fù)制代碼

查看參與抽獎所有用戶

smembers key

復(fù)制代碼

抽取count名中獎?wù)?/p>

srandmember key [count] / spop key [count]

復(fù)制代碼

(2)隨機推薦

redis應(yīng)用于隨機推薦類信息檢索,例如熱點歌單推薦,熱點新聞推薦,熱點旅游線路,應(yīng)用APP推薦,大V推薦等。


業(yè)務(wù)場景:

每位用戶首次使用進入頭條時候會設(shè)置3項愛好的內(nèi)容,但是后期為了增加用戶的活躍度,興趣點,必須讓用戶對其他信息類別逐漸產(chǎn)生興趣,增加客戶留存度,如何實現(xiàn)?


業(yè)務(wù)分析:

系統(tǒng)分析出各個分類的最新或最熱點信息條目并組織成set集合

隨機挑選其中部分信息

配合用戶關(guān)注信息分類中的熱點信息組織展示的全信息集合

解決方案:

隨機獲取集合中指定數(shù)量的數(shù)據(jù)

srandmember key [count]

復(fù)制代碼

隨機獲取集合中的某個數(shù)據(jù)并將該數(shù)據(jù)移出集合

spop key

復(fù)制代碼

(3)共同好友

脈脈為了促進用戶間的交流,保障業(yè)務(wù)成單率的提升,需要讓每位用戶擁有大量的好友,事實上職場新人不具有更多的職場好友,如何快速為用戶積累更多的好友?

新浪微博為了增加用戶熱度,提高用戶留存性,需要微博用戶在關(guān)注更多的人,以此獲得更多的信息或熱門話題,如何提高用戶關(guān)注他人的總量?

QQ新用戶入網(wǎng)年齡越來越低,這些用戶的朋友圈交際圈非常小,往往集中在一所學(xué)校甚至一個班級中,如何幫助用戶快速積累好友用戶帶來更多的活躍度?

微信公眾號是微信信息流通的渠道之一,增加用戶關(guān)注的公眾號成為提高用戶活躍度的一種方式,如何幫助用戶積累更多關(guān)注的公眾號?

美團外賣為了提升成單量,必須幫助用戶挖掘美食需求,如何推薦給用戶最適合自己的美食?解決方案:

# 我關(guān)注的人

redis> smembers mySet

1) "zhuge"

2) "yangguo"

3) "sima"


# 楊過關(guān)注的人

redis> smembers yangguoSet

1) "zhuge"

2) "sima"

3) "luban"

4) "guojia"


# 司馬關(guān)注的人

redis> smembers simaSet

1) "zhuge"

2) "yangguo"

3) "guojia"

4) "luban"

5) "xunyu"

復(fù)制代碼

共同關(guān)注

# 我和楊過共同關(guān)注

redis> sinter yangguoSet mySet

1) "zhuge"

2) "sima"

復(fù)制代碼

我關(guān)注的人也關(guān)注他

# 我關(guān)注的人也關(guān)注楊過

redis> sismember simaSet yangguo

(integer) 1

復(fù)制代碼

我可能認識的人

redis> sdiff mySet yangguoSet

1) "luban"

2) "guojia"

復(fù)制代碼

(4)訪問量統(tǒng)計去重

公司對旗下新的網(wǎng)站做推廣,統(tǒng)計網(wǎng)站的PV (訪問量),UV (獨立訪客),IP (獨立IP)。


PV:網(wǎng)站被訪問次數(shù),可通過刷新頁面提高訪問量。

UV:網(wǎng)站被不同用戶訪問的次數(shù),可通過cookie統(tǒng)計訪問量,相同用戶切換IP地址,UV不變。

IP:網(wǎng)站被不同IP地址訪問的總次數(shù),可通過IP地址統(tǒng)計訪問量,相同IP不同用戶訪問,IP不變。

解決方案:

針對不同的統(tǒng)計類型有不同的數(shù)據(jù)存儲方式:


利用set集合的數(shù)據(jù)去重特征,記錄各種訪問數(shù)據(jù)

建立string類型數(shù)據(jù),利用incr統(tǒng)計日訪問量(PV)

建立set模型,記錄不同cookie數(shù)量(UV)

建立set模型,記錄不用IP數(shù)量(IP)

(5)黑白名單

黑名單:

資訊類信息類網(wǎng)站追求高訪問量,但是由于其信息的價值,往往容易被不法分子利用,通過爬蟲技術(shù),快速獲取信息,個別特種行業(yè)網(wǎng)站信息通過爬蟲獲取分析后,可以轉(zhuǎn)換成商業(yè)機密進行出售。例如第三方火車票、機票、酒店刷票代購軟件、電商刷評論、刷好評。 同時爬蟲帶來的偽流量也會給經(jīng)營者帶來錯覺,產(chǎn)生錯誤的決策,有效避免網(wǎng)站被爬蟲反復(fù)爬取成為每個網(wǎng)站都要考慮的基本問題。在基于技術(shù)層面區(qū)分出爬蟲用戶后,需要將此類用戶進行有效的屏蔽,這就是黑名單的典型應(yīng)用。 ps:不是說爬蟲一定做摧毀性的工作,有些小型網(wǎng)站需要爬蟲為其帶來一些流量。


白名單:

對于安全性更高的應(yīng)用訪問,僅僅靠黑名單是不能解決安全問題的,此時需要設(shè)定可訪問的用戶群體,依賴白名單做更為苛刻的訪問驗證。


解決方案:

基于經(jīng)營戰(zhàn)略設(shè)定問題用戶發(fā)現(xiàn)、鑒別規(guī)則

周期性更新滿足規(guī)則的用戶黑名單,加入set集合

用戶行為信息達到后與黑名單進行比對,確認行為去向

黑名單過濾IP地址:應(yīng)用于開放游客訪問權(quán)限的信息源

黑名單過濾設(shè)備信息:應(yīng)用于限定訪問設(shè)備的信息源

黑名單過濾用戶:應(yīng)用于基于訪問權(quán)限的信息源

五. sorted_set(有序集合)

新的存儲需求:根據(jù)排序有利于數(shù)據(jù)的有效顯示,需要提供一種可以根據(jù)自身特征進行排序的方式。

需要的存儲結(jié)構(gòu):新的存儲模型,可以保存可排序的數(shù)據(jù)。

zset類型:在set的存儲結(jié)構(gòu)基礎(chǔ)上添加可排序字段。

1. sorted_set的常用操作

(1)添加數(shù)據(jù)

# 將一個或多個 member 元素及其 score 值加入到有序集 key 當(dāng)中。

zadd key score member [[score member] [score member] …]

復(fù)制代碼

如果某個 member 已經(jīng)是有序集的成員,那么更新這個 member 的 score 值,并通過重新插入這個 member元素,來保證該 member 在正確的位置上。

score 值可以是整數(shù)值或雙精度浮點數(shù)。

如果 key 不存在,則創(chuàng)建一個空的有序集并執(zhí)行 ZADD 操作。

當(dāng) key 存在但不是有序集類型時,返回一個錯誤。

(2)獲取數(shù)據(jù)

# 獲取有序集 key 中,成員 member 的 score 值

zscore key member


# 獲取有序集 key 的成員的數(shù)量。

zcard key


# 獲取有序集 key 中, score 值在 min 和 max 之間(默認包括 score 值等于 min 或 max )的成員的數(shù)量。

zcount key min max

復(fù)制代碼

# 正序(從小到大)獲取有序集 key 中,指定區(qū)間內(nèi)[start到stop]的成員。

zrange key start stop [WITHSCORES]

# 倒序(從大到?。┇@取有序集 key 中,指定區(qū)間內(nèi)[start到stop]的成員。

zrevrange key start stop [WITHSCORES]

復(fù)制代碼

下標(biāo)參數(shù) start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。你也可以使用負數(shù)下標(biāo),以 -1 表示最后一個成員, -2 表示倒數(shù)第二個成員,以此類推。

超出范圍的下標(biāo)并不會引起錯誤。 比如說,當(dāng) start 的值比有序集的最大下標(biāo)還要大,或是 start > stop 時, zrange命令只是簡單地返回一個空列表。 另一方面,假如 stop 參數(shù)的值比有序集的最大下標(biāo)還要大,那么 Redis 將 stop 當(dāng)作最大下標(biāo)來處理。

(3)刪除數(shù)據(jù)

# 移除有序集 key 中的一個或多個成員,不存在的成員將被忽略。

zrem key member [member …]

復(fù)制代碼

條件刪除

# 移除有序集 key 中,指定排名(rank)區(qū)間內(nèi)的所有成員。

zremrangebyrank key start stop

# 移除有序集 key 中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員。

zremrangebyscore key min max

復(fù)制代碼

示例:

redis> ZADD salary 2000 jack

(integer) 1

redis> ZADD salary 5000 tom

(integer) 1

redis> ZADD salary 3500 peter

(integer) 1


redis> ZREMRANGEBYRANK salary 0 1? ? ? # 移除下標(biāo) 0 至 1 區(qū)間內(nèi)的成員

(integer) 2


redis> ZRANGE salary 0 -1 WITHSCORES? ? # 有序集只剩下一個成員

1) "tom"

2) "5000"

復(fù)制代碼

redis> ZRANGE salary 0 -1 WITHSCORES? ? ? ? ? # 顯示有序集內(nèi)所有成員及其 score 值

1) "tom"

2) "2000"

3) "peter"

4) "3500"

5) "jack"

6) "5000"


redis> ZREMRANGEBYSCORE salary 1500 3500? ? ? # 移除所有薪水在 1500 到 3500 內(nèi)的員工

(integer) 2


redis> ZRANGE salary 0 -1 WITHSCORES? ? ? ? ? # 剩下的有序集成員

1) "jack"

2) "5000"

復(fù)制代碼

(4)原子操作

# 為有序集 key 的成員 member 的 score 值加上增量 increment 。

zincrby key increment member

復(fù)制代碼

示例:

redis> ZSCORE salary tom

"2000"


redis> ZINCRBY salary 2000 tom? # tom 加薪啦!

"4000"

復(fù)制代碼

2. sorted_set集合操作

(1)并集

# 計算給定的一個或多個有序集的并集,其中給定 key 的數(shù)量必須以 numkeys 參數(shù)指定,并將該并集(結(jié)果集)儲存到 destination 。

zunionstore destination numkeys key [key …]

復(fù)制代碼

示例:

redis> ZRANGE programmer 0 -1 WITHSCORES

1) "peter"

2) "2000"

3) "jack"

4) "3500"

5) "tom"

6) "5000"


redis> ZRANGE manager 0 -1 WITHSCORES

1) "herry"

2) "2000"

3) "mary"

4) "3500"

5) "bob"

6) "4000"


redis> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3? # 公司決定加薪。。。除了程序員。。。

(integer) 6


redis> ZRANGE salary 0 -1 WITHSCORES

1) "peter"

2) "2000"

3) "jack"

4) "3500"

5) "tom"

6) "5000"

7) "herry"

8) "6000"

9) "mary"

10) "10500"

11) "bob"

12) "12000"

復(fù)制代碼

(2)交集

# 計算給定的一個或多個有序集的交集,其中給定 key 的數(shù)量必須以 numkeys 參數(shù)指定,并將該交集(結(jié)果集)儲存到 destination 。

zinterstore destination numkeys key [key …]

復(fù)制代碼

示例:

redis > ZADD mid_test 70 "Li Lei"

(integer) 1

redis > ZADD mid_test 70 "Han Meimei"

(integer) 1

redis > ZADD mid_test 99.5 "Tom"

(integer) 1


redis > ZADD fin_test 88 "Li Lei"

(integer) 1

redis > ZADD fin_test 75 "Han Meimei"

(integer) 1

redis > ZADD fin_test 99.5 "Tom"

(integer) 1


redis > ZINTERSTORE sum_point 2 mid_test fin_test

(integer) 3


redis > ZRANGE sum_point 0 -1 WITHSCORES? ? # 顯示有序集內(nèi)所有成員及其 score 值

1) "Han Meimei"

2) "145"

3) "Li Lei"

4) "158"

5) "Tom"

6) "199"

復(fù)制代碼

3. sorted_set應(yīng)用場景

(1)排行榜


解決方案:

點擊新聞,點擊量 +1

zincrby hotNews:20210104? 1? 特朗普通話語音曝光

復(fù)制代碼

展示當(dāng)日排行前十

zrevrange hotNews:20210104 0 9 WITHSCORES

復(fù)制代碼

七日搜索榜單計算

zunionstore? hotNews:20210104-2021010110? 7? hotNews:20210104 hotNews:20210105 ... hotNews:20210110

復(fù)制代碼

展示七日排行前十

zrevrange hotNews:20210104-2021010110 0 9 WITHSCORES

復(fù)制代碼

(2)會員短期體驗之過期失效

基礎(chǔ)服務(wù)+增值服務(wù)類網(wǎng)站會設(shè)定各位會員的試用,讓用戶充分體驗會員優(yōu)勢。例如觀影試用VIP、游戲VIP體驗、云盤下載體驗VIP、數(shù)據(jù)查看體驗VIP,當(dāng)VIP體驗到期后,如何有效管理此類信息。即便對于正式VIP用戶也存在對應(yīng)的管理方式。 網(wǎng)站會定期開啟投票、討論,限時進行,逾期作廢。如何有效管理此類過期信息。


解決方案:

對于基于時間線限定的任務(wù)處理,將處理時間記錄為score值,利用排序功能區(qū)分處理的先后順序

記錄下一個要處理的事件,當(dāng)對比系統(tǒng)時間發(fā)現(xiàn)當(dāng)然仍后到期后移除redis中的記錄,并記錄下一個要處理的時間

當(dāng)新任務(wù)加入時,判定并更新當(dāng)前下一個要處理的任務(wù)時間

為提升sorted_set的性能,通常將任務(wù)根據(jù)特征存儲成若干個sorted_set.例如1小時內(nèi),1天內(nèi),年度等,操作時逐漸提升,將即將操作的若干個任務(wù)納入到1小時內(nèi)處理隊列中

time命令獲取當(dāng)前系統(tǒng)時間

微信

朋友圈

搜索

redis大key解決方案

Redission分布式鎖

java redis的使用

redis怎么用在項目上

mongodb和es

數(shù)據(jù)庫的三大范式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容