Redis如何实现数据的交集、并集和补集
本篇内容介绍了“Redis如何实现数据的交集、并集和补集”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
场景说明今天我们来模拟一个这样的场景,我们在本地有多个文本文件,每个文件里面存了很多的32位的字符串作为用户的唯一标识,每个用户存做一行,假如我们每天都有非常大规模的用户,这样我们可能在工作中就存在需要对这些用户进行交集、并集或补集等处理,最简单的方式是通过Java中的集合来进行运算即可,比如通过HashSet来进行相应的一些运算,但是这样的运算存在一个局限性,那就是我们一般在JVM运行过程中初始的内存是有限的,这样如果全部在JVM内存中进行计算的话,很容易出现内存空间不足导致的OOM异常,那么我们今天来介绍一种拓展性更强的方式来进行这样的一些交并补的运算:通过Redis来实现数据的交集、并集、补集
环境说明
Redis版本: Redis 6.0.6
Jedis版本: 4.2.2
工具类hutool版本: 5.8.0.M3
pom文件:
<dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.2.2</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.0.M3</version></dependency></dependencies>
交并补计算
初始化常量
publicclassRedisCalculateUtils{staticStringoneFileString="/Users/tmp/test-1.txt";staticStringtwoFileString="/Users/tmp/test-2.txt";staticStringdiffFileString="/Users/tmp/diff-test.txt";staticStringinterFileString="/Users/tmp/inter-test.txt";staticStringunionFileString="/Users/tmp/union-test.txt";staticStringoneFileCacheKey="oneFile";staticStringtwoFileCacheKey="twoFile";staticStringdiffFileCacheKey="diffFile";staticStringinterFileCacheKey="interFile";staticStringunionFileCacheKey="unionFile";}
初始化数据到指定文件
/***初始化数据并写入文件中*/publicstaticvoidwriteFile(){FileoneFile=newFile(oneFileString);List<String>fs=newArrayList<>(10000);for(inti=10000;i<15000;i++){Strings=SecureUtil.md5(String.valueOf(i));fs.add(s);}FileUtil.writeUtf8Lines(fs,oneFile);FiletwoFile=newFile(twoFileString);fs.clear();for(inti=12000;i<20000;i++){Strings=SecureUtil.md5(String.valueOf(i));fs.add(s);}FileUtil.writeUtf8Lines(fs,twoFile);}指定文件写入Redis
/***读取文件数据并写入Redis*/publicstaticvoidwriteCache(){try(Jedisjedis=newJedis("127.0.0.1",6379)){Pipelinep=jedis.pipelined();List<String>oneFileStringList=FileUtil.readLines(oneFileString,"UTF-8");for(Strings:oneFileStringList){p.sadd(oneFileCacheKey,s);}p.sync();List<String>twoFileStringList=FileUtil.readLines(twoFileString,"UTF-8");for(Strings:twoFileStringList){p.sadd(twoFileCacheKey,s);}p.sync();}catch(Exceptione){thrownewRuntimeException(e);}}
差集的计算
/***oneKey对应的Set与twoKey对应的Set的差集并写入threeKey*@paramoneKey差集前面的集合Key*@paramtwoKey差集后面的集合Key*@paramthreeKey差集结果的集合Key*/publicstaticvoiddiff(StringoneKey,StringtwoKey,StringthreeKey){try(Jedisjedis=newJedis("127.0.0.1",6379)){longresult=jedis.sdiffstore(threeKey,oneKey,twoKey);System.out.println("oneKey与twoKey的差集的个数:"+result);}catch(Exceptione){thrownewRuntimeException(e);}}差集计算结果写入到指定文件
/***将计算的差集数据写入到指定文件*/publicstaticvoidwriteDiffToFile(){FilediffFile=newFile(diffFileString);try(Jedisjedis=newJedis("127.0.0.1",6379)){Set<String>result=jedis.smembers(diffFileCacheKey);FileUtil.writeUtf8Lines(result,diffFile);}catch(Exceptione){thrownewRuntimeException(e);}}
交集的计算
/****@paramcacheKeyArray交集集合Key*@paramdestinationKey交集集合结果Key*/publicstaticvoidinter(String[]cacheKeyArray,StringdestinationKey){try(Jedisjedis=newJedis("127.0.0.1",6379)){longresult=jedis.sinterstore(destinationKey,cacheKeyArray);System.out.println("cacheKeyArray的交集的个数:"+result);}catch(Exceptione){thrownewRuntimeException(e);}}交集计算结果写入指定文件
/***将计算的交集数据写入到指定文件*/publicstaticvoidwriteInterToFile(){FileinterFile=newFile(interFileString);try(Jedisjedis=newJedis("127.0.0.1",6379)){Set<String>result=jedis.smembers(interFileCacheKey);FileUtil.writeUtf8Lines(result,interFile);}catch(Exceptione){thrownewRuntimeException(e);}}
并集的计算
/***计算多个Key的并集并写入到新的Key*@paramcacheKeyArray求并集的Key*@paramdestinationKey并集结果写入的KEY*/publicstaticvoidunion(String[]cacheKeyArray,StringdestinationKey){try(Jedisjedis=newJedis("127.0.0.1",6379)){longresult=jedis.sunionstore(destinationKey,cacheKeyArray);System.out.println("cacheKeyArray的并集的个数:"+result);}catch(Exceptione){thrownewRuntimeException(e);}}并集计算结果写入到指定文件
/***将计算的并集数据写入到指定文件*/publicstaticvoidwriteUnionToFile(){FileunionFile=newFile(unionFileString);try(Jedisjedis=newJedis("127.0.0.1",6379)){Set<String>result=jedis.smembers(unionFileCacheKey);FileUtil.writeUtf8Lines(result,unionFile);}catch(Exceptione){thrownewRuntimeException(e);}}
Redis命令说明
SDIFFSTORE destination key [key …]
举例说明:
key1={a,b,c,d}key2={c}key3={a,c,e}SDIFFkey1key2key3={b,d}
SDIFFSTORE 命令的作用和SDIFF类似,不同的是它将结果保存到 destination 集合,而把结果集返回给客户端。
如果 destination 集合已经存在,则将其覆盖。
返回值
结果集中成员数量
SINTERSTORE destination key [key …]
举例说明:
key1={a,b,c,d}key2={c}key3={a,c,e}SINTERkey1key2key3={c}
SINTERSTORE 命令与 SINTER 命令类似,不同的是它并不是直接返回结果集,而是将结果保存在 destination 集合中。
如果 destination 集合存在, 则会被覆盖。
返回值
结果集中成员数量
SUNIONSTORE destination key [key …]
举例说明:
key1={a,b,c,d}key2={c}key3={a,c,e}SUNIONkey1key2key3={a,b,c,d,e}
SUNIONSTORE 命令的功能类似于 SUNION,不同的是不反回结果集,而是存储在 destination 中。
如果 destination 已经存在,则被覆盖。
返回值
结果集中的成员数量
“Redis如何实现数据的交集、并集和补集”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。