Redis如何实现数据的交集、并集、补集


这篇“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&gt.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 &hellip;]

举例说明:

key1={a,b,c,d}key2={c}key3={a,c,e}SDIFFkey1key2key3={b,d}

SDIFFSTORE 命令的作用和SDIFF类似,不同的是它将结果保存到 destination 集合,而把结果集返回给客户端。

如果 destination 集合已经存在,则将其覆盖。

返回值

  • 结果集中成员数量

SINTERSTORE destination key [key &hellip;]

举例说明:

key1={a,b,c,d}key2={c}key3={a,c,e}SINTERkey1key2key3={c}

SINTERSTORE 命令与 SINTER 命令类似,不同的是它并不是直接返回结果集,而是将结果保存在 destination 集合中。

如果 destination 集合存在, 则会被覆盖。

返回值

  • 结果集中成员数量

SUNIONSTORE destination key [key &hellip;]

举例说明:

key1={a,b,c,d}key2={c}key3={a,c,e}SUNIONkey1key2key3={a,b,c,d,e}

SUNIONSTORE 命令的功能类似于 SUNION,不同的是不反回结果集,而是存储在 destination 中。

如果 destination 已经存在,则被覆盖。

返回值

  • 结果集中的成员数量

以上就是关于“Redis如何实现数据的交集、并集、补集”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注主机评测网行业资讯频道。


上一篇:怎么使用Java编写网络聊天程序

下一篇:Windows?server?2022服务器基本设置实例分析


Copyright © 2002-2019 测速网 www.inhv.cn 皖ICP备2023010105号
测速城市 测速地区 测速街道 网速测试城市 网速测试地区 网速测试街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!

热门搜索 城市网站建设 地区网站制作 街道网页设计 大写数字 热点城市 热点地区 热点街道 热点时间 房贷计算器