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