redis--set

1. 介绍

和java的set相同,set就是一个==不允许重复==的list。set也可以进行增加、删除、修改、查询等操作。不同的是,list执行查询的花费为O(n),n取决于在list的index。而set执行查询的花费为O(1).

因为set不允许重复,所以当多次增加相同的元素,只会保留最后一份。set可以在服务器上完成set之间的聚合操作,因为在服务端完成,所以效率非常高,节省IO网络的消耗。

2. 命令

2.1 增加

命令:==SADD key value1 [value2 ...]==

命令说明:向指定key中插入values,如果value存在,那么什么都不做,如果不存在,则会增加。如果key对应的不是set结构,执行异常。

返回值:实际增加的数量。

image-20200716191816318

2.2 统计个数

命令:==SCARD key==

命令说明:获取指定key的set的元素个数。

返回值:0:key不存在或者set内元素为空;非0:实际key对应的set的元素的数量。

image-20200716192056745

2.3 是否存在

命令:==SISMEMBER key element==

命令说明:判断元素element是否在指定key的set中存在。如果key对应的不是set,执行异常。

返回值:1:存在;0:元素不存在或者key不存在。

image-20200716192522452

2.4 获取全部set

命令:==SMEMBERS key==

命令说明:获取指定key的set的全部元素。

返回值:指定key对应的set的元素的列表。如果key不存在返回空。如果key对应的不是set,执行异常。

image-20200716193135013

2.5 随机取出元素

命令:==SPOP key [count]==

命令说明:随机取出key对应的set中的count个元素,count可以省略,省略表示1个。因为set内部元素的布局不受外界控制,所以取出的元素不可控。取出元素后,会将元素从set中移除。count大于set的总数,那么删除全部set元素;如果count等于0,那么什么都不做。

返回值:取出的元素。如果key对应的set为空或者key不存在,那么返回空。如果key对应的不是set,执行异常。

image-20200716193622597

2.6 删除

命令:==SREM key element [element1 ...]==

命令说明:从指定的key的set中删除指定的element。如果element不存在将会被忽略。如果key不存在,那么该操作什么都不改变。

返回值:实际删除的元素数量。如果key对应的不是set,执行异常。

image-20200716195628098

2.7 随机获取元素

命令:==SRANDMEMBER key [count]==

命令说明:随机返回指定key的set中count个元素,count可以省略,省略表示1个。==该操作不会将element从set中删除。==count大于set的总数,那么返回全部set元素;如果count等于0,那么什么都不做;如果count小于0,那么返回count个元素,==可能重复==。

返回值:set中随机的元素列表。如果key不存在返回空列表。如果key对应的不是set执行异常。

image-20200716200547127

2.8 转移元素

命令:==SMOVE source dest element==

命令说明:将指定element从source中删除,并加入到dest中。如果dest不存在则会创建。如果source中不存在element则什么都不做。如果dest中已经给有了element,那么该命令就是将element从source中删除。如果source或者dest中存在任意一个不是set,那么执行异常。

返回值:1:正常移动;0:source中不存在element。

image-20200716201121133

2.9 差集

命令:==SDIFF key [key1 ....]==

命令说明:以第一个key的set为基准,返回后面key的set与第一个key的set的差集元素集合。如果key不存在则视为空set。如果任意key不是set,那么执行异常。

返回值:差异元素的list==(list最少为空,最多为第一个key对应的元素)==

image-20200716201754704

2.10 差集存储

命令:==SDIFFSTORE dest key [key1 ...]==

命令说明:获取key的set与后面key对应的set的差集元素,然后将差集元素放到dest中。如果dest不存在,则新建。如果dest已经存在,则覆盖dest。如果dest,keys任意一个不是set,执行异常。

返回值:差集元素数量。

image-20200716202222242

2.11 交集

命令:==SINTER key [key1 ...]==

命令说明:获取指定keys的set的交集元素。如果任意一个key的set为空或者key不存在,那么交集也是空。如果任意一个key不是set,那么执行异常。

返回值:交集元素list。

image-20200716202802520

2.12 交集存储

命令:==SINTERSTORE dest key [key1 ....]==

命令说明:获取keys的set的交集元素,然后将交集元素存入dest中。如果dest不存在,那么创建。如果dest不为空,那么覆盖dest。如果dest,keys任意一个不是set,那么执行异常。

返回值:交集元素数量。

image-20200716203235789

2.13 并集

命令:==SUNION key [key1 ...]==

命令说明:获取keys的set的所有元素的并集元素。如果key不存在,那么将被当做空set处理。如果任意key不是set,执行异常。

返回值:并集元素list。

image-20200716204119727

2.14 并集存储

命令:==SUNIONSTORE dest key [key1 ...]==

命令说明:获取keys的set的所有元素的并集元素,然后将元素存入dest。如果dest不存在,那么创建。如果dest存在,那么覆盖dest。如果dest,keys任意不是set,那么执行异常。

返回值:并集元素数量。

image-20200716203956503

3. 示例

3.1 随机展示

首页随机展示信息:

创建信息set,然后每次打开首页,从set中随机取出n条。

image-20200716204401187

3.2 随机执行

多线程条件下,任务存储在redis的set中,每个线程随机获取n个任务执行。

创建tasks的set,然后每次随机取出n个任务。

image-20200716204615907

3.3 黑白名单

借助set的不可重复以及查询高效的特性,做黑白名单。

创建wl白名单和bl黑名单,每次请求时判断。

用户要么在黑名单,要么在白名单。

==白名单优先==

首先获取白名单的交集 => twl

然后将白名单的差集从黑名单中取出。

image-20200716210025155

==黑名单优先==

首先获取黑名单的交集 => tbl

然后将黑名单的差集从白名单中取出。

image-20200716210229874

==判断是否在黑名单中==

image-20200716210328960
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351