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

2024-06-19 13:12

本文主要是介绍.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 的了解,并发现在各种应用中利用其强大功能的新方法。

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

这篇关于.NET中用于重复数据删除的Redis的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075124

相关文章

电脑不小心删除的文件怎么恢复?4个必备恢复方法!

“刚刚在对电脑里的某些垃圾文件进行清理时,我一不小心误删了比较重要的数据。这些误删的数据还有机会恢复吗?希望大家帮帮我,非常感谢!” 在这个数字化飞速发展的时代,电脑早已成为我们日常生活和工作中不可或缺的一部分。然而,就像生活中的小插曲一样,有时我们可能会在不经意间犯下一些小错误,比如不小心删除了重要的文件。 当那份文件消失在眼前,仿佛被时间吞噬,我们不禁会心生焦虑。但别担心,就像每个问题

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

Windows中,.net framework 3.5安装

安装.net framework,目前已知2种方法,如下: 一、在MSDN下载对应的安装包,安装,这种可能无法安装成功,概率很大,不成功使用第二种方法,基本上没问题。 二、win8/8.1/10 下安装 .net framework 3.5.1: 1. 打开 win8/8.1/10 安装盘(这里指系统安装镜像文件),提取 sources\sxs 文件夹到 X:\sources\sxs (X代

时间服务器中,适用于国内的 NTP 服务器地址,可用于时间同步或 Android 加速 GPS 定位

NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备【如计算机、手机】的时间的协议。 NTP 实现什么目的?   目的很简单,就是为了提供准确时间。因为我们的手表、设备等,经常会时间跑着跑着就有误差,或快或慢的少几秒,时间长了甚至误差过分钟。 NTP 服务器列表 最常见、熟知的就是 www.pool.ntp.org/zo

数据时代的数字企业

1.写在前面 讨论数据治理在数字企业中的影响和必要性,并介绍数据治理的核心内容和实践方法。作者强调了数据质量、数据安全、数据隐私和数据合规等方面是数据治理的核心内容,并介绍了具体的实践措施和案例分析。企业需要重视这些方面以实现数字化转型和业务增长。 数字化转型行业小伙伴可以加入我的星球,初衷成为各位数字化转型参考库,星球内容每周更新 个人工作经验资料全部放在这里,包含数据治理、数据要

为什么要做Redis分区和分片

Redis分区(Partitioning)和分片(Sharding)是将数据分布在多个Redis实例或多个节点上的做法。这种技术用于提高性能、可扩展性和可用性。以下是执行Redis分区和分片的主要原因: 1. **提高吞吐量**:    - 通过将数据分散到多个节点,可以并行处理更多的操作,从而提高整体吞吐量。 2. **内存限制**:    - 单个Redis实例的内存是有限的。分区允许数据

如何在Java中处理JSON数据?

如何在Java中处理JSON数据? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Java中如何处理JSON数据。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在现代应用程序中被广泛使用。Java通过多种库和API提供了处理JSON的能力,我们将深入了解其用法和最佳

如何理解redis是单线程的

写在文章开头 在面试时我们经常会问到这样一道题 你刚刚说redis是单线程的,那你能不能告诉我它是如何基于单个线程完成指令接收与连接接入的? 这时候我们经常会得到沉默,所以对于这道题,笔者会直接通过3.0.0源码分析的角度来剖析一下redis单线程的设计与实现。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源