.NET中用于重复数据删除的Redis

Redis 虽然经常被用作缓存存储,但它是一个通用的数据结构服务器,可以高效地处理重复数据删除等任务。

在本文中,我们将探讨如何利用 Redis 进行重复数据删除,并通过 C# 示例来说明实际实现方法。

什么是重复数据删除?

dedupe重复数据删除通常称为 dedupe,是消除重复数据的重复副本的过程。这种技术可确保只保留一个唯一的数据实例,同时用指向原始数据的引用来替换冗余副本。

重复数据删除的主要目标是减少所需的存储量,优化数据处理工作流程。

使用 REDIS 和 .NET 进行重复数据消除 - 图片来源:作者创建

重复数据删除使用案例

以下是重复数据删除的一些实际应用场景:

  • 电子邮件活动:确保用户不会多次收到相同的电子邮件。

  • ETL 流程:防止在提取、转换和加载操作过程中重复分析相同的数据。

  • 唯一用户 ID:确保系统内每个用户 ID 都是唯一的。

  • 警报系统:通过过滤重复警报,避免警报疲劳。

  • 欺诈检测:通过有效识别和处理类似交易,降低欺诈检测的计算成本。

  • 数据库迁移:确保在合并数据库时不会创建重复记录。

  • 客户记录:在客户关系管理系统中为每位客户保存一份准确的记录。

如果存在验证,为什么还要执行重复数据删除?

即使是用户界面应用程序/应用程序接口,在数据录入过程中也能确保验证邮件的唯一性,但出于多种原因,重复数据删除仍然是必要的:

  • 数据迁移:在数据迁移或导入过程中,可能会无意中创建重复记录。

  • 数据输入不一致:用户可能会直接访问数据库或通过 API 端点绕过用户界面验证。

  • 旧系统:旧系统可能没有严格的验证,导致重复数据累积。

  • 第三方集成:来自第三方集成的数据可能包含需要过滤掉的重复数据。

为什么使用 Redis 进行重复数据删除?

Redis 以其内存数据存储能力著称,可提供快如闪电的读写操作。这使得 Redis 成为实时重复数据删除的绝佳选择。

Redis 支持集合和 Bloom 过滤器等各种数据结构,是处理重复数据删除任务的理想选择。

Redis 集

Redis 集合存储唯一值,自动消除重复值。对于需要确定一个项目是否存在于集合中的操作,集合具有很高的效率。不过,随着唯一值数量的增加,集合的内存消耗也会增加。

Bloom 过滤器

Redis Probabilistic 模块提供的 Bloom 过滤器是集合的一种内存高效替代品。与集合不同,布隆过滤器使用哈希函数来存储值,能以最小的内存使用量处理大量数据。不过,Bloom 过滤器具有概率性质,这意味着它们可能会产生误报,但绝不会产生误报。

以下是 Redis 成为重复数据删除任务理想选择的原因:

高性能

  • 内存操作:Redis 完全在内存中运行,确保了极快的数据访问和操作速度。

  • 高效的数据结构Redis 提供了专门的数据结构,如集合和 Bloom 过滤器,这些结构经过优化,可实现快速操作。

可扩展性

  • 横向扩展:Redis 可通过 Redis Cluster 进行横向扩展,允许将数据集分布到多个节点,从而高效处理大量数据。

简单灵活

  • 简单的应用程序接口Redis 提供简单明了的应用程序接口,可轻松与现有应用程序集成。

  • 多种数据类型:Redis 支持多种数据类型,可灵活存储和处理数据。

内存效率

  • 布鲁姆过滤器Redis 的 Bloom 过滤器具有很高的内存效率,与传统的集合相比,内存占用少得多,同时还能提供快速的成员检查,误报率低。

实时处理

  • 低延迟:Redis 的内存特性确保了低延迟,使其适合实时应用。

  • 发布/订阅消息:Redis 支持发布/订阅消息,可根据数据变化进行实时通知和处理。

