zoukankan      html  css  js  c++  java
  • [日常] Redis中set集合的使用思考

    公司部门同事有个需求,就是需要把当前另一个部门a中存储的数据全部导出来,自己当前业务b的数据全部导出来,两个要取一下差集,把a中存在,b中不存在的记下来,要去调用某接口把对应的文件删除。这个我感觉可以使用redis的集合来进行操作,但是考虑到数据量特别大,文件有200G,内存估计不够用,暂时还不知道咋整。


    redis中集合的操作方法
    sADD 添加一个或多个成员到集合里面
    sCard, sSize 获取一下集合中成员的个数
    sDiff 在N个集合中比较出差集
    sDiffStore 和sDiff差不多,但是把差集结果存储在第一个key里面
    sInter 返回多个集合的交集
    sInterStore 和sInter类似,把结果存储在第一个key里面
    sIsMember, sContains检查参数中的成员是否是集合中的一员
    sMembers, sGetMembers 获得集合中的所有成员
    sMove 把集合中的成员从一个集合移动到另一个集合
    sPop 在集合中随机删除一个并获取到这个成员
    sRandMember 在集合中随机获取一个成员,并不删除它
    sRem, sRemove 在集合中删除指定成员
    sUnion 返回多个集合的并集
    sUnionStore 把多个集合的并集存储在第一个参数key里面

    因为redis的集合是使用的哈希表实现的,因此是无序的,并且对单个元素的处理和判断都是高效的。也可以看得到在进行多个成员的处理时,时间复杂度都是O(N),对单个成员进行查找删除判断是否存在等处理时,时间复杂度都是O(1)

    sPop sRandMember,这种可以在集合中取出随机值的可以用在抽奖场景下
    并集交集差集,可以用在实时性比较高的大量数据的取集合操作


    当需要对大量的数据进行集合的操作,比如判断是否存在的需求时,可以使用布隆过滤器
    布隆过滤器可以理解为一个不怎么精确的 set 结构,当你使用它的 contains 方法判断某个对象是否存在时,它可能会误判。但是布隆过滤器也不是特别不精确,只要参数设置的合理,它的精确度可以控制的相对足够精确,只会有小小的误判概率。

    当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在
    主要是解决大规模数据下不需要精确过滤的场景,如检查垃圾邮件地址,爬虫URL地址去重,解决缓存穿透问题等。


    看网上的文章有说在内存超过指定值时,redis会删除失效数据,并且这个时候进行sADD会报超时,这种情况因为我还没遇到过这种场景,也没见过。

    查看redis占用的内存大小:
    redis-cli
    info memory

  • 相关阅读:
    javascript无提示关闭窗口,兼容IE,Firefox
    vbs简单制作U灵大盗带发送功能的代码
    正则表达式提取网址、标题、图片等一例(.Net Asp Javascript/Js)的实现
    在asp.net中保持Session的有效期
    批处理编程 介绍
    IIS日志清理CMD版,VBS版,JS版,WSH版
    正则表达式提取图片地址
    用U盘安装GNU/Linux
    三核浏览器Lunascape新版发布
    黑客基础之DOS(最齐全)
  • 原文地址:https://www.cnblogs.com/taoshihan/p/11717026.html
Copyright © 2011-2022 走看看