redis存储新闻列表_Redis对象——集合(Set)
集合類型 (Set) 是一個無序并唯一的鍵值集合。它的存儲順序不會按照插入的先后順序進(jìn)行存儲。
集合類型和列表類型的區(qū)別如下:
列表可以存儲重復(fù)元素,集合只能存儲非重復(fù)元素;
列表是按照元素的先后順序存儲元素的,而集合則是無序方式存儲元素的。
一個集合最多可以存儲232-1個元素。Redis除了支持集合內(nèi)的增刪改查,同時還支持多個集合取交集、并集、差集,合理地使用好集合類型,能在實(shí)際開發(fā)中解決很多實(shí)際問題。
一、內(nèi)部實(shí)現(xiàn)
集合類型的內(nèi)部編碼有兩種:
intset(整數(shù)集合)):當(dāng)集合中的元素都是整數(shù)且元素個數(shù)小于set-maxintset-entries配置(默認(rèn)512個)時,Redis會選用intset來作為集合的內(nèi)部實(shí)現(xiàn),從而減少內(nèi)存的使用。
hashtable(哈希表):當(dāng)集合類型無法滿足intset的條件時,Redis會使用hashtable作為集合的內(nèi)部實(shí)現(xiàn)。
有關(guān)intset和hashtable這兩種redis底層數(shù)據(jù)結(jié)構(gòu)的具體實(shí)現(xiàn)可以參考我的另外兩篇文章。
Redis數(shù)據(jù)結(jié)構(gòu)——整數(shù)集合
Redis數(shù)據(jù)結(jié)構(gòu)——字典。
二、常用命令
Redis列表對象常用命令如下表(點(diǎn)擊命令可查看命令詳細(xì)說明)。
| SADD key member [member …] | 添加一個或者多個元素到集合(set)里 | O(N) |
| SCARD key | 獲取集合里面的元素?cái)?shù)量 | O(1) |
| SDIFF key [key …] | 獲得隊(duì)列不存在的元素 | O(N) |
| SDIFFSTORE destination key [key …] | 獲得隊(duì)列不存在的元素,并存儲在一個關(guān)鍵的結(jié)果集 | O(N) |
| SINTER key [key …] | 獲得兩個集合的交集 | O(N*M) |
| SINTERSTORE destination key [key …] | 獲得兩個集合的交集,并存儲在一個關(guān)鍵的結(jié)果集 | O(N*M) |
| SISMEMBER key member | 確定一個給定的值是一個集合的成員 | O(1) |
| SMEMBERS key | 獲取集合里面的所有元素 | O(N) |
| SMOVE source destination member | 移動集合里面的一個元素到另一個集合 | O(1) |
| SPOP key [count] | 刪除并獲取一個集合里面的元素 | O(1) |
| SRANDMEMBER key [count] | 從集合里面隨機(jī)獲取一個元素 | |
| SREM key member [member …] | 從集合里刪除一個或多個元素 | O(N) |
| SUNION key [key …] | 添加多個set元素 | O(N) |
| SUNIONSTORE destination key [key …] | 合并set元素,并將結(jié)果存入新的set里面 | O(N) |
| SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代set里面的元素 | O(1) |
三、使用場景
通過上文,我們可以知道集合的主要幾個特性,無序、不可重復(fù)、支持并交差等操作。因此集合類型比較適合用來數(shù)據(jù)去重和保障數(shù)據(jù)的唯一性,還可以用來統(tǒng)計(jì)多個集合的交集、錯集和并集等,當(dāng)我們存儲的數(shù)據(jù)是無序并且需要去重的情況下,比較適合使用集合類型進(jìn)行存儲。
3.1 標(biāo)簽系統(tǒng)
集合類型比較典型的使用場景是標(biāo)簽(tag)。
給用戶添加標(biāo)簽。
sadd user:1:tags tag1 tag2 tag5sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4
...
給標(biāo)簽添加用戶
sadd tag1:users user:1 user:3sadd tag2:users user:1 user:2 user:3...sadd tagk:users user:1 user:2...
使用sinter命令,可以來計(jì)算用戶共同感興趣的標(biāo)簽
sinter user:1:tags user:2:tags這種標(biāo)簽系統(tǒng)在電商系統(tǒng)、社交系統(tǒng)、視頻網(wǎng)站,圖書網(wǎng)站,旅游網(wǎng)站等都有著廣泛的應(yīng)用。例如一個用戶可能對娛樂、體育比較感興趣,另一個用戶可能對歷史、新聞比較感興趣,這些興趣點(diǎn)就是標(biāo)簽。有了這些數(shù)據(jù)就可以得到喜歡同一個標(biāo)簽的人,以及用戶的共同喜好的標(biāo)簽,這些數(shù)據(jù)對于用戶體驗(yàn)以及增強(qiáng)用戶黏度比較重要。例如一個社交系統(tǒng)可以根據(jù)用戶的標(biāo)簽進(jìn)行好友的推薦,已經(jīng)用戶感興趣的新聞的推薦等,一個電子商務(wù)的網(wǎng)站會對不同標(biāo)簽的用戶做不同類型的推薦,比如對數(shù)碼產(chǎn)品比較感興趣的人,在各個頁面或者通過郵件的形式給他們推薦最新的數(shù)碼產(chǎn)品,通常會為網(wǎng)站帶來更多的利益。
3.2 抽獎系統(tǒng)
Redis集合的 SPOP(隨機(jī)移除并返回集合中一個或多個元素) 和 SRANDMEMBER(隨機(jī)返回集合中一個或多個元素) 命令可以幫助我們實(shí)現(xiàn)一個抽獎系統(tǒng)
如果允許重復(fù)中獎,可以使用SRANDMEMBER 命令
//添加抽獎名單127.0.0.1:6379> SADD lucky:1 Tom(integer) 1127.0.0.1:6379> SADD lucky:1 Jerry
(integer) 1127.0.0.1:6379> SADD lucky:1 John
(integer) 1127.0.0.1:6379> SADD lucky:1 Marry
(integer) 1127.0.0.1:6379> SADD lucky:1 Sean
(integer) 1127.0.0.1:6379> SADD lucky:1 Lindy
(integer) 1127.0.0.1:6379> SADD lucky:1 Echo
(integer) 1//抽取三等獎3個127.0.0.1:6379> SRANDMEMBER lucky:1 31) "John"2) "Echo"3) "Lindy"//抽取二等獎2個127.0.0.1:6379> SRANDMEMBER lucky:1 21) "Sean"2) "Lindy"//抽取一等獎1個127.0.0.1:6379> SRANDMEMBER lucky:1 11) "Tom"
如果不允許重復(fù)中獎,可以使用 SPOP 命令
//添加抽獎名單127.0.0.1:6379> SADD lucky:1 Tom(integer) 1127.0.0.1:6379> SADD lucky:1 Jerry
(integer) 1127.0.0.1:6379> SADD lucky:1 John
(integer) 1127.0.0.1:6379> SADD lucky:1 Marry
(integer) 1127.0.0.1:6379> SADD lucky:1 Sean
(integer) 1127.0.0.1:6379> SADD lucky:1 Lindy
(integer) 1127.0.0.1:6379> SADD lucky:1 Echo
(integer) 1//抽取三等獎3個127.0.0.1:6379> SPOP lucky:1 31) "John"2) "Echo"3) "Lindy"//抽取二等獎2個127.0.0.1:6379> SPOP lucky:1 21) "Sean"2) "Marry"//抽取一等獎1個127.0.0.1:6379> SPOP lucky:1 11) "Tom"
注意:
Redis 2.6版本開始SRANDMEMBER命令支持Count參數(shù)。
Redis 3.2版本開始SRANDMEMBER命令支持Count參數(shù)。
其余低版本一次只能獲取一個隨機(jī)元素。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的redis存储新闻列表_Redis对象——集合(Set)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq人工服务电话(PC版官方网站)
- 下一篇: 王者荣耀取名字的建议有哪些