实施:在客户关系管理系统中重复客户记录

让我们考虑一个使用案例,我们需要重复客户关系管理 (CRM) 系统中的客户记录。我们将使用 Redis 集进行精确重复数据删除,并使用 Bloom 过滤器进行节省内存的重复数据删除。

在 .NET 中设置 Redis

StackExchange.Redis首先,确保已安装并运行 Redis。在 .NET 项目中安装 StackExchange.Redis 库:

dotnet add package StackExchange.Redis

示例:使用 Redis 集重复客户记录

下面的示例演示了如何使用 Redis 集来确保每封客户电子邮件都是唯一的:

using StackExchange.Redis;  
using System;  
using System.Collections.Generic;  
using System.Data.SqlClient;  public class CustomerDeduplication  
{  private static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");  private static IDatabase db = redis.GetDatabase();  private const string SetKey = "unique:customer:emails";  public static void LoadAndDeduplicateCustomers()  {  var existingCustomers = FetchCustomerEmailsFromDatabase();  foreach (var email in existingCustomers)  {  AddCustomerEmail(email);  }  ProcessUniqueEmails();  }  private static List<string> FetchCustomerEmailsFromDatabase()  {  // Simulating database fetch  return new List<string>  {  "test1@example.com",  "test2@example.com",  "test1@example.com", // Duplicate  "test3@example.com",  "test2@example.com", // Duplicate  "test4@example.com"  };  }  private static void AddCustomerEmail(string email)  {  bool isAdded = db.SetAdd(SetKey, email);  Console.WriteLine(isAdded ? $"Added {email} to the set." : $"{email} is already in the set.");  }  private static void ProcessUniqueEmails()  {  var uniqueEmails = db.SetMembers(SetKey);  foreach (var email in uniqueEmails)  {  Console.WriteLine($"Processing unique email: {email}");  }  }  public static void Main(string[] args)  {  LoadAndDeduplicateCustomers();  }  
}

数据输入:

test1@example.com  
test2@example.com  
test1@example.com (duplicate)  
test3@example.com  
test2@example.com (duplicate)  
test4@example.com

预期成果

Added test1@example.com to the set.  
Added test2@example.com to the set.  
test1@example.com is already in the set.  
Added test3@example.com to the set.  
test2@example.com is already in the set.  
Added test4@example.com to the set.  Processing unique email: test1@example.com  
Processing unique email: test2@example.com  
Processing unique email: test3@example.com  
Processing unique email: test4@example.com

守则解释

  1. FetchCustomerEmailsFromDatabase:该方法模拟从数据库获取电子邮件地址。在现实世界中,该方法将连接到实际数据库并执行查询以获取电子邮件地址。

  2. SetAddAddCustomerEmail:此方法将每封邮件添加到 Redis 邮件集中。SetAdd 方法确保只有唯一的电子邮件地址才会被添加到邮件集中。如果某个电子邮件已存在于集合中,则不会再次添加,以确保唯一性。

  3. ProcessUniqueEmails:该方法会从 Redis 中获取所有唯一的电子邮件地址,并对其进行处理。在此示例中,它只是将每封唯一电子邮件打印到控制台,但在应用程序中,这可能涉及进一步处理或存储。

示例:使用 Bloom 过滤器重复客户记录

在本示例中,我们假设你已安装并运行 RedisBloom 模块。RedisBloom 提供 Bloom 过滤器等概率数据结构,可用于高效检查元素是否存在。

