实例详解Redis实现数据的交集、并集和补集

本篇文章给大家带来了关于Redis的相关知识,其中主要介绍了关于实现数据的交集、并集和补集的相关问题,如果全部在JVM内存中进行计算的话,很容易出现内存空间不足导致的OOM异常,下...

本篇文章给大家带来了关于Redis的相关知识,其中主要介绍了关于实现数据的交集并集补集的相关问题,如果全部在JVM内存中进行计算的话,很容易出现内存空间不足导致的OOM异常,下面一起来看一下,希望对大家有帮助。

实例详解Redis实现数据的交集、并集和补集插图1

场景说明

今天我们来模拟一个这样的场景,我们在本地有多个文本文件,每个文件里面存了很多的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 已经存在,则被覆盖。

返回值

结果集中的成员数量

产品猿社区致力收录更多优质的商业产品,给服务商以及软件采购客户提供更多优质的软件产品,帮助开发者变现来实现多方共赢;

日常运营的过程中我们难免会遇到各种版权纠纷等问题,如果您在社区内发现有您的产品未经您授权而被用户提供下载或使用,您可按照我们投诉流程处理,点我投诉

本文来自用户发布投稿,不代表产品猿立场 ;若对此文有疑问或内容有严重错误,可联系平台客服反馈;

部分产品是用户投稿,可能本文没有提供官方下下载地址或教程,若您看到的内容没有下载入口,您可以在我们产品园商城搜索看开发者是否有发布商品;若您是开发者,也诚邀您入驻商城平台发布的产品,地址:点我进入

如若转载,请注明出处:https://www.chanpinyuan.cn/27364.html;
(0)
上一篇 2022年11月23日 下午4:17
下一篇 2022年11月23日 下午4:17

相关推荐

发表回复

登录后才能评论
分享本页
返回顶部