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

高性能架构模式——高性能NoSQL

目录

    • 一、关系数据库的缺点
    • 二、常见的 NoSQL 方案分 类
      • 2.1、K-V 存储
      • 2.2、文档数据库
      • 2.3、列式数据库
      • 2.4、全文搜索引擎
    • 三、高性能 NoSQL 方案的典型特征和应用场景
      • 3.1、K-V 存储典型特征和应用场景
      • 3.2、文档数据库典型特征和应用场景
        • 3.1.1、文档数据库的 no-schema 特性的优势
        • 3.1.2、文档数据库的 no-schema 特性的劣势
      • 3.3、列式数据库典型特征和应用场景
      • 3.4、全文搜索引擎典型特征和应用场景
        • 3.4.1、全文搜索基本原理
        • 3.4.2、全文搜索的使用方式

本文来源:极客时间vip课程笔记

一、关系数据库的缺点

  • 关系数据库存储的是行记录,无法存储数据结构

    以微博的关注关系为例,“我关注的人”是一个用户 ID 列表,使用关系数据库存储只能将列表拆成多行,然后再查询出来组装,无法直接存储一个列表。

  • 关系数据库的 schema 扩展很不方便

    关系数据库的表结构 schema 是强约束,操作不存在的列会报错,业务变化时扩充列也比较麻烦,需要执行 DDL(data definition language,如 CREATE、ALTER、DROP 等)语句修改,而且修改时可能会长时间锁表(例如,MySQL 可能将表锁住 1 个小时)。

  • 关系数据库在大数据场景下 I/O 较高

    如果对一些大量数据的表进行统计之类的运算,关系数据库的 I/O 会很高,因为即使只针对其中某一列进行运算,关系数据库也会将整行数据从存储设备读入内存。

  • 关系数据库的全文搜索功能比较弱

    关系数据库的全文搜索只能使用 like 进行整表扫描匹配,性能非常低,在互联网这种搜索复杂的场景下无法满足业务要求。

二、常见的 NoSQL 方案分 类

2.1、K-V 存储

  • 解决关系数据库无法存储数据结构的问题,以 Redis 为代表。

2.2、文档数据库

  • 解决关系数据库强 schema 约束的问题,以 MongoDB 为代表。

2.3、列式数据库

  • 解决关系数据库大数据场景下的 I/O 问题,以 HBase 为代表。

2.4、全文搜索引擎

  • 解决关系数据库的全文搜索性能问题,以 Elasticsearch 为代表。

三、高性能 NoSQL 方案的典型特征和应用场景

3.1、K-V 存储典型特征和应用场景

  • K-V 存储的全称是 Key-Value 存储,其中 Key 是数据的标识,和关系数据库中的主键含义一样,Value 就是具体的数据。

  • Redis 是 K-V 存储的典型代表,它是一款开源(基于 BSD 许可)的高性能 K-V 缓存和存储系统。Redis 的 Value 是具体的数据结构,包括 string、hash、list、set、sorted set、bitmap 和 hyperloglog,所以常常被称为数据结构服务器。

  • 以 List 数据结构为例,Redis 提供了下面这些典型的操作(更多请参考链接:http://redis.cn/commands.html#list):

    LPOP key 从队列的左边出队一个元素。

    LINDEX key index 获取一个元素,通过其索引列表。

    LLEN key 获得队列(List)的长度。

    LLEN key 获得队列(List)的长度。

  • 以上这些功能,如果用关系数据库来实现,就会变得很复杂。例如,LPOP 操作是移除并返回 key 对应的 list 的第一个元素。如果用关系数据库来存储,为了达到同样目的,需要进行下面的操作:

    每条数据除了数据编号(例如,行 ID)

http://www.xdnf.cn/news/15534.html

相关文章:

  • 【MySQL基础】MySQL事务详解:原理、特性与实战应用
  • 用PyTorch手写透视变换
  • 嵌入式学习-PyTorch(5)-day22
  • Towards Low Light Enhancement with RAW Images 论文阅读
  • ASP.NET Core Hosting Bundle
  • Debian 12中利用dpkg命令安装MariaDB 11.8.2
  • C++11迭代器改进:深入理解std::begin、std::end、std::next与std::prev
  • 在 kubernetes 上安装 jenkins
  • 数据结构自学Day7-- 二叉树
  • I3C通信驱动开发注意事项
  • PHP连接MySQL数据库的多种方法及专业级错误处理指南
  • 本地 LLM API Python 项目分步指南
  • Neo4j Python 驱动库完整教程(带输入输出示例)
  • HCIA第三次综合实验:VLAN
  • python实现自动化sql布尔盲注(二分查找)
  • 清理C盘--办法
  • Redis集群搭建(主从、哨兵、读写分离)
  • 26.将 Python 列表拆分为多个小块
  • Kafka 4.0 技术深度解析
  • 尚庭公寓-----day1----逻辑删除功能
  • PHP语法高级篇(三):Cookie与会话
  • 构建 Go 可执行文件镜像 | 探索轻量级 Docker 基础镜像(我应该选择哪个 Docker 镜像?)
  • DGNNet:基于双图神经网络的少样本故障诊断学习模型
  • element plus使用插槽方式自定义el-form-item的label
  • 3D数据:从数据采集到数据表示,再到数据应用
  • 本地电脑安装Dify|内网穿透到公网
  • 【Qt】插件机制详解:从原理到实战
  • 【科研绘图系列】R语言绘制中国地图和散点图以及柱状图
  • ES2023 新特性解析_数组与对象的现代化操作指南
  • 一文厘清楼宇自控系统架构:包含哪些关键子系统及其作用