公司部门同事有个需求,就是须要把当前另外一个部门a中存储的数据所有导出来,本身当前业务b的数据所有导出来,两个要取一下差集,把a中存在,b中不存在的记下来,要去调用某接口把对应的文件删除。这个我感受可使用redis的集合来进行操做,可是考虑到数据量特别大,文件有200G,内存估计不够用,暂时还不知道咋整。redis
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地址去重,解决缓存穿透问题等。io
看网上的文章有说在内存超过指定值时,redis会删除失效数据,而且这个时候进行sADD会报超时,这种状况由于我还没遇到过这种场景,也没见过。cli
查看redis占用的内存大小:
redis-cli
info memorynio