• 【Redis学习笔记】第二章【2.4】Redis数据类型--set



    在这里插入图片描述



    1、引入

    若需要存储大量数据,且在查询方面提供更高的效率,而链表没有高效的内部存储机制,于是考虑一种新的数据类型–set
    在这里插入图片描述
    与hash存储结构完全相同,仅存储键,不存储value,且值是不允许重复的,则得到了set的结构:
    在这里插入图片描述

    2、set类型

    在这里插入图片描述

    3、set类型的基本操作

    • 添加数据
      sadd key member1 [member2] …

    • 获取全部数据
      smembers key

    • 删除数据
      srem key member1 [member2] …

    • 获取集合中数据总量
      scard key

    • 判断是否含有指定的数据
      sismember key member

    4、set类型数据的扩展

    随机获取与随机获取并剔除

    • 随机获取集合中指定数量的数据,但愿集合中不改变
      srandmember key [count]

    • 随机获取集合中的某个数据,并将该数据移出集合
      spop key [count]
    127.0.0.1:6379> sadd news n1 n2 n3 n4 n5 n6 n7 n8
    (integer) 8
    
    127.0.0.1:6379> srandmember news
    "n6"
    127.0.0.1:6379> srandmember news 2
    1) "n6"
    2) "n8"
    
    127.0.0.1:6379> spop news //不加count默认一个
    "n5"
    127.0.0.1:6379> spop news 2
    1) "n6"
    2) "n8"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    利用这些,redis 应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路,应用APP推荐,大V推荐等

    set的集合交并差集

    • 交集
      sinter key1 [key2]

    • 并集
      sunion key1 [key2]

    • 差集
      sdiff key1 [key2]

    • 求两个集合的交并差并存储到指定的集合中
      sinterstore destination key1 [key2]
      sunionstore destination key1 [key2]
      sdiffstore destination key1 [key2]

    • 将指定的数据从原始集合移动到目标集合
      smove source destination member


      **以上,没有key2则打印集合1
    127.0.0.1:6379> sadd u1 a1 s1 b1
    (integer) 3
    127.0.0.1:6379> sadd u2 s1 w1
    (integer) 2
    
    127.0.0.1:6379> sdiff u1 u2
    1) "b1"
    2) "a1"
    127.0.0.1:6379> sdiff u2 u1
    1) "w1"
    ***
    注意这里sdiff的顺序不同,谁减谁的顺序就不同,结果也就不一样了
    
    127.0.0.1:6379> smove u2 u1 w1
    (integer) 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    利用这些,redis 应用于同类信息的关联搜索,二度关联搜索,深度关联搜索,如共同好友等等

    注***

    • set 类型不允许数据重复,如果添加的数据在 set 中已经存在(相当于hash重点额field重复),将只保留一份(覆盖)
    • set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

    5、set类型的应用场景

    set实现权限校验

    业务场景:
    集团公司共具有12000名员工,内部OA系统中具有700多个角色,3000多个业务操作,23000多种数据,每位员工具有一个或多个角色,如何快速进行业务操作的权限校验?
    在这里插入图片描述
    依赖set集合数据不重复的特征,将某用户的所有权限放入set集合当中(并集),再使用sismember key member来校验。


    set实现网站访问量统计

    业务场景:

    统计网站的pv(访问量),UV(独立访客量),IP(独立IP量)

    127.0.0.1:6379> sadd ips 1.2.3.4
    (integer) 1
    127.0.0.1:6379> sadd ips 1.2.4.5
    (integer) 1
    127.0.0.1:6379> sadd ips 1.2.4.5
    (integer) 0
    
    127.0.0.1:6379> scard ips
    (integer) 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    由此,redis 的set模型应用于同类型数据的快速去重


    set实现黑白名单

    业务场景:
    对于安全性更高的应用访问,仅仅靠黑名单是不能解决安全问题的,此时需要设定可访问的用户群体,依赖白名单做更为苛刻的访问验证。


    实现思路:
    周期性更新黑名单用户存入set集合中,用户信息到达后与黑名单信息进行对比(sismember),从而针对IP或者用户进行过滤。

    由此:redis 应用于基于黑名单与白名单设定的服务控制

  • 相关阅读:
    基于Android的个人健康管理系统
    【ArcGIS模型构建器】03:多个shp批量按属性分割(多个县区批量提取乡镇)
    通俗理解apt-get 和pip的区别是什么
    数商云采购商城价格管理应用场景介绍 | 数字化采购助力汽配行业企业降本增效
    HK32_UID中获取芯片唯一ID相同的问题
    专栏 | 解析“全闪对象存储”(三)
    mapstruct进阶属性
    【C++笔试强训】第二十四天
    keras 识别手写数字mnist
    Cocos Creator3.8 项目实战(七)Listview 控件的实现和使用
  • 原文地址:https://blog.csdn.net/llg___/article/details/126330264