我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.0.M3</version>
        </dependency></dependencies>

交并补计算


初始化常量
public class RedisCalculateUtils {
    static String oneFileString = "/Users/tmp/test-1.txt";
    static String twoFileString = "/Users/tmp/test-2.txt";

    static String diffFileString = "/Users/tmp/diff-test.txt";

    static String interFileString = "/Users/tmp/inter-test.txt";

    static String unionFileString = "/Users/tmp/union-test.txt";

    static String oneFileCacheKey = "oneFile";

    static String twoFileCacheKey = "twoFile";

    static String diffFileCacheKey = "diffFile";

    static String interFileCacheKey = "interFile";

    static String unionFileCacheKey = "unionFile";
    }

初始化数据到指定文件
public static void writeFile() {
        File oneFile = new File(oneFileString);
        List<String> fs = new ArrayList<>(10000);
        for (int i = 10000; i < 15000; i++) {
            String s = SecureUtil.md5(String.valueOf(i));
            fs.add(s);
        }

        FileUtil.writeUtf8Lines(fs, oneFile);

        File twoFile = new File(twoFileString);
        fs.clear();
        for (int i = 12000; i < 20000; i++) {
            String s = SecureUtil.md5(String.valueOf(i));
            fs.add(s);
        }

        FileUtil.writeUtf8Lines(fs, twoFile);
    }
指定文件写入Redis
public static void writeCache() {
    try(Jedis jedis = new Jedis("127.0.0.1", 6379)) {
        Pipeline p = jedis.pipelined();
        List<String> oneFileStringList = FileUtil.readLines(oneFileString, "UTF-8");

        for (String s : oneFileStringList) {
            p.sadd(oneFileCacheKey, s);
        }
        p.sync();

        List<String> twoFileStringList = FileUtil.readLines(twoFileString, "UTF-8");

        for (String s : twoFileStringList) {
            p.sadd(twoFileCacheKey, s);
        }
        p.sync();

    } catch (Exception e) {
        throw new RuntimeException(e);
    }}

