[日常] 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