redis基本数据类型set

redis实验环境

针对学习redis 我们可以为您提供一套完善的学习环境
点击此处跳转

章节叙述

​ 本章节我们介绍一下Set类型,集合(Set) 类型也是用来保存多个的字符串元素,但是和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,也不是通过索引下标获取元素。如图所示 集合user: 1: follow包含着"it""music""his" "sports"四个元素, 一个集合最多可以存储232-1个元素。 Redis除了支持集合内的增删改查, 同时还支持多个集合取交集、 并集、 差集, 合理地使用好集合类型, 能在实际开发中解决很多实际问题

集合类型

常用命令

下面将按照集合内和集合之间两个维度对集合的常用命令进行介绍

  1. 一,集合内操作

    • 1,单个添加,查询元素

      Redis提供了sadd用户添加Set类型的元素

      sadd set1 demo1
      

      您可以使用smembers命令来返回当前Set中的所有元素,返回的元素是无序的。

      smembers set1
      

      *类似smembersList中的LrangeHash中的hgetall都是比较重的命令,如果元素过多的话存在阻塞Redis的可能性,这时候可以使用scan来完成,在附件中介绍,可以参考。

    • 2,计算元素的个数

      使用scard可以计算当前集合中的元素的个数

      scard set1
      

      scard的时间复杂度为0(1),它不会遍历集合所有元素,而是直接使用Redis内部的变量

    • 3,判断元素是否在集合中

      Redis提供的键是否存在的函数为exists,同时提供了sismemeber用于判断集合中是否有指定的元素

      sismember set1 demo1 
      

      如果给定元素 element 在集合内返回1,反之返回0

    • 4,随机从集合中返回指定个数的元素

      Redis提供srandmember从集合中随机返回指定个数的元素

      srandmember set1 1 
      
    • 5,从集合中随机弹出元素

      Redis提供spop从集合中随机弹出指定个数的元素(注意这里边是弹出就是删除)(最后的个数可以选择不填默认是1个)

      spop set1  1
      
    • 6,删除元素

      Redis提供的删除键的方法是delRedis提供了srem用于删除集合中的指定元素(我们先添加一个)

      sadd set1 demo1  demo2
      
      srem set1 demo1
      

      此方法会返回删除成功的个数

  2. 二,集合间的操作

    Redis提供了多个集合间求交集,并集,差集,以及将这些结果保存的命令,下面我们依次介绍一下

    • 1,求多个集合的交集sinter

      首先我们先新建两个集合

      sadd  set4 a  h b  hb
      
      sadd  set5 b e  berb  rer ebrer
      

      然后我们可以使用sinter来得到两个集合的交集

       sinter set4 set5
      
    • 2,求多个集合的并集

      sunion可以得到多个集合的并集

       sunion set4 set5
      
    • 3,求多个集合的差集

      sdiff可以得到多个集合的差集,

       sdiff set4 set5
      
    • 4,将交集、并集、差集的结果保存

      sinterstore destination key [key ...]
      sunionstore destination key [key ...]
      sdiffstore destination key [key ...]
      

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

      我们先执行sunionstore方法将结果输出到myset1

      sunionstore  myset1 set5 set4
      

      我们查询一样结果是否输出到指定键中

      smembers myset1
      

      这里仅仅列举了一个的使用方法,其他两者使用方法一致。

内部编码

接下来我们来了解一下Set类型的内部编码。

集合的内部编码有两种:

  • intset ( 整数结合 ) :当集合中的元素都是整数且元素个数小于 set-max-intset-entries 配置(默认512个)时,Redis 会选用intset 来作为集合的内部实现,从而减少内存的使用。
  • hashtable( 哈希表):当集合类型无法满足 intset 条件时, Redis 会使用 hashtable 作为集合的内部实现
使用场景

​ 集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、 体育比较感兴趣, 另一个用户可能对历史、 新闻比较感兴趣, 这些兴趣点就是标签。 有了这些数据就可以得到喜欢同一个标签的人, 以及用户的共同喜好的标签, 这些数据对于用户体验以及增强用户黏度比较重要。 例如一个电子商务的网站会对不同标签的用户做不同类型的推荐, 比如对数码产品比较感兴趣的人, 在各个页面或者通过邮件的形式给他们推荐最新的数码产品, 通常会为网站带来更多的利益 。

下面使用集合类型实现标签功能的若干功能示例。大家可以尝试一下。

  • 给用户添加标签

    sadd user1:tages  tag1 tag3
    
    sadd user2:tages  tag3 tag3
    
  • 给标签添加用户

    sadd tag1  user1 user2 user3
    
  • 删除用户下的标签

    srem user1:tages tag1 
    
  • 删除标签下的用户

    srem tag1 user2 user3
    
  • 计算用户共同感兴趣的标签

    sinter  user1:tages   user2:tages 
    

    上述只是给出了使用 Redis 结合类型实现标签的基本思路,实际上会复杂很多,不过集合类型的应用场景通常为以下几种:

    • sadd = Tagging (标签)

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

    • sadd + sinter = Social Graph (社交需求)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值