「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ù)庫的三大范式