using StackExchange.Redis;  
using System;  
using System.Collections.Generic;  
using System.Data.SqlClient;  public class CustomerDeduplicationBloom  
{  private static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");  private static IDatabase db = redis.GetDatabase();  private const string BloomFilterKey = "bloom:customer:emails";  public static void LoadAndDeduplicateCustomers()  {  var existingCustomers = FetchCustomerEmailsFromDatabase();  foreach (var email in existingCustomers)  {  AddCustomerEmail(email);  }  ProcessUniqueEmails(existingCustomers);  }  private static List<string> FetchCustomerEmailsFromDatabase()  {  // Simulating database fetch  return new List<string>  {  "test1@example.com",  "test2@example.com",  "test1@example.com", // Duplicate  "test3@example.com",  "test2@example.com", // Duplicate  "test4@example.com"  };  }  private static void AddCustomerEmail(string email)  {  var result = db.Execute("BF.ADD", BloomFilterKey, email);  Console.WriteLine((bool)result ? $"Added {email} to the Bloom filter." : $"{email} might already be in the Bloom filter.");  }  private static void ProcessUniqueEmails(List<string> emails)  {  foreach (var email in emails)  {  var result = db.Execute("BF.EXISTS", BloomFilterKey, email);  if ((bool)result)  {  Console.WriteLine($"Processing unique email: {email}");  }  else  {  Console.WriteLine($"Email {email} is not unique.");  }  }  }  public static void Main(string[] args)  {  LoadAndDeduplicateCustomers();  }  
}

输入数据

test1@example.com  
test2@example.com  
test1@example.com (duplicate)  
test3@example.com  
test2@example.com (duplicate)  
test4@example.com

预期成果

Added test1@example.com to the Bloom filter.  
Added test2@example.com to the Bloom filter.  
test1@example.com might already be in the Bloom filter.  
Added test3@example.com to the Bloom filter.  
test2@example.com might already be in the Bloom filter.  
Added test4@example.com to the Bloom filter.  Processing unique email: test1@example.com  
Processing unique email: test2@example.com  
Processing unique email: test1@example.com  
Processing unique email: test3@example.com  
Processing unique email: test2@example.com  
Processing unique email: test4@example.com

守则解释

  1. FetchCustomerEmailsFromDatabase:该方法模拟从数据库获取电子邮件地址。在现实世界中,该方法将连接到实际数据库并执行查询以获取电子邮件地址。

  2. BF.ADDAddCustomerEmail:此方法使用 BF.ADD 命令将每封邮件添加到 Bloom 过滤器中。如果电子邮件可能还未出现,则 Bloom 过滤器将允许添加该电子邮件。如果电子邮件可能已经存在,则表明该电子邮件之前已被添加。

  3. BF.EXISTSProcessUniqueEmails:该方法使用 BF.EXISTS 命令检查列表中的每封电子邮件,以确定它是否已经在 Bloom 过滤器中。然后根据结果处理邮件。

Redis 集与 Bloom 过滤器的区别

这两种结构都能达到重复数据删除的目的,但根据内存使用和准确性之间的权衡,它们适用于不同的场景。

  • 内存使用:Bloom 过滤器比集合更节省内存,尤其是在大型数据集上。

  • 准确性:集合可提供精确的重复数据删除,而 Bloom 过滤器可能会产生误报。

  • 使用案例:在需要精确重复数据删除且内存使用率不是主要问题的情况下使用数据集。在对内存效率要求较高且偶尔出现误报可以接受的大型数据集中使用 Bloom 过滤器。

下一步探索

现在,您已经对使用 Redis 集和 Bloom 过滤器进行重复数据删除有了扎实的了解,下面是进一步扩展知识的一些主题:

高级 Redis 数据结构

  • 深入研究其他 Redis 数据结构,如排序集、超日志日志和地理空间索引,了解如何将它们用于各种应用中。

Redis 的性能调整

  • 了解优化 Redis 性能的技巧,包括内存优化、配置持久性选项,以及微调 Redis 集群设置以实现高可用性和可扩展性。

将 Redis 与其他技术相结合

  • 探索如何将 Redis 与其他数据库和缓存层集成,以构建稳健的混合解决方案,并查看将 Redis 与 ASP.NET Core 用于高性能网络应用的示例。

Redis 模块:

  • 研究 Redis 模块,如 RedisJSON、RedisGraph 和 RediSearch,以扩展 Redis 的功能并启用高级数据处理功能。

