四种 No-SQL

在一个常规的互联网服务中,读取与写入的比例大约是 100:1 到 1000:1。然而,从硬盘读取时,数据库连接操作耗时,99% 的时间花费在磁盘寻址上。

为了优化读取性能,非规范化的设计通过添加冗余数据或分组数据来引入。下述介绍的四种 NoSQL 类型可以帮助解决这个问题。NoSQL数据库因其灵活性、可扩展性和处理大规模数据集的能力而变得越来越流行。以下是四种主要类型的NoSQL数据库及其特点的概述:

1. 键值存储(Key-Value Store)

键值NoSQL数据库是一种高效、简单且易于扩展的非关系型数据库,它以键值对的形式存储数据。每个键都是唯一的,并直接关联到一个特定的值,这个值可以是字符串、数字、序列化对象等任何形式的数据。键值数据库因其高性能和高可用性而被广泛应用于缓存系统、会话存储、实时分析等领域。

主要特点
  • 简单高效:以键值对的形式存储数据,其中键是唯一的标识符。
  • 高性能:由于其简单的数据模型和高效的内部实现,键值数据库能够提供非常快速的数据读写速度。对于读写操作非常快速,特别适合用于缓存系统。
  • 易扩展性:可以通过增加节点轻松实现水平扩展。适合处理大规模数据。
  • 灵活性:无需预定义数据模式,允许灵活地添加不同类型的数据。
  • 高可用性和持久性:许多键值数据库设计时考虑了数据复制和分区,确保系统的高可用性和数据的持久性。
常见案例
  • Redis

         Redis是一个开源的内存中键值数据库,它也支持数据持久化。除了基本的键值存储外,Redis还提供了多种数据结构的支持,如列表、集合、哈希表等,并支持事务、发布/订阅等多种高级功能。

  • Amazon DynamoDB

        DynamoDB是亚马逊提供的一个完全托管的键值和文档数据库服务,它具有低延迟、可扩展性强的特点,适用于任何规模的应用程序。DynamoDB自动管理分区和数据复制,为开发者提供了强大的工具和灵活的安全选项。

  • Riak

        Riak是一个分布式、容错能力极强的键值数据库。它的设计目标是在不影响性能的前提下保证数据的高度一致性、可用性和分区容忍度。Riak非常适合构建需要高度可靠性的应用。

  • Memcached

        Memcached是一款高性能的分布式内存对象缓存系统,用于加速动态Web应用程序的数据访问速度。它通常用作数据库查询结果的缓存层,减少数据库负载并提高响应速度。

使用场景

适用于需要快速访问的数据,如会话存储、用户偏好设置等。

键值NoSQL数据库特别适合以下场景:

  • 缓存:作为后端数据库的缓存层,以加快数据访问速度,减轻数据库压力。
  • 会话存储:在web应用中存储用户会话信息,提供快速访问。
  • 实时数据分析:处理大量实时产生的数据流,例如日志记录、点击流分析等。
  • 游戏应用:存储用户的游戏进度、状态等信息,要求快速响应时间。
  • 电子商务平台:支持购物车、推荐系统等需要高速读写的场景。

键值存储的抽象是一个巨大的哈希表/哈希映射/字典。

我们希望使用键值缓存的主要原因是为了减少访问活跃数据的延迟。在快速且昂贵的介质(如内存或 SSD)上实现 O(1) 的读/写性能,而不是在传统的慢且便宜的介质(通常是硬盘)上实现 O(logn) 的读/写性能。

设计缓存时需要考虑三个主要因素。

  1. 缓存模式:如何缓存?是读透/写透/写旁/写回/缓存旁?
  2. 放置:将缓存放在哪里?客户端/独立层/服务器端?
  3. 替换:何时过期/替换数据?LRU/LFU/ARC?

缓存设计
1. 缓存策略

选择合适的缓存模式是设计缓存策略的基础。不同的模式适用于不同的场景。

缓存模式上可以对数据进行全页缓存/片段缓存/对象缓存/分布式共享缓存等。

1.Cache Aside(旁路缓存)

  • 描述:这是最常用的缓存模式之一。在读取数据时,首先检查缓存中是否存在所需的数据;如果不存在,则从数据库中加载数据,并将其放入缓存。写操作则直接更新数据库,并使缓存中的对应项失效。
  • 适用场景:适用于读多于写的系统,尤其是那些数据偶尔会改变的应用程序。

2. Read Through(读透)

  • 描述:在此模式下,应用程序请求数据时,缓存自动从数据源(如数据库)加载数据并保存到缓存中,然后返回给应用程序。这使得应用程序可以像访问本地缓存一样访问远程数据源。
  • 适用场景:适合于希望对应用层隐藏数据源复杂性的场景,简化了数据访问逻辑。

