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