Redis 数据结构 集合(set)(五)

         集合(set) 类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复的元素。(ps,如果重复了,一个集合下如何区分那个元素是那个元素呢?);并且集合中的元素是无序的,不能通过索引下标获取元素。一个集合最多可以存储2^32 -1 个元素。Redis除了支持集合的增删改查,同时还支持多个集合取交集,并集,差集。

         基本命令:

            1、添加元素,返回添加成功的个数

                sadd  key  element  [element ...]

            2、删除元素

                   srem key  element [element ...]

            3、计算元素个数

                    scard  key 

             4、 判断元素是否在集合中

                    sismember key element

              5、随机从集合返回指定个数元素 ,count 如果不写,默认为1

                    srandmember  key [count]

               6、从集合随机弹出元素

                    spop key [count]

                    注:srandmember和spop都是从集合随机选出元素,不同的是,spop执行后会从集合中删除该元素。而srandmember不会删除该元素。

                7、获取所有元素,返回结果无序

                    smembers key

                集合间的操作

                    求多个集合交集

                        sinter key [key ...]

                    求多个集合并集

                        sunion key [key ...]

                    求多个集合差集

                        sdiff  key  [key  ...]

                    将差集、并集、交集的结果保存

                        sdiffstore  destination key [key ...]

                        sunionstore destination key [key ...]

                        sinterstore destination key [key ...]

                    集合间的运算元素较多的情况下会比较耗时,所以redis提供了上面三个命令(原命令+store)将集合间的交集、并集、差集的结果保存在destination 中,后面的key表示需要求交、并、差集的集合。

                        

127.0.0.1:6379> sinterstore targerKey coll2 coll3

(integer) 25

 

               内部编码

                集合类型的内部编码有两种

                    intset(整数集合)   当集合中的元素都是整数且元素个数小于st-max-intet-entries配置(默认512个),redis会选用intset来作为集合的内部实现,二减少内存的使用

                    hashtable(哈希表)  当集合类型无法满足intset的条件时,redis会使用hashtable作为集合的内部实现。

                使用场景         

                            集合类型比较典型的使用场景就是标签(tag),如一个用户可能对娱乐,体育比较感兴趣,另一个用户对历史,新闻比较感兴趣,这些兴趣点就是标签。

                        注:用户和标签的关系维护应该在一个事务内执行,防止部分命令失败造成数据不一致。

                    常用场景组合:

                        sadd  =Tagging(标签)

                        spop/srandmember  =Random  item (生成随机数,如抽奖)

                         sadd  + sinter   = Social   Graph (社交,求共同兴趣爱好等)

 

 

                

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Redis中的zset是有序集合,而set是无序集合。 在zset中,每个元素都有一个score字段,通过score和index来进行排序。zset的实现是使用了两种数据结构,分别是跳跃表和字典。跳跃表用于实现元素的有序排列,而字典用于实现元素的唯一性。zset的插入、删除和查找操作的时间复杂度都是O(logN)。 而set是一个无序的字符串集合集合中的元素不可重复。在set中,元素的插入、删除和查找操作的时间复杂度都是O(1)。set的底层实现是通过哈希表来存储元素,类似于Java中的Hashtable集合。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [9. redis 数据结构-set、zset](https://blog.csdn.net/wojiuguowei/article/details/81866600)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Redis学习笔记(九)---Redis数据类型之Set 和 Zset](https://blog.csdn.net/TheWindOfSon/article/details/104169173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三丶竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值