当前位置: 首页 > news >正文

第1章大型互联网公司的基础架构——1.10 其他NoSQL数据库

这里我们简单介绍一下其他常见的NoSQL数据库及其适用的场景,其中部分数据库会在后续服务设计章节中正式使用时再做详细介绍。

1.10.1 文档数据库

文档数据库的典型代表是MongoDB和CouchDB。**文档数据库普遍采用JSON格式来存储数据,而不是采用僵硬的行和列结构,其好处是可以解决关系型数据库表结构(Schema)扩展不方便的问题,以及可以存储和读/写任何格式的数据。**文档数据库与键值存储系统很类似,只不过值存储的内容是文档信息。文档数据库具有很好的可扩展性。

文档数据库适用的场景如下。

  1. 数据量大,且数据增长很快的业务场景。
  2. 数据字段定义不明确,且字段在不断变化、无法统一的场景。比如商品参数信息存储,电子设备商品参数有内存大小、电池容量等,服装商品参数有尺码、面料等。

文档数据库不适用的场景如下。

  1. 需要支持事务,文档数据库无法保证在一个事务中修改多个文档的原子性。
  2. 需要支持复杂查询,例如join语句。

1.10.2 列式数据库

列式数据库的典型代表是BigTable、HBase等。关系型数据库按照行来存储数据,所以它也被称为“行式数据库”;而列式数据库按照列来存储数据,如图1-44所示的是一个学生信息数据的例子。

image-20250217131423942

列式数据库将每一列的数据组织在一起,这样做有什么好处呢?假设现在要统计各专业的学生人数:

  1. 如果使用行式数据库,那么首先需要将所有行的数据读取到内存,然后对“专业”列进行GroupBy操作得到结果。虽然我们只关注“专业” 一列,但是其他列也参与了数据读取,磁盘I/O次数较多;
  2. 而如果使用列式数据库,那么只需要将“专业”列数 据读取到内存,磁盘I/O次数大大减少,提高了查询效率。

列式数据库有很高的存储空间利用率,对于列数据类型是有限枚举(比如性别、专业)的情况,列式数据库可以通过字典表将数据压缩为图1-45所示的形式。

image-20250217131632598

从图1-45中可以看出,性别字典、专业字典分别使用了数字编号来代表原来的字符串,原始数据经过压缩后字符串变为数字,提高了存储空间利用率,且数据量越大,存储空间利用率越高。

列式数据库适用的场景如下。

  1. 有海量数据插入,但是数据修改极少的场景,比如用户行为收集。
  2. 数据分析场景,比如针对少数几列做离线数据统计工作。

列式数据库不适用的场景如下。

  1. 数据高频删除、修改的场景,即不适合直接服务于在线用户。
  2. 需要支持事务的场景。

1.10.3 全文搜索数据库

全文搜索数据库的典型代表是Elasticsearch。关系型数据库在应对全文搜索场景时,只能通过LIKE语句进行模糊查询,而LIKE语句会扫描全量数据,效率非常低下。全文搜索数据库的出现就是为了解决关系型数据库不支持高效全文搜索的问题,其基本原理是建立单词到文档的索引关系作为“倒排索引”

如图1-46所示,倒排索引维护着每个关键词在哪些文档中出现过的文档列表。在进行全文搜索时,根据搜索关键词就可以直接获取到相关文档信息。文档列表既可以保存文档ID,也可以记录关键词在每个文档中出现的频率和位置。

image-20250217132040119

倒排索引非常适合根据关键词查询文档内容,所以在各种搜索场景中得到了广泛应用。其典型的应用场景包括:

  1. 关键词搜索,如搜索引擎;
  2. 海量数据的复杂查询;
  3. 数据统计和数据聚合。

倒排索引不适用的场景包括:

  1. 高频更新数据的场景。在全文搜索数据库中,修改数据实际上是删除旧数据和创建新数据两步操作;
  2. 需要支持事务的场景。

1.10.4 图数据库

近几年图数据库较为火热,其主要的开源项目有Neo4j、Titan等。图数据库指的并不是存储图片的数据库,而是以“图”这种数据结构存储数据的数据库

图由两个元素组成:

  • 节点:表示一个实体(人、商品等事物)
  • 关系:表示两个节点之间的关联关系

对于1.7.1节所举的例子:学生选课系统,如果用图数据库来存储,则会形成图1-47所示的存储结构。

image-20250217132516215

从图1-47中可以看出,图数据库可以很简单且自然地构建出直观的数据模型;同时,我们可以很容易查询任意一个节点与其他节点的关系,解决了关系型数据库不擅长处理实体关系的问题。关系在图数据库中占首要地位,它非常适合强调关系、需要复杂关系查询和分析的业务场景,比如社交网络、知识图谱等。

1.10.5 NewSQL数据库

上述几种NoSQL数据库,虽然分别解决了关系型数据库无法实现高效处理的一些问题,但是也几乎丧失了关系型数据库的强一致性、事务支持等特性。因此,结合关系型数据库及NoSQL数据库两者优点的数据库便产生了,即NewSQL数据库。目前其较为知名的项目包括Google Spanner、TiDB、CockroachDB等。