3. Write Through(写透)

  • 描述:每次有数据更新时,同时写入缓存和后端存储。这种方式保证了数据的一致性,但可能会降低写操作的速度。
  • 适用场景:对于需要实时保持数据一致性的应用非常有用,比如金融交易系统。

4. Write Behind(Write Back)

  • 描述:与Write Through不同,Write Behind先将数据写入缓存,之后异步地批量写入后端存储。这样可以大大提高写性能,但牺牲了一定的数据一致性。
  • 适用场景:适合于能够容忍一定时间内数据不完全一致的应用场景,例如社交网络的状态更新。

5. Refresh Ahead(预刷新)

  • 描述:该模式尝试预测即将发生的读请求,并提前将数据加载到缓存中。它可以通过定时任务或基于历史访问模式来实现。
  • 适用场景:适合于具有可预见的访问模式的应用程序,比如新闻网站的热门文章列表。

每种缓存模式都有其特定的优势和局限性,在实际应用中选择合适的缓存策略需要考虑多种因素,包括但不限于系统的读写比例、对一致性的要求、以及性能需求等。正确选择和实现缓存策略能够极大地提高应用的性能和响应速度。

2. 缓存的位置

确定缓存的位置对于系统性能和架构复杂度有着直接影响。

  • 客户端缓存:数据缓存在客户端,减少了网络延迟,但可能增加客户端的资源消耗,并且难以实现共享。
  • 独立层缓存:通过中间件或专门的缓存服务器实现,可以被多个服务共享,易于扩展和管理,但增加了系统复杂度。
  • 服务器端缓存:数据缓存在应用服务器上,接近数据处理逻辑,便于管理和维护,但不适合分布式环境下的资源共享。
3. 缓存过期策略

缓存过期策略是管理缓存数据有效性和更新频率的重要机制,确保缓存中的数据既不过期导致频繁访问后端系统,也不至于过于陈旧而影响业务逻辑。以下是几种常用的缓存过期策略:

1. 设置固定过期时间(TTL, Time To Live)

  • 描述:为缓存项设置一个固定的生存时间,在这个时间过后,该项将被视为过期。
  • 适用场景:适用于那些对实时性要求不高、但希望减少缓存穿透的应用场景。

2. 最近最少使用(LRU, Least Recently Used)

  • 描述:当缓存达到其容量限制时,移除最久没有被使用的缓存项。
  • 适用场景:适合于缓存命中率较高、数据访问局部性明显的应用场景。

3. 最不经常使用(LFU, Least Frequently Used)

  • 描述:根据数据的访问频率来决定淘汰哪一项缓存数据,访问次数最少的数据会被首先移除。
  • 适用场景:适用于能够识别出热点数据且这些数据长期有效的场景。

4. 先进先出(FIFO, First In First Out)

  • 描述:当缓存满时,按照数据进入缓存的时间顺序,最早进入的数据最先被淘汰。
  • 适用场景:适合于数据时效性较强的场景,比如日志记录或临时会话信息。

5. 随机替换(Random Replacement)

  • 描述:当需要释放空间时,随机选择一个缓存项进行删除。
  • 适用场景:适用于对缓存命中率要求不高,但追求简单实现的场景。

6. 永不过期

  • 描述:缓存数据不会自动过期,除非被显式地删除或覆盖。
  • 适用场景:适用于几乎不变的数据,如基础配置信息等。

在实际应用中,通常需要结合具体的业务需求和系统特点来选择合适的缓存过期策略。有时也会采用多种策略组合的方式来优化缓存效率和数据新鲜度。例如,可以为某些关键数据设定较短的TTL,同时使用LRU作为后备策略以应对突发流量。

2. 列式存储(Column-Family Store)

列式存储NoSQL数据库是一种专门设计用来高效存储和查询大规模数据集的数据库类型,特别适合于分析型应用。与传统的行式存储数据库不同,列式存储数据库将数据按列而非按行进行存储。这种设计使得它们在处理大量数据时能够提供更高的性能,尤其是在执行聚合操作、范围查询等数据分析任务时。

主要特点
  • 列优先存储:数据按列而非行存储,这使得在查询时只需读取必要的列,提高了性能和压缩率。
  • 高效的数据压缩:由于同一列中的数据通常具有相似性,这使得列式存储可以实现更有效的数据压缩,从而减少存储空间需求并提高I/O效率。
  • 快速的聚合计算:对于需要对某一列的所有值进行求和、平均等计算的操作,列式存储可以直接扫描该列而不需要访问其他无关列的数据,因此速度更快。
  • 灵活的数据模型:支持动态列,即不同行可以有不同的列集合。
  • 优化的查询性能:列式存储非常适合用于只读或少写多读的应用场景,特别是那些需要频繁执行复杂查询和分析的任务。
  • 高吞吐量:特别适合于大量数据的高速写入和读取操作。
