Redis 数据类型及应用场景——Set

说到集合大家可能会联想到数学里面的那个集合,我们用一个集合来存储具有某类特性的多个数据,比如整数集合,有理数集合等等,多个集合可以求交集,差集还有并集等,那我们今天要聊的是redis里面一种数据结构——集合,它也有着类型特征和操作。

1. Set简介

在集合中的每个元素都是不同的,并且没有顺序。一个集合类型的键最多能存储2^32-1(我们发现hash,list 都是一样的)个字符串。在Redis的内部是使用hashtable或者intset来实现的,所以当我们去查找或者更新数据的时候时间是很快的,时间复杂度为O(1),另外多个集合简可以进行交集,差集和并集操作。

2. 常用操作命令

(1) 增加/删除元素

sadd numbers1 1 2 3; //向集合中添加元素,如果集合numbers不存在则创建一个新的。
srem numbers1 1;//删除元素1
smembers numbers1;//获取集合中的所有元素

下面我用一张图来展示下


集合操作.png

(2) 判断元素是否在集合中

sismember key member;

(3)集合间的运算

sdiff key    [key ...];//多个集合间的差集
sinter key  [key ...];//多个集合间的交集
sunion key [key ...];//多个集合间的并集

下面展示几张图:


A-B差集.png

A和B的交集.png

A和B的并集.png

看了这几张图后,我们发现集合间的运算其实是很简单的,那具体的一些操作命令这里就不做更多的展示了。
(4) 其他的一些操作

scard key;//获取集合中的元素个数
srandmember key;//随机获取集合中的元素,返回的数据不是很随机。
spop key;//从集合中弹出一个元素

3. 实践

(1) 标签
比如文章的标签,考虑到一个文章的所有标签都是不相同的,而且展示的时候对这些标签的顺序并没有要求,我们可以使用集合来存储文章标签。使用集合存储标签我们还可以单独增加(sadd)或者删除(srem)标签,当然,如果你的业务是不需要针对单个标签操作,那我们也可以使用字符串类型的键来保存标签。
(2)社交
因为set它具有唯一性以及不同集合间的运算我们可以使用它来存储好友/关注/粉丝/感兴趣的人的集合。
a. sinter命令可以获取不同用户间的共同好友.
b. sismember命令可以判断A是否是B的好友.
c. scard命令可以获取好友的数量.
不过需要注意一点的是向sinter,smove(本文没有介绍)等操作多个key的命令在集群环境下是不太合适的,因为这种操作多个key的命令需要要求这几个key存储在同一个slot(槽位)中,至于数据存储在哪个slot中是根据key然后通过一个算法计算得到,也就是在没有其他办法的情况下,我们只能让两个key值一样,显然,这个办法是行不通的。 但是有同学可能想到redis 有个hash tag 的东西,也就是redis只对{}大括号括起来的部分键名进行hash运算,比如某个用户的好友集合friend_set:{user:678},粉丝列表fans_set:{user:678},如果我们将这两个集合进行运行是可以的;再看个不可以的例子,如果是不同的用户呢?那我们只能这样设置键{friend_set}:user:678,{fans_set}:user:906,那这样一来就是所有的用户数据都放在了同一个slot内,数据分布会严重不均匀。
(3) 随机获取
比如app的首页要随机展示几篇文章,那我们可以事先确定一批需要展示的文章保存到集合中,然后利用srandmember 这个命令从集合中随机取几篇文章,不过要注意一点的是srandmember命令返回的数据其实不是很随机,这个主要是有set类型的存储结构决定的。
(4)黑名单/白名单
在实际应用中出于一些安全或者业务需求我们需要对某些特殊的数据做特殊处理,比如用户黑名单,ip黑名单,设备黑名单等等,我们可以利用sismember命令判断用户,ip,设备是否在黑名单中。

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

推荐阅读更多精彩内容