**NewSQL底层依然采用NoSQL存储数据。**更确切地说,NewSQL使用分布式键值存储系统存储数据,而且在此基础上进行了很多革新,例如:

  • 键值存储系统采用LSM Tree模型构建,可以大幅度提升写数据性能;
  • 放弃了NoSQL的主从复制模式,而是以更小粒度的数据分片作为高可用单位,主从分片之间通过Paxos或Raft等分布式共识算法进行数据复制;
  • 采用分布式事务实现键值存储系统的事务能力。

NewSQL既保留了NoSQL可扩展性强的优势,又在此基础上提供了类似于关系型数据库的事务能力。换言之,NewSQL的本质就是在传统关系型数据库上集成了NoSQL强大的可扩展性。NewSQL的思想很好,它作为数据库领域的后起之秀,正在进入越来越多的应用场景。但是目前NewSQL依然是小众产品,它在高并发、事务性上的表现还需要更多的考验,短期内NewSQL难以完全取代关系型数据库和NoSQL数据库。

总结

什么是文档数据库?

  • 文档数据库的典型代表是MongoDB和CouchDB。
  • 文档数据库普遍采用JSON格式来存储数据,而不是采用僵硬的行和列结构,其好处是可以解决关系型数据库表结构(Schema)扩展不方便的问题,以及可以存储和读/写任何格式的数据。
  • 文档数据库与键值存储系统很类似,只不过值存储的内容是文档信息。
  • 文档数据库具有很好的可扩展性。

文档数据库适用的场景?

  1. 数据量大,且数据增长很快的业务场景。
  2. 数据字段定义不明确,且字段在不断变化、无法统一的场景。比如商品参数信息存储,电子设备商品参数有内存大小、电池容量等,服装商品参数有尺码、面料等。

文档数据库不适用的场景?

  1. 需要支持事务,文档数据库无法保证在一个事务中修改多个文档的原子性。
  2. 需要支持复杂查询,例如join语句。

列式数据库适用的场景?

  1. 有海量数据插入,但是数据修改极少的场景,比如用户行为收集。
  2. 数据分析场景,比如针对少数几列做离线数据统计工作。

列式数据库不适用的场景?

  1. 数据高频删除、修改的场景,即不适合直接服务于在线用户。
  2. 需要支持事务的场景。

为什么会出现全文搜索数据库?

  • 全文搜索数据库的出现就是为了解决关系型数据库不支持高效全文搜索的问题,其基本原理是建立单词到文档的索引关系作为“倒排索引”。

什么是倒排索引?

  • 倒排索引建立了单词到文档的索引关系,维护着每个关键词在哪些文档中出现过的文档列表。

倒排索引的应用场景?

  1. 关键词搜索,如搜索引擎;
  2. 海量数据的复杂查询;
  3. 数据统计和数据聚合。

倒排索引不适用的场景包括:

  1. 高频更新数据的场景。在全文搜索数据库中,修改数据实际上是删除旧数据和创建新数据两步操作;
  2. 需要支持事务的场景。

什么是图数据库?

  • 图数据库是指以“图”这种数据结构存储数据的数据库。

图数据库的适用场景?

  • 它非常适合强调关系、需要复杂关系查询和分析的业务场景,比如社交网络、知识图谱等。

为什么会出现NewSQL数据库?

  • NoSQL数据库,虽然解决了关系型数据库无法实现高效处理的一些问题,但是也几乎丧失了关系型数据库的强一致性、事务支持等特性。
  • 因此,结合关系型数据库及NoSQL数据库两者优点的数据库便产生了。

什么是NewSQL数据库?

  • NewSQL底层依然采用NoSQL存储数据。更确切地说,NewSQL使用分布式键值存储系统存储数据。

NewSQL数据库有哪些革新?

  • 键值存储系统采用LSM Tree模型构建,可以大幅度提升写数据性能;
  • 放弃了NoSQL的主从复制模式,而是以更小粒度的数据分片作为高可用单位,主从分片之间通过Paxos或Raft等分布式共识算法进行数据复制;
  • 采用分布式事务实现键值存储系统的事务能力。

相关文章:

第1章大型互联网公司的基础架构——1.10 其他NoSQL数据库

这里我们简单介绍一下其他常见的NoSQL数据库及其适用的场景,其中部分数据库会在后续服务设计章节中正式使用时再做详细介绍。 1.10.1 文档数据库 文档数据库的典型代表是MongoDB和CouchDB。**文档数据库普遍采用JSON格式来存储数据,而不是采用僵硬的行…...

DeepSeek+Kimi生成高质量PPT

DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用:生成结构化PPT大纲(擅长逻辑构建与内容优化)Kimi核心作用:将文本转换为视觉化PPT(提供模板库与排版引擎) 二、操作步骤详解 1. 通…...

web网络安全:跨站脚本攻击(XSS)

跨站脚本攻击(XSS)概述 跨站脚本攻击(XSS,Cross-Site Scripting) 是一种常见的 Web 安全漏洞,攻击者通过向受信任的网站注入恶意脚本(通常是 JavaScript),诱使其他用户在…...