常见案例
  1. Apache Cassandra:虽然Cassandra主要被认为是宽列存储数据库,但它也支持类似列式存储的功能。它被设计成可扩展的分布式数据库系统,适用于需要高可用性和容错能力的大规模数据集。
  2. HBase:构建于Hadoop文件系统(HDFS)之上,HBase是一个分布式的、版本化的列式存储数据库。它提供了随机访问和强大的一致性模型,非常适合实时查询大型数据集。
  3. ClickHouse:这是一个用于在线分析处理(OLAP)的列式数据库管理系统(DBMS)。ClickHouse以其高性能和丰富的功能集而闻名,广泛应用于商业智能和大数据分析领域。
  4. Amazon Redshift:虽然是一个完全托管的数据仓库服务,但Redshift采用了列式存储技术来优化查询性能,特别适合用于云端的大规模数据分析工作负载。

选择合适的列式存储NoSQL数据库取决于具体的应用需求,包括但不限于数据量大小、查询模式、延迟要求以及预算限制等因素。每种数据库都有其独特的优势和适用场景,理解这些可以帮助做出更加明智的选择。

使用场景

广泛应用于日志分析、实时数据分析以及需要处理大量数据的应用中,例如推荐系统。

3. 文档存储(Document Store)

文档型NoSQL数据库是一种非关系型数据库,它存储数据为文档格式,通常使用JSON、BSON、XML等格式。这种类型的数据库非常适合于处理半结构化或非结构化的数据,并且能够灵活地适应变化的数据模型。

主要特点
  • 文档导向:将数据存储为半结构化的文档,通常使用JSON、BSON或XML格式。
  • 灵活性:文档内部的数据结构可以变化,不需要预定义模式。文档型数据库允许每个文档拥有不同的字段和结构,因此非常适合需要频繁变更的数据模型。
  • 丰富的查询能力:支持复杂的查询和索引机制,允许基于文档内容进行搜索。可以直接在文档内进行复杂查询,而不需要像传统关系型数据库那样进行复杂的JOIN操作。
  • 易于扩展:大多数文档型数据库都支持水平扩展(通过增加更多的服务器来分散负载),这使得它们非常适合大规模应用。

常见案例

MongoDB

MongoDB是目前最流行的文档型数据库之一,它使用BSON格式(一种类似于JSON的二进制形式)来存储数据。MongoDB提供了丰富的查询语言、索引支持以及强大的聚合框架,使其非常适合用于各种规模的应用程序。

Couchbase

Couchbase是一个高性能、分布式的多模型数据库,支持文档、键值等多种数据模型。它特别强调易用性、可扩展性和性能优化,适用于实时应用。

RavenDB

RavenDB是一个事务性的开源文档数据库,具有高可用性和可扩展性。它提供了ACID事务保证,简化了开发过程中的数据一致性问题。

Amazon DocumentDB

Amazon DocumentDB(兼容MongoDB)是一种快速、可扩展、高可用且完全托管的文档数据库服务,专为现代应用程序设计,可以轻松存储、查询和索引文档数据。

使用场景

适合内容管理系统、物联网、电子商务平台、博客平台、实时分析等,其中数据结构可能随时间变化。

  • 内容管理系统(CMS):由于其灵活性,文档型数据库非常适合存储和管理网站内容,如博客文章、评论等。
  • 物联网(IoT)应用:对于来自不同设备的异构数据,文档型数据库提供了一种方便的方式来存储和查询这些信息。
  • 电子商务平台:产品目录、用户资料、订单信息等都是文档型数据库的理想应用场景。

4. 图数据库(Graph Database)

图数据库是一种专门用于存储和查询图形数据(节点和边)的NoSQL数据库。它们特别适合于处理高度互联的数据集,其中实体之间的关系与实体本身同样重要。图数据库通过直接将关系作为一等公民来存储,从而使得在复杂网络中导航和查询变得高效。

主要特点
  • 图结构:通过节点(代表实体)和边(代表关系)来表示数据,非常适合描述复杂的关系网络。
  • 直观的数据建模:非常适合需要表达丰富关系的数据集。
  • 自然表达关系:图数据库使用节点、边(也称为关系)和属性来表示数据,这使它能够非常直观地表达实体间的关系。
  • 强大的关联查询:能够高效地执行涉及多层关系的查询。对于涉及深度遍历或复杂连接查询的场景,图数据库通常比传统关系型数据库提供更好的性能。
  • 灵活性和可扩展性:支持动态模式设计,允许轻松添加新的节点类型或关系而不需要重新设计整个数据库架构。
