Redis Sets 使用場(chǎng)景有哪些?如何實(shí)現(xiàn)共同好友?
Redis Sets 是什么?
Sets 的功能類似 Java 中的 HashSet,是通過(guò)散列表實(shí)現(xiàn)的,所以添加、刪除、查找元素的時(shí)間復(fù)雜度是 O(1)。
Sets 是字符串類型的無(wú)序集合,集合中的元素是唯一的,不會(huì)出現(xiàn)重復(fù)的數(shù)據(jù)。
Java 的 HashSet 底層是用 HashMap 實(shí)現(xiàn)的,Sets 的底層數(shù)據(jù)結(jié)構(gòu)是用散列表實(shí)現(xiàn)的,散列表的 key 存儲(chǔ)的是 Sets 中元素的 value,散列表的 value 指向 NULL。
不同的是,當(dāng)元素內(nèi)容都是 64 位以內(nèi)的十進(jìn)制整數(shù),并且元素個(gè)數(shù)不超過(guò) set-max- intset-entries 配置的值(默認(rèn)為 512)時(shí),Sets 會(huì)使用更加省內(nèi)存的 intset(整形數(shù)組)來(lái)存儲(chǔ)。
圖片
使用場(chǎng)景
當(dāng)你需要存儲(chǔ)多個(gè)元素,并且要求不能出現(xiàn)重復(fù)數(shù)據(jù),無(wú)須考慮元素的有序性時(shí),可以使用 Sets。
Sets 還支持在集合之間做交集、并集、差集操作,例如統(tǒng)計(jì)如下場(chǎng)景中多個(gè)集合元素的聚合結(jié)果。
◎ 統(tǒng)計(jì)多個(gè)元素的共有數(shù)據(jù)(交集)。
◎ 對(duì)于兩個(gè)集合,統(tǒng)計(jì)其中的一個(gè)獨(dú)有元素(差集)。
◎ 統(tǒng)計(jì)多個(gè)集合的所有元素(并集)。
常見(jiàn)的使用場(chǎng)景如下。
◎ 社交軟件中共同關(guān)注:通過(guò)交集實(shí)現(xiàn)。
◎ 每日新增關(guān)注數(shù):對(duì)近兩天的總注冊(cè)用戶量集合取差集。
◎ 打標(biāo)簽:你可以為自己收藏的每一篇文章打標(biāo)簽,例如微信收藏功能,這樣可以快速地找到被添加了某個(gè)標(biāo)簽的所有文章。
出招實(shí)戰(zhàn):共同好友
三國(guó)天下有限公司開發(fā)了一款名為「三國(guó)戀」的社交 App,需要實(shí)現(xiàn)共同好友功能,這個(gè)場(chǎng)景就能通過(guò)交集來(lái)實(shí)現(xiàn)。
我們?yōu)槊總€(gè)用戶創(chuàng)建一個(gè) Sets 集合,將賬號(hào)名作為集合的 key,集合 value 存儲(chǔ)該賬號(hào)的好友。如下命令構(gòu)建劉備和曹操的好友集合。
SADD user:劉備 趙子龍 張飛 關(guān)羽 貂蟬
SADD user:曹操 貂蟬 夏侯惇 典韋 張遼
想要知道兩個(gè)人的共同好友,也就是兩個(gè)集合的交集,只需要使用 SINTERSTORE 命令。
SINTERSTORE user:曹劉好友 user:劉備 user:曹操
命令執(zhí)行后,劉備與曹操兩個(gè)集合的交集數(shù)據(jù)就存儲(chǔ)到了 user:曹劉好友 集合中。接著使用 SMEMBERS 查看曹操與劉備的共同好友。
好家伙,他們都喜歡貂蟬,你喜不喜歡呢?
圖片