日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

【Redis】有序集合的交集与并集

發(fā)布時(shí)間:2023/12/4 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Redis】有序集合的交集与并集 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Redis支持多種類型的數(shù)據(jù)結(jié)構(gòu),最簡(jiǎn)單的字符串(strings),適合存儲(chǔ)對(duì)象的哈希(hash),簡(jiǎn)單的字符串列表(list),無(wú)序集合(set),有序集合(sorted set),以及用于做基數(shù)統(tǒng)計(jì)的HyperLogLog,其中使用頻率相對(duì)較高的便是集合。

無(wú)論是無(wú)序集合set,還是有序集合zset,集合內(nèi)的元素都具有唯一性,如果插入相同的元素,都將被忽略。有時(shí)候通過(guò)業(yè)務(wù)邏輯直接存儲(chǔ)的集合,并不能滿足所有的業(yè)務(wù)需求。比如博客園可以按分類存儲(chǔ)一個(gè)set,元素為文章id:

sadd article:type:typeid articleid

sadd?article:type:1?"2" sadd?article:type:1?"3" sadd?article:type:1?"4"

按文章的點(diǎn)贊與踩計(jì)算出文章分?jǐn)?shù)的有序集合,元素為文章id

zadd article:score score articleid

zadd?article:score?10?"2" zadd?article:score?20?"3" zadd?article:score?2?"4" zadd?article:score?1?"5" zadd?article:score?5?"6"

但是如果我們需要在分類下的文章按照分?jǐn)?shù)重新進(jìn)行排序,怎么辦?既然是集合,我們能想到操作就是,取交集,并集,差集。

1.zinterstore-交集

取這倆集合的交集,就可以完成上面的需求。

zinterstore 可以計(jì)算多個(gè)有序集合的交集(無(wú)序集合的score為0),并生成新的有序集合。

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [SUM|MIN|MAX]

  • numkey:操作的集合數(shù)

  • weights:是一個(gè)可選參數(shù),乘法因子

  • aggregate:聚合,默認(rèn)是求和SUM

如果destination新key存在,就被覆蓋。

zinterstore?article:score:1?2?article:type:1?article:score?aggregate?max

計(jì)算上面兩個(gè)集合的交集,以取最大值的方式聚合。

然后就可以通過(guò)zrevrange命令按分?jǐn)?shù)從大到小:

zrevrange?article:score:1?0?-1

2.zunionstore-并集

上面在交集中沒(méi)有用到乘法因子,我們將在并集中介紹:乘法因子用于所有的元素的score值在傳遞給聚合函數(shù)之前都要先乘以這個(gè)因子,說(shuō)白了,先weights后aggregate。我們就用官方示例說(shuō)明:

redis>?ZADD?zset1?1?"one" (integer)?1 redis>?ZADD?zset1?2?"two" (integer)?1 redis>?ZADD?zset2?1?"one" (integer)?1 redis>?ZADD?zset2?2?"two" (integer)?1 redis>?ZADD?zset2?3?"three" (integer)?1 redis>?ZUNIONSTORE?out?2?zset1?zset2?WEIGHTS?2?3 (integer)?3 redis>?ZRANGE?out?0?-1?WITHSCORES 1)?"one" 2)?"5" 3)?"three" 4)?"9" 5)?"two" 6)?"10" redis>?

按交集操作,key為out的元素只會(huì)有one two,但是如果取并集,元素就會(huì)有one two three ,默認(rèn)聚合函數(shù)為SUM

所以最終元素:

  • one

    • 1x2=2

    • 1x3=3

    • SUM(2+3)=5

  • two

    • 2x2=4

    • 2x3=6

    • SUM(4+6)=10

  • two

    • 0x2=2

    • 3x3=9

    • SUM(0+9)=9

3.總結(jié)

無(wú)論是取交集還是并集

  • 以元素為基準(zhǔn)做并集與交集操作

  • score值先與weights乘法因子計(jì)算,如果有指定乘法因子的

  • 執(zhí)行聚合函數(shù),aggregate(),默認(rèn)SUM,還有MIN MAX

ps:集合操作是要花費(fèi)時(shí)間的,實(shí)際操作時(shí),生成的集合key應(yīng)該設(shè)置過(guò)期時(shí)間,短時(shí)間查詢,應(yīng)該不做交集或并集操作,過(guò)期后,才重新做計(jì)算。

總結(jié)

以上是生活随笔為你收集整理的【Redis】有序集合的交集与并集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。