常见案例

Neo4j

Neo4j是目前最流行的原生图数据库之一,它提供了强大的Cypher查询语言,支持ACID事务,并且拥有良好的社区支持和文档资料。Neo4j被广泛应用于社交网络分析、推荐系统、路径查找等领域。

Amazon Neptune

Amazon Neptune是一个快速、可靠、完全托管的图数据库服务,支持Gremlin和SPARQL两种查询语言,适用于构建和运行需要高度互联数据的应用程序。

ArangoDB

ArangoDB是一款多模型数据库,支持键值、文档以及图形数据模型。它提供了一种统一的查询语言AQL,可以执行复杂的图形查询。

JanusGraph

JanusGraph是一个开源的分布式图数据库,专为存储和查询大规模图形数据而设计。它支持多种存储后端(如Apache Cassandra、HBase),并可以通过Gremlin进行查询。

使用场景

社交网络分析、推荐系统、路径寻找算法等,特别是当应用的核心在于理解数据之间的关系时。图数据库非常适合以下场景:

  • 社交网络分析:探索用户之间复杂的关系网,识别影响者或社群。
  • 推荐系统:基于用户行为和偏好建立个性化推荐模型。
  • 欺诈检测:识别异常模式或潜在欺诈行为,尤其是在金融交易中。
  • 知识图谱:构建和查询庞大的信息网络,如语义Web或企业知识库。
  • 供应链管理:优化物流网络,提高效率,减少成本。

选择图数据库时,应考虑数据模型的复杂性、查询需求、可扩展性要求等因素。正确选择图数据库可以帮助组织更有效地管理和分析其互联数据资产。

每种NoSQL数据库类型都有其独特的优势和适用场景,选择合适的类型取决于具体的业务需求和数据特性。随着技术的发展,越来越多的企业开始采用混合策略,结合多种NoSQL数据库类型乃至与传统的关系型数据库一起使用,以满足多样化的数据管理需求。

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

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

相关文章

【 Manus平替开源项目】

