1. 介紹
和java的set相同网杆,set就是一個==不允許重復==的list吃环。set也可以進行增加也颤、刪除、修改郁轻、查詢等操作翅娶。不同的是文留,list執(zhí)行查詢的花費為O(n),n取決于在list的index。而set執(zhí)行查詢的花費為O(1).
因為set不允許重復竭沫,所以當多次增加相同的元素燥翅,只會保留最后一份。set可以在服務器上完成set之間的聚合操作蜕提,因為在服務端完成森书,所以效率非常高,節(jié)省IO網絡的消耗谎势。
2. 命令
2.1 增加
命令:==SADD key value1 [value2 ...]==
命令說明:向指定key中插入values凛膏,如果value存在,那么什么都不做脏榆,如果不存在猖毫,則會增加。如果key對應的不是set結構须喂,執(zhí)行異常吁断。
返回值:實際增加的數(shù)量。
2.2 統(tǒng)計個數(shù)
命令:==SCARD key==
命令說明:獲取指定key的set的元素個數(shù)坞生。
返回值:0:key不存在或者set內元素為空仔役;非0:實際key對應的set的元素的數(shù)量。
2.3 是否存在
命令:==SISMEMBER key element==
命令說明:判斷元素element是否在指定key的set中存在是己。如果key對應的不是set又兵,執(zhí)行異常。
返回值:1:存在赃泡;0:元素不存在或者key不存在。
2.4 獲取全部set
命令:==SMEMBERS key==
命令說明:獲取指定key的set的全部元素乘盼。
返回值:指定key對應的set的元素的列表升熊。如果key不存在返回空。如果key對應的不是set绸栅,執(zhí)行異常级野。
2.5 隨機取出元素
命令:==SPOP key [count]==
命令說明:隨機取出key對應的set中的count個元素,count可以省略粹胯,省略表示1個蓖柔。因為set內部元素的布局不受外界控制,所以取出的元素不可控风纠。取出元素后况鸣,會將元素從set中移除。count大于set的總數(shù)竹观,那么刪除全部set元素镐捧;如果count等于0潜索,那么什么都不做。
返回值:取出的元素懂酱。如果key對應的set為空或者key不存在竹习,那么返回空。如果key對應的不是set列牺,執(zhí)行異常整陌。
2.6 刪除
命令:==SREM key element [element1 ...]==
命令說明:從指定的key的set中刪除指定的element。如果element不存在將會被忽略瞎领。如果key不存在泌辫,那么該操作什么都不改變。
返回值:實際刪除的元素數(shù)量默刚。如果key對應的不是set甥郑,執(zhí)行異常。
2.7 隨機獲取元素
命令:==SRANDMEMBER key [count]==
命令說明:隨機返回指定key的set中count個元素荤西,count可以省略澜搅,省略表示1個。==該操作不會將element從set中刪除邪锌。==count大于set的總數(shù)勉躺,那么返回全部set元素;如果count等于0觅丰,那么什么都不做饵溅;如果count小于0,那么返回count個元素妇萄,==可能重復==蜕企。
返回值:set中隨機的元素列表。如果key不存在返回空列表冠句。如果key對應的不是set執(zhí)行異常轻掩。
2.8 轉移元素
命令:==SMOVE source dest element==
命令說明:將指定element從source中刪除,并加入到dest中懦底。如果dest不存在則會創(chuàng)建唇牧。如果source中不存在element則什么都不做。如果dest中已經給有了element聚唐,那么該命令就是將element從source中刪除丐重。如果source或者dest中存在任意一個不是set,那么執(zhí)行異常杆查。
返回值:1:正常移動扮惦;0:source中不存在element。
2.9 差集
命令:==SDIFF key [key1 ....]==
命令說明:以第一個key的set為基準亲桦,返回后面key的set與第一個key的set的差集元素集合径缅。如果key不存在則視為空set掺栅。如果任意key不是set,那么執(zhí)行異常纳猪。
返回值:差異元素的list==(list最少為空氧卧,最多為第一個key對應的元素)==
2.10 差集存儲
命令:==SDIFFSTORE dest key [key1 ...]==
命令說明:獲取key的set與后面key對應的set的差集元素,然后將差集元素放到dest中氏堤。如果dest不存在沙绝,則新建。如果dest已經存在鼠锈,則覆蓋dest闪檬。如果dest,keys任意一個不是set,執(zhí)行異常购笆。
返回值:差集元素數(shù)量粗悯。
2.11 交集
命令:==SINTER key [key1 ...]==
命令說明:獲取指定keys的set的交集元素。如果任意一個key的set為空或者key不存在,那么交集也是空。如果任意一個key不是set咐汞,那么執(zhí)行異常羹令。
返回值:交集元素list钧忽。
2.12 交集存儲
命令:==SINTERSTORE dest key [key1 ....]==
命令說明:獲取keys的set的交集元素,然后將交集元素存入dest中。如果dest不存在,那么創(chuàng)建撤逢。如果dest不為空,那么覆蓋dest粮坞。如果dest,keys任意一個不是set蚊荣,那么執(zhí)行異常。
返回值:交集元素數(shù)量莫杈。
2.13 并集
命令:==SUNION key [key1 ...]==
命令說明:獲取keys的set的所有元素的并集元素互例。如果key不存在,那么將被當做空set處理姓迅。如果任意key不是set敲霍,執(zhí)行異常俊马。
返回值:并集元素list丁存。
2.14 并集存儲
命令:==SUNIONSTORE dest key [key1 ...]==
命令說明:獲取keys的set的所有元素的并集元素,然后將元素存入dest柴我。如果dest不存在解寝,那么創(chuàng)建。如果dest存在艘儒,那么覆蓋dest聋伦。如果dest,keys任意不是set夫偶,那么執(zhí)行異常。
返回值:并集元素數(shù)量觉增。
3. 示例
3.1 隨機展示
首頁隨機展示信息:
創(chuàng)建信息set兵拢,然后每次打開首頁,從set中隨機取出n條逾礁。
3.2 隨機執(zhí)行
多線程條件下说铃,任務存儲在redis的set中,每個線程隨機獲取n個任務執(zhí)行嘹履。
創(chuàng)建tasks的set,然后每次隨機取出n個任務腻扇。
3.3 黑白名單
借助set的不可重復以及查詢高效的特性,做黑白名單砾嫉。
創(chuàng)建wl白名單和bl黑名單幼苛,每次請求時判斷。
用戶要么在黑名單焕刮,要么在白名單舶沿。
==白名單優(yōu)先==
首先獲取白名單的交集 => twl
然后將白名單的差集從黑名單中取出。
==黑名單優(yōu)先==
首先獲取黑名單的交集 => tbl
然后將黑名單的差集從白名單中取出济锄。
==判斷是否在黑名單中==