Redis 中的数据一致性和事务:

  • MULTIEXECWATCH了解如何通过 MULTI、EXEC 和 WATCH 等命令使用事务来确保 Redis 中的数据一致性,并学习使用这些命令的最佳实践。

使用 Redis 进行机器学习和人工智能:

  • 探索如何将 Redis 与机器学习和人工智能框架结合使用,并了解用于提供模型和管理实时推理工作负载的 RedisAI。

通过探索这些主题,您将加深对 Redis 的了解,并发现在各种应用中利用其强大功能的新方法。

如果你喜欢我的文章,请给我一个赞!谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第144题二叉树的前序遍历

题目&#xff1a; 题解&#xff1a; func preorderTraversal(root *TreeNode) (vals []int) {var p1, p2 *TreeNode root, nilfor p1 ! nil {p2 p1.Leftif p2 ! nil {for p2.Right ! nil && p2.Right ! p1 {p2 p2.Right}if p2.Right nil {vals append(vals, p1.V…

iview 组件里面的(任何一个月)整月日期全部选中_iview时间轴选中有历史记录日期

iview 组件里面的整月日期全部选中&#xff1a; ①&#xff1a;第一种是当前月的日期全部选中&#xff1a; 先上效果图&#xff1a;当前月分 获取到的值&#xff1a; 当前月的方法&#xff1a; // getDateStr() {// var curDate new Date();// var curMonth curDate.ge…

✅系统日活递增,如何优化提升大规模数据库

这是一个涉及知识储备和架构能力的典型问题&#xff0c;通常可以从以下几个方面进行回答&#xff1a; 硬件优化&#xff1a; 提升硬件配置是改善数据库性能的有效途径&#xff0c;例如增加内存、升级至高性能 SSD 硬盘以替代传统 HDD&#xff0c;以减少 I/O 延迟。扩展内存容…