文章目录 Manus平替开源项目1 OpenManus1.1 简介1.2 安装教程1.3 运行 2 OWL2.1 简介2.2 安装教程2.3 运行 3 OpenHands(原OpenDevin)3.1 简介3.2 安装教程和运行 Manus平替开源项目 1 OpenManus 1.1 简介 开发团队: MetaGPT 核心贡献者(5…

【Linux 服务之ollama 部署过慢问题】

特别慢的 curl -fsSL https://ollama.com/install.sh | sh参考 方法1 export OLLAMA_MIRROR"https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download" curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/downl…

疗养院管理系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装疗养院管理系统软件来发挥其高效地信息处理的作用&#xf…

Web后端开发之Maven

Maven Mven是apache旗下的一个开源项目,用来管理和构建java项目的工具。 通过一小段描述信息来管理项目。 Maven的作用 1.依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题 以前用某个jar包需要下载…

在线招聘小程序:AI简历筛选与精准职位推荐服务

当AI算法遇上小程序开发:重新定义「人岗匹配」的智能招聘革命 一、传统招聘困境:求职者与企业为何总在「错过」? 在数字化浪潮下,企业HR日均需处理数百份简历,却仍有60%的岗位因匹配效率低下而空置;求职者海投简历后,近八成用户表示从未收到精准反馈。这种双向资源错配…

Linux文件IO——缓冲区磁盘上的文件管理

前言 什么是缓冲区&#xff1f; 缓冲区是内存空间上的一小段内存&#xff0c;我们平常在写程序的时候&#xff0c;其实是很难感知到缓冲区的存在的&#xff0c;接下来看一段代码&#xff0c;可以很好地体现缓冲区的存在。 #include<stdio.h> #include<unistd.h> in…

Java中如何去自定义一个类加载器

之前写过一篇&#xff0c;关于 类加载器和双亲委派的文章&#xff0c;里边提到过可以根据自己的需要&#xff0c;去写一个自定义的类加载器&#xff0c;正好有人问这个问题&#xff0c;今天有时间就来手写一个自定义的类加载器&#xff0c;并使用这个自定义的类加载器来加载一个…

X86 RouterOS 7.18 设置笔记六:端口映射(IPv4、IPv6)及回流问题

X86 j4125 4网口小主机折腾笔记五&#xff1a;PVE安装ROS RouterOS X86 RouterOS 7.18 设置笔记一&#xff1a;基础设置 X86 RouterOS 7.18 设置笔记二&#xff1a;网络基础设置(IPV4) X86 RouterOS 7.18 设置笔记三&#xff1a;防火墙设置(IPV4) X86 RouterOS 7.18 设置笔记四…

代码随想录|二叉树|21合并二叉树

leetcode:617. 合并二叉树 - 力扣&#xff08;LeetCode&#xff09; 题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠&#xff0c;那么…

LDR6500在Type-C转DP视频双向互传方案

LDR6500在Type-C转DP视频双向互传方案中扮演着核心角色&#xff0c;以下是对该方案的详细解析&#xff1a; 一、LDR6500芯片概述 LDR6500是乐得瑞科技针对USB Type-C标准中的Bridge设备而开发的USB-C DRP&#xff08;Dual Role Port&#xff0c;双角色端口&#xff09;接口USB…

Vue3中 ref 与 reactive区别

ref 用途: ref 通常用于创建一个响应式的基本类型数据&#xff08;如 string、number、boolean 等&#xff09;&#xff0c;但它也可以用于对象或数组 返回值: ref 返回一个带有 .value 属性的对象&#xff0c;访问或修改数据需要通过 .value 进行 使用场景: …

CRM企业客户关系管理系统产品原型方案

客户关系管理系统&#xff08;CRM&#xff09;是企业产品应用中的典范&#xff0c;旨在通过信息技术和互联网技术提升企业核心竞争力&#xff0c;优化企业与顾客在销售、营销和服务方面的互动。本作品提供了一套通用型的CRM系统原型模板&#xff0c;涵盖数据管理、审批流程、统…

【算法】 【c++】字符串s1 中删除所有 s2 中出现的字符

【算法】 【c】字符串s1 中删除所有 s2 中出现的字符 eg&#xff1a; s1:“helloworld” s2:“wd” 删除后&#xff1a;s1:“helloorl” 1 双循环匹配并删除–>时间复杂度O(n^2) string 里面的删除函数–>erase std::string::erase 是 C 标准库中用于删除字符串中字符…

利用委托用户控件、窗体之间传值 c#

获取数据方&#xff08;usercontrol111&#xff09;声明 public Func<Tuple<int, int>> GetCurrentResult { get; set; }获取数据方调用 var val GetCurrentResult?.Invoke() ?? new Tuple<decimal, decimal>(0, 0);数据发送方声明与赋值 usercontrol111…

【3-14 STC-pair超级详细的解说】

1. pair的定义和结构 • 基础概念&#xff1a;考察对std::pair模板类的理解&#xff0c;包括其头文件&#xff08;<utility>&#xff09;和基本语法&#xff08;pair<T1, T2>&#xff09;。 • 成员访问&#xff1a;测试对first和second成员变量的使用能力。 • 构…

机器人触觉的意义

机器人触觉的重要性 触觉在机器人领域至关重要&#xff0c;尤其是在自主操作、精细操控、人机交互等方面。虽然视觉和语音技术已高度发展&#xff0c;但机器人在现实世界中的操作仍然受限&#xff0c;因为&#xff1a; 视觉有局限性&#xff1a;仅凭视觉&#xff0c;机器人难…

RabbitMQ消息持久化与Lazy模式对比分析

RabbitMQ消息持久化与Lazy模式对比分析 在RabbitMQ中&#xff0c;消息持久化与Lazy模式是两种不同的机制&#xff0c;分别针对消息可靠性、存储优化等不同维度设计。以下从六个层面进行深度对比&#xff1a; 一、核心目标与作用对象差异 维度消息持久化&#xff08;delivery_…

Search-R1 、 R1-Searcher 和 Search-O1

原文链接:https://i68.ltd/notes/posts/20250307-search-r1/ Search-R1 DeepSeek团队开发的SEARCH-R1模型通过强化学习&#xff0c;让AI学会了自主搜索信息并将其与推理过程无缝结合&#xff0c;性能提升高达26%高效、可扩展的RL训练框架&#xff0c;用于推理和搜索引擎调用&…

linux 命令 tail

tail 是 Linux 中用于查看文件末尾内容的命令&#xff0c;常用于日志监控和大文件快速浏览。以下是其核心用法及常见选项&#xff1a; 基本语法 tail [选项] 文件名 常用选项 显示末尾行数 -n <行数> 或 --lines<行数> 指定显示文件的最后若干行&#xff08;…

某乎x-zse-96加密算法分析与还原

文章目录 1. 写在前面2. 接口分析3. 加密分析4. 算法实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…