差集的计算
    
    public static void diff(String oneKey, String twoKey, String threeKey) {
        try(Jedis jedis = new Jedis("127.0.0.1", 6379)) {
            long result = jedis.sdiffstore(threeKey, oneKey, twoKey);
            System.out.println("oneKey 与 twoKey 的差集的个数:" + result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
差集计算结果写入到指定文件
    
    public static void writeDiffToFile() {
        File diffFile = new File(diffFileString);
        try(Jedis jedis = new Jedis("127.0.0.1", 6379)) {
            Set<String> result = jedis.smembers(diffFileCacheKey);
            FileUtil.writeUtf8Lines(result, diffFile);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

交集的计算

    public static void inter(String[] cacheKeyArray, String destinationKey) {
        try(Jedis jedis = new Jedis("127.0.0.1", 6379)) {
            long result = jedis.sinterstore(destinationKey, cacheKeyArray);

            System.out.println("cacheKeyArray 的交集的个数:" + result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
交集计算结果写入指定文件
    
    public static void writeInterToFile() {
        File interFile = new File(interFileString);
        try(Jedis jedis = new Jedis("127.0.0.1", 6379)) {
            Set<String> result = jedis.smembers(interFileCacheKey);
            FileUtil.writeUtf8Lines(result, interFile);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

并集的计算
    
     public static void union(String[] cacheKeyArray, String destinationKey) {
         try(Jedis jedis = new Jedis("127.0.0.1", 6379)) {
             long result = jedis.sunionstore(destinationKey, cacheKeyArray);

             System.out.println("cacheKeyArray 的并集的个数:" + result);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
并集计算结果写入到指定文件
    
    public static void writeUnionToFile() {
         File unionFile = new File(unionFileString);
         try(Jedis jedis = new Jedis("127.0.0.1", 6379)) {
             Set<String> result = jedis.smembers(unionFileCacheKey);
             FileUtil.writeUtf8Lines(result, unionFile);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }

Redis命令说明


SDIFFSTORE destination key [key …]

举例说明:

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

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

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

  • 返回值
    结果集中成员数量


SINTERSTORE destination key [key …]

举例说明:

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

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

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

  • 返回值
    结果集中成员数量


SUNIONSTORE destination key [key …]

举例说明:

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

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

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

  • 返回值
    结果集中的成员数量

“Redis如何实现数据的交集、并集和补集”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Redis实现数据的交集、并集、补集的示例

目录场景说明环境说明交并补计算差集的计算交集的计算并集的计算Redis命令说明场景说明今天我们来模拟一个这样的场景,我们在本地有多个文本文件,每个文件里面存了很多的32位的字符串作为用户的唯一标识,每个用户存做一行,假如我javascri
2022-08-10

如何在redis中使用交集、并集和差集

这期内容当中小编将会给大家带来有关如何在redis中使用交集、并集和差集,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、sinter 、sunion 、sdiffredis 支持 Set集合的数据存储,
2023-06-06

PHP数组交集和并集的懒惰计算实现

php 数组交集和并集的懒惰计算在 php 中,可以使用生成器实现数组交集和并集的懒惰计算,以延迟计算结果直到需要为止:交集:使用 array_intersect_lazy() 生成器,仅当数组元素相等时才迭代并输出。并集:使用 array
PHP数组交集和并集的懒惰计算实现
2024-05-01

Python 两个列表的差集、并集和交集实现代码

①差集 方法一:if __name__ == '__main__':a_list = [{'a' : 1}, {'b' : 2}, {'c' : 3}, {'d' : 4}, {'e' : 5}]b_list = [{'a' : 1}, {
2022-06-04

C++集体数据交换如何实现

本文小编为大家详细介绍“C++集体数据交换如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++集体数据交换如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、说明到目前为止介绍的功能共享一对一的关
2023-07-04

pandas中的concat函数如何实现合并交集

这篇文章将为大家详细讲解有关pandas中的concat函数如何实现合并交集,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。合并交集In [11]: df3 = pd.DataFrame([[c, 3, c
2023-06-17

PHP数组交集和并集在数据处理中的实际应用示例

核⼼答案:php 数组交集和并集函数可分别查找两个数组的交集和并集,广泛应用于数据处理。用法:交集(array_intersect):返回两个数组中的共同元素。并集(array_merge):返回两个数组中所有元素,包括重复项。实战案例:比
PHP数组交集和并集在数据处理中的实际应用示例
2024-05-04

PHP数组交集和并集在算法和数据结构中的理论基础

算法和数据结构中,数组交集和并集分别用于查找同时出现和至少出现一次的元素。php 提供了 array_intersect() 和 array_union() 函数实现这些操作,可用于实际应用中,如查找两个用户之间的共同朋友。PHP 数组交集
PHP数组交集和并集在算法和数据结构中的理论基础
2024-05-04

redis集群是如何实现的

redis集群是一种分布式部署模式,允许水平扩展redis实例,通过节点间通信、哈希槽划分键空间、节点选举、主从复制和命令重定向来实现:节点间通信:通过集群总线实现虚拟网络通信。哈希槽:将键空间划分为哈希槽,确定负责键的节点。节点选举:至少
redis集群是如何实现的
2024-06-12

处理大规模PHP数组交集和并集的实用解决方案

处理大规模 PHP 数组交集和并集的实用解决方案简介在处理大型数据时,经常需要执行数组交集和并集操作。但对于百万或数十亿个元素的大型数组,默认 PHP 函数可能效率低下或出现内存问题。本文将介绍几种实用解决方案,在处理大规模数组时以显著
处理大规模PHP数组交集和并集的实用解决方案
2024-05-01

基于哈希表的数据结构优化PHP数组交集和并集的计算

利用哈希表可优化 php 数组交集和并集计算,将时间复杂度从 o(n * m) 降低到 o(n + m),具体步骤如下:使用哈希表将第一个数组的元素映射到布尔值,以快速查找第二个数组中元素是否存在,提高交集计算效率。使用哈希表将第一个数组的
基于哈希表的数据结构优化PHP数组交集和并集的计算
2024-05-02

Java数据结构中如何进行并查集的实现

这篇文章跟大家分析一下“Java数据结构中如何进行并查集的实现”。内容详细易懂,对“Java数据结构中如何进行并查集的实现”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“Java数
2023-06-28

Jupyternotebook如何实现打开数据集

这篇文章主要介绍了Jupyternotebook如何实现打开数据集问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-04

编程热搜

目录