每日一题——Python代码实现力扣58. 最后一个单词的长度(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码逻辑&#xff1a; 时间复杂度&#xff1a; 空间复杂度&#xff1a; …

HTML5休闲小游戏《城堡守卫传说》源码,引流、刷广告利器

HTML5休闲小游戏《城堡守卫传说》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods467802.html

成都百洲文化传媒有限公司助力商家扬帆远航

在数字经济的浪潮中&#xff0c;电商行业如日中天&#xff0c;成都百洲文化传媒有限公司正是这一领域的佼佼者。作为一家专注于电商服务的传媒公司&#xff0c;百洲文化以其专业的服务、创新的理念和卓越的成果&#xff0c;在业内树立了良好的口碑&#xff0c;成为众多商家信赖…

划分子网和构造超网的学习

子网掩码长度&#xff1d;32位 某位&#xff1d;1&#xff1a;IP地址中的对应位为网络号和子网号 某位&#xff1d;0&#xff1a;IP地址中的对应位为主机号 从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。 使用子网掩码(subnet mask)可…

Python大数据-电商商品详情数据分析【JD电商平台为例】

一、项目背景 网上购物已经成为大众生活的重要组成部分。人们在电商平台上浏览商品并购物&#xff0c;产生了海量的用户行为数据&#xff0c;用户对商品的详情数据对商家具有重要的意义。利用好这些碎片化、非结构化的数据&#xff0c;将有利于企业在电商平台上的持续发展&…

Hbuilder无线连接手机

1.链接数据线进行操作 打开adbs所在位置 2.运行cmd 或者 powershell 3.运行项目

css记录:三维变化之backface-visibility

backface-visibility 是 CSS 3D 转换中的一个重要属性&#xff0c;它决定了元素的背面在旋转时是否可见。在 3D 空间中&#xff0c;一个对象有正面和背面之分&#xff0c;通常我们只能看到对象的正面。然而&#xff0c;当对象进行 3D 旋转时&#xff0c;背面可能会短暂地暴露给…

Bootstrap 滚动监听

Bootstrap 滚动监听 引言 Bootstrap 是一个流行的前端框架&#xff0c;它提供了许多实用的组件和插件&#xff0c;帮助开发者快速构建响应式和移动设备优先的网页。其中&#xff0c;滚动监听&#xff08;Scrollspy&#xff09;是 Bootstrap 提供的一个功能&#xff0c;它能够…

Linux 式套娃,把“文件系统”安装在一个“文件”上?

背景 “文件”在文件系统之中&#xff0c;这是人人理解的概念。但“文件”之上还有一个文件系统&#xff1f;那岂不是成套娃了。但这个其实是可以的。这个就涉及到今天我们要讲的 loop 设备。 很多童鞋在学习 Linux 的文件系统时&#xff0c;涉及到对磁盘设备的格式化&#x…

一个轻量级的TTS模型实现

1.环境 python 版本 3.9 2.训练数据集 本次采用LJSpeech数据集&#xff0c;百度网盘下载地址 链接&#xff1a;https://pan.baidu.com/s/1DDFmPpHQrTR_NvjAfwX-QA 提取码&#xff1a;1234 3.安装依赖 pip install TTS 4.工程结构 5代码部分 decoder.py import torch f…

注解详解系列 - @Repository:数据访问层组件

注解简介 在今天的注解详解系列中&#xff0c;我们将探讨Repository注解。Repository是Spring框架中的一个专用注解&#xff0c;用于标记数据访问层&#xff08;DAO&#xff09;组件。使用该注解可以让Spring自动检测和管理这些数据访问组件&#xff0c;并提供一致的异常处理机…

VueUse:Vue 3 开发中的强大 Hooks 库

一、什么是 VueUse&#xff1f; 二、安装和使用 VueUse 三、常用 Hooks 介绍 1. useDebounce 和 useThrottle useDebounce useThrottle 2. useRequest 3. useTitle 4. useCounter 5. useToggle 6. useFullscreen 7. useInterval 和 useTimeout useInterval useTim…

汇编基础之使用vscode写hello world

汇编语言&#xff08;Assembly Language&#xff09; 概述 汇编语言&#xff08;Assembly Language&#xff09;是一种低级编程语言&#xff0c;它直接对应于计算机的机器代码&#xff08;machine code&#xff09;&#xff0c;但使用了更易读的文本符号。每台个人计算机都有…

MQTT协议有哪些优点和缺点

MQTT协议的优点和缺点可以归纳如下&#xff1a; 1.优点&#xff1a; ① 轻量级&#xff1a;MQTT是一种轻量级的二进制协议&#xff0c;相比于其他协议&#xff08;如HTTP&#xff09;&#xff0c;它的数据包开销较小。这意味着在网络传输过程中&#xff0c;MQTT协议所产生的流…

iOS 18 Siri 升级之后都有哪些改变?

新界面 首先最显著的改变就是 Siri 的界面不同了&#xff0c;之前的界面是在打开 Siri 之后会出现一个圆形图案&#xff0c;而在 Siri 升级之后变成了屏幕边缘发出亮光。 来源&#xff1a;Apple 可在任意位置使用 苹果的生成式人工智能 Apple Intelligence 将为 Siri 提供支…

【区分vue2和vue3下的element UI Avatar 头像组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 的 Element UI 和 Vue 3 的 Element Plus 中&#xff0c;Avatar 头像组件可能并没有直接作为官方组件库的一部分。然而&#xff0c;为了回答你的问题&#xff0c;我将假设 Element UI 和 Element Plus 在未来的版本中可能添加了 Avatar 组件&#xff0c;或者我们将使用…

redhat 7.1 打开python文件中文乱码

解释&#xff1a; 在Red Hat Enterprise Linux 7.1中打开Python文件时出现文字乱码通常是因为文件的编码格式与Python解释器默认的编码格式不一致所导致。Python 2.x 默认使用ASCII编码&#xff0c;而ASCII编码不支持中文等一些字符&#xff0c;因此在处理中文或其他非ASCII字…