【Python爬虫(44)】分布式爬虫:筑牢安全防线,守护数据之旅

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…...

微信小程序:多菜单栏设计效果

一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…...

海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)

1.首先说了一下为什么要用ISUP协议来取流 ISUP主要就是用来解决摄像头没有公网ip的情况,如果摄像头或者所在局域网的路由器有公网ip的话,其实采用rtsp直接取流是最方便也是性能最好的,但是项目的摄像头没有公网IP所以被迫使用ISUP,ISUP是海康…...

蓝桥杯之阶段考核

📖 Day 7:阶段考核 - 蓝桥杯官方模拟赛(限时 4 小时) 📖 一、如何高效完成模拟赛? 模拟赛是一种接近真实竞赛的训练方式。要高效完成模拟赛,需要掌握以下策略: 1. 赛前准备 ✅ 环…...

Python爬虫基础重要数据类型

重要数据类型 列表数据类型 在实际开发中,经常需要将一组(不只一个)数据存储起来,以便后边的代码使用。列表就是这样的一个数据结构。且列表是Python中最基本也是最常用的数据结构之一。什么是数据结构呢?通俗来讲&a…...

乐享数科:供应链金融—三个不同阶段的融资模式

供应链金融是与产业链紧密结合的融资模式,它主要体现在订单采购、存货保管、销售回款这三个不同的业务阶段,并针对这些阶段提供了相应的金融服务。以下是这三个阶段中主要的融资模式及其特点: 供应链金融融资模式主要分为以下几种&#xff1…...

【AI】openEuler 22.03 LTS SP4安装 docker NVIDIA Container Toolkit

NVIDIA Container Toolkit 打开网址 Unsupported distribution or misconfigured repository settings | NVIDIA Container Toolkit 为方便离线安装,先下载过来 wget https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo mk…...

【2025全网首发B站教程】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!

【2025全站首发】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测! 文章目录 1. 数据集准备1.1 标签格式转换1.2 数据集划分1.3 yaml配置文件创建 2. 训练验证 1. 数据集准备 示例数据集下载链接:P…...

设计模式教程:中介者模式(Mediator Pattern)

中介者模式是一种行为型设计模式,它用于减少对象之间的直接依赖关系。通过引入一个中介者对象,所有对象的交互都通过中介者进行,而不是直接相互通信。这种模式的主要目的是减少对象之间的耦合,提升系统的灵活性和可维护性。 1. 定…...

编写dockercompose脚本,管理redis,activemq,mysql5.7

编写dockercompose脚本,管理redis,activemq,mysql5.7,mysql的root密码设置Duke2007,redis密码设置duke0591 Docker Compose 多服务编排脚本(安全增强版) yaml 复制 services: # # MySQL 5.7 服务配置 #…...

【编程语言】委托与函数指针

委托与函数指针的相似之处: 指向方法:C# 的委托和 C 的函数指针都可以用来指向一个方法或函数。调用方法:它们都可以通过引用(委托或函数指针)来调用指向的方法。 委托与函数指针的主要区别: 类型安全&am…...

基于vue和微信小程序的校园自助打印系统(springboot论文源码调试讲解)

第3章 系统设计 3.1系统功能结构设计 本系统的结构分为管理员和用户、店长。本系统的功能结构图如下图3.1所示: 图3.1系统功能结构图 3.2数据库设计 本系统为小程序类的预约平台,所以对信息的安全和稳定要求非常高。为了解决本问题,采用前端…...

数字后端实现之Innovus中open net原因解析及解决方案

数字IC后端设计实现Innovus中我们经常会碰到如下的WARNING警告信息。这个log是在route或ECO Route阶段报的。这个WARNING必须要看,因为这里是报告当前设计存在open的net,即某些pin只有逻辑连接,而没有实际的物理连接。 这里正常工具应该报ERR…...

MATLAB基础学习相关知识

MATLAB安装参考:抖音-记录美好生活 MATLAB基础知识学习参考:【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分:变量定义和基本运算 生成矩阵: % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…...

Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统

随着大语言模型的广泛应用,知识库问答系统逐渐成为提升工作效率和个人学习的有力工具。MaxKB是一款基于LLM(Large Language Model)大语言模型的知识库问答系统,支持多模型对接、文档上传和自动爬取等功能。本文将详细介绍如何在Ma…...

RT-Thread+STM32L475VET6——icm20608传感器

文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟,并修改时钟树1.2 打开I2C3,参数默认即可(I2C根据自己需求调整)1.3 打开串口1.4 生成工程 2. 添加icm20608软件包3. 使能传感器,打开动态链接库4.…...

【信息系统项目管理师-案例真题】2022下半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一(24分)【问题1】(6分)【问题2】(10分)【问题3】(8分)试题二(26分)【问题1】(8分)【问题2】(8分)【问题3】(4分)【问题4】(6分)试题三(25分)【问题1】(12分)【问题2】(7分)【问题…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) ​遍历字符串​:通过外层循环逐一检查每个字符。​遇到 ? 时处理​: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: ​与…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...