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

基础知识:深入理解MongoDB、MySQL与Redis的应用与实践

基础知识:深入理解MongoDB、MySQL与Redis的应用与实践

在现代应用开发中,数据库系统的选择对于系统的性能、扩展性和维护性有着至关重要的影响。MongoDB、MySQL 和 Redis 是三种流行的数据库技术,它们各自有着独特的特点和适用场景。本文将详细介绍这三者的区别,并通过架构图说明它们在系统中的应用环节。最后,我们将提供在 Spring Boot 中使用这三种数据库的 Java 类和配置文件的示例。


文章目录

    • 基础知识:深入理解MongoDB、MySQL与Redis的应用与实践
      • 一、MongoDB
        • MongoDB 的特点:
        • 应用场景:
        • MongoDB 在系统中的位置:
        • Spring Boot 中 MongoDB 的使用示例:
      • 二、MySQL
        • MySQL 的特点:
        • 应用场景:
        • MySQL 在系统中的位置:
        • Spring Boot 中 MySQL 的使用示例:
      • 三、Redis
        • Redis 的特点:
        • 应用场景:
        • Redis 在系统中的位置:
        • Spring Boot 中 Redis 的使用示例:
      • 四、总结对比

一、MongoDB

MongoDB 是一种基于文档的 NoSQL(Not Only SQL,非关系型数据库)数据库,使用 BSON(二进制 JSON)格式存储数据。它的特点包括高扩展性、灵活的文档模型、支持地理空间索引和强大的查询能力。

MongoDB 的特点:
  • 数据模型:文档存储(JSON 格式),适用于非结构化数据。
  • 扩展性:支持水平扩展(Sharding,分片)。
  • 查询能力:支持复杂的查询、聚合操作。
  • 事务:自 4.0 版本后,支持多文档事务。
应用场景:
  • 内容管理系统
  • 大数据分析
  • 实时数据处理
MongoDB 在系统中的位置:

在典型的应用架构中,MongoDB 通常作为主要的数据库存储,处理来自应用层的数据请求。下面的架构图展示了 MongoDB 在系统中的具体位置及其内部结构:

应用层
MongoDB 数据库
分片集群
副本集
  • 应用层(A):代表用户的应用程序,发送数据读写请求。
  • MongoDB 数据库(B):接收并处理来自应用层的请求。
  • 分片集群(C):用于水平扩展数据库,分散数据以提高性能和容量。
  • 副本集(D):提供数据的高可用性和冗余,确保数据的安全性。
Spring Boot 中 MongoDB 的使用示例:

在构建基于 Spring Boot 的应用程序时,集成 MongoDB 可以实现对非结构化数据的高效管理。以下示例展示了如何在 Spring Boot 中定义一个用户实体,并配置与 MongoDB 的连接。

Java 类:

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;/*** 用户实体类,映射到MongoDB中的"users"集合*/
@Document(collection = "users")  // 指定MongoDB文档的集合名
public class User {@Id  // 指定文档的唯一标识符private String id;private String name;private int age;// Getters 和 Setters
}

配置文件 application.yml:

spring:data:mongodb:uri: mongodb://localhost:27017/mydatabase  # 配置MongoDB连接URI

讲解:

  • 在上述 Java 类中,@Document 注解将 User 类映射到 MongoDB 的 “users” 集合。
  • @Id 注解指定了文档的唯一标识符字段,即 id
  • application.yml 文件中,spring.data.mongodb.uri 配置了应用程序连接到本地 MongoDB 数据库的 URI。

二、MySQL

MySQL 是一种关系型数据库管理系统(Relational Database Management System,RDBMS),使用结构化查询语言(Structured Query Language,SQL)进行数据的操作。MySQL 以其可靠性、高性能和广泛的应用而闻名。

MySQL 的特点:
  • 数据模型:表格结构(行和列),适用于结构化数据。
  • 扩展性:通常通过主从复制(Replication,主从复制)和分区表实现扩展。
  • 查询能力:支持复杂的 JOIN 操作和事务处理。
  • 事务:支持 ACID(Atomicity, Consistency, Isolation, Durability,原子性、一致性、隔离性、持久性)事务,保证数据的一致性。
应用场景:
  • 电子商务网站
  • 传统业务系统(ERP、CRM)
  • 数据仓库
MySQL 在系统中的位置:

在典型的企业级应用架构中,MySQL 通常作为关系型数据库,处理结构化数据的存储和查询请求。MySQL 支持多种扩展机制,如主从复制和分区表,用于增强系统的扩展性和数据一致性。下图展示了 MySQL 在系统中的位置及其扩展机制:

应用层
MySQL 数据库
主从复制
分区表
  • 应用层(A):代表应用程序,执行数据的读写操作。
  • MySQL 数据库(B):作为核心数据存储,处理结构化数据。
  • 主从复制(C):用于数据的高可用性和读写分离,增强系统的容错能力。
  • 分区表(D):通过分区表技术,将大表数据拆分,提高查询性能和管理效率。
Spring Boot 中 MySQL 的使用示例:

在基于 Spring Boot 的应用程序中,MySQL 常用于持久化结构化数据。以下示例展示了如何在 Spring Boot 中定义一个用户实体,并配置与 MySQL 的连接。

Java 类:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;/*** 用户实体类,映射到MySQL中的表*/
@Entity  // 标识为JPA实体类,映射到MySQL数据库表
public class User {@Id  // 标识主键字段@GeneratedValue(strategy = GenerationType.IDENTITY)  // 自动生成主键值private Long id;private String name;private int age;// Getters 和 Setters
}

配置文件 application.yml:

spring:datasource:url: jdbc:mysql://localhost:3306/mydatabase  # 配置MySQL数据库连接URLusername: root  # 数据库用户名password: secret  # 数据库密码jpa:hibernate:ddl-auto: update  # 配置JPA自动生成数据库表结构show-sql: true  # 打印SQL语句

讲解:

  • 在上述 Java 类中,@Entity 注解将 User 类映射为 MySQL 数据库中的一张表。
  • @Id@GeneratedValue 注解用于标识主键字段及其生成策略(如自动递增)。
  • application.yml 文件中,spring.datasource.url 配置了应用程序连接到 MySQL 数据库的 URL。

三、Redis

Redis 是一种基于内存的键值存储系统,通常用于缓存、消息队列等场景。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。

Redis 的特点:
  • 数据模型:键值对存储,支持多种复杂数据结构。
  • 扩展性:支持主从复制和哨兵模式,轻松实现高可用性。
  • 性能:极高的读写性能,适用于缓存。
  • 持久化:支持数据持久化,提供 RDB(Redis Database Backup,Redis 数据库备份)和 AOF(Append Only File,追加日志文件)两种方式。
应用场景:
  • 缓存系统
  • 会话管理
  • 实时排行榜
Redis 在系统中的位置:

在典型的分布式系统架构中,Redis 通常用作高速缓存,以减轻数据库的负载并加快数据的访问速度。Redis 还可以通过持久化和主从复制来确保数据的高可用性和安全性。下图展示了 Redis 在系统中的位置及其扩展功能:

应用层
Redis 缓存
持久化存储
主从复制
  • 应用层(A):代表应用程序,发起对缓存数据的读写请求。
  • Redis 缓存(B):主要负责加速数据访问,存储热数据。
  • 持久化存储(C):通过 RDB(Redis Database Backup,Redis 数据库备份)或 AOF(Append Only File,追加日志文件)机制保存数据,防止数据丢失。
  • 主从复制(D):用于数据的高可用性,支持读写分离和数据的冗余备份。
Spring Boot 中 Redis 的使用示例:

在 Spring Boot 应用程序中,Redis 通常用于缓存、会话管理或其他需要快速数据访问的场景。以下示例展示了如何在 Spring Boot 中定义一个实体类,并配置与 Redis 的连接。

Java 类:

import org.springframework.data.redis.core.RedisHash;/*** 用户实体类,映射到Redis中的"User"哈希*/
@RedisHash("User")  // 指定Redis存储的实体哈希名称
public class User {private String id;private String name;private int age;// Getters 和 Setters
}

配置文件 application.yml:

spring:redis:host: localhost  # Redis服务器地址port: 6379  # Redis服务器端口password: secret  # Redis服务器密码

讲解:

  • 在上述 Java 类中,@RedisHash 注解将 User 类映射为 Redis 中的一个哈希存储。
  • spring.redis.hostspring.redis.port 用于配置 Redis 服务器的连接地址和端口。

四、总结对比

我们通过下表来总结 MongoDB、MySQL 和 Redis 的主要区别:

MongoDB
+Document-oriented
+Supports Sharding
+Flexible Schema
+Multi-document Transactions
NoSQL
MySQL
+Table-oriented
+Supports ACID
+Wide Adoption
+Complex Queries(JOINs)
RDBMS
Redis
+Key-Value Storage
+In-memory
+Supports Data Structures
+Extremely Fast
KeyValueStore
特性MongoDBMySQLRedis
数据模型文档(JSON/BSON)表格(行/列)键值对
扩展性支持 Sharding(分片)主从复制(Replication,主从复制)和分区表主从复制、哨兵模式
事务支持支持多文档事务支持 ACID 事务(Atomicity, Consistency, Isolation, Durability,原子性、一致性、隔离性、持久性)不支持(部分支持 Lua 脚本)
持久化支持支持支持(RDB,Redis 数据库备份 和 AOF,追加日志文件)
查询能力强大的查询和聚合功能复杂的 SQL 查询和 JOIN 操作简单查询(基于键值对)
典型应用场景大数据分析、内容管理系统电子商务、业务系统缓存系统、会话管理
性能高(依赖于存储和查询设计)中(依赖于索引和查询优化)极高(基于内存操作)

通过这些对比和示例,我们可以看到 MongoDB、MySQL 和 Redis 在不同场景下各具优势。MongoDB 适合处理非结构化数据和需要高扩展性的场景;MySQL 则是处理结构化数据和需要事务保证的传统业务系统的首选;而 Redis 由于其极高的性能,通常用于需要快速

响应的缓存层。

相关文章:

基础知识:深入理解MongoDB、MySQL与Redis的应用与实践

基础知识:深入理解MongoDB、MySQL与Redis的应用与实践 在现代应用开发中,数据库系统的选择对于系统的性能、扩展性和维护性有着至关重要的影响。MongoDB、MySQL 和 Redis 是三种流行的数据库技术,它们各自有着独特的特点和适用场景。本文将详…...

Reids中List类型、Set类型、SortedSet类型的常用指令

List类型: Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似: 有序元素可以重复插入和删除快查询速度一般 常用来存储一个有序数据&#xff0c…...

K8S Ingress 常用配置

目录 介绍ingress 安装 基本使用请查看域名重定向前后端分离配置默认证书配置指定证书配置白名单配置黑名单配置Annotations 配置ConfigMap 配置 匹配请求头速率限制限制客户端的最大连接数限制每秒钟段并发连接数限制每分钟段并发请求突发访问限制限制传输速度速率限制白名单 …...

【K8S】K8S架构及相关组件

文章目录 1 K8S总体架构2 相关组件2.1 控制面板组件2.2 节点组件2.3 附加组件 写在最后 1 K8S总体架构 K8S,全称Kubernetes,是一个开源的容器部署和管理平台,由Google开发,后捐献给云原生计算基金会(CNCF)…...

【MATLAB第108期】基于MATLAB的fast、vbsa、dynia、eet、glue、pawn、rsa敏感性分析模型合集(无目标函数)【更新中】

【MATLAB第108期】基于MATLAB的fast、vbsa、dynia、eet、glue、pawn、rsa敏感性分析模型合集(无目标函数)【更新中】 一、FAST(Fourier Amplitude Sensitivity Test) FAST(Fourier Amplitude Sensitivity Test&#…...

【K8S】为什么需要Kubernetes?

文章目录 1 什么是Kubernetes?2 三种常见的应用部署方式2.1 传统部署2.2 虚拟化部署2.3 容器化部署 3 Kubernetes的特点写在最后 1 什么是Kubernetes? Kubernetes是 一个开源的,用于管理云平台中多个主机上的容器化应用,Kubernet…...

【Linux】Linux中查找字符串中的命令

在Linux中,查找字符串的命令通常使用grep。grep是一个强大的工具,用于在文件中搜索指定模式的字符串。以下是一些基本用法: 1.在文件中查找字符串 grep "字符串" 文件名例如,查找文件example.txt中包含“hello”的行&…...

最新HTML设计搜索表单

设计搜索表单 页眉中包含表单&#xff0c;表单中只需包含label和Input. 实现如下效果&#xff1a;文本框动态变宽效果 代码&#xff1a;6.2.4.设计搜索表单.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title></t…...

JavaScript constructor原型原型继承

constructor 在 JavaScript 中&#xff0c;构造函数是一种特殊的函数&#xff0c;使用 new 关键字来调用&#xff0c;用于创建对象实例。JavaScript 中的构造函数通常通过 function 关键字定义。 例如&#xff1a; function Person(name, age) {this.name name;this.age a…...

使用Python+moviepy保存截取视频画面

一、 使用VideoFileClip对象的的save_frame函数保存截取的第1帧画面 from moviepy.editor import * mvVideoFileClip(/home/Download/leaves.mp4) mv.save_frame(/home/Download/fst.jpg) # 默认保存截取的第1帧画面 二、 使用VideoFileClip对象的的save_frame函数保存截…...

【DOCKER】显示带UI的软件

1. Linux 1.1 宿主机开放X server权限 xhost 1.2 启动容器 docker run -it --rm --privilegedtrue --useru20 --workdir/home/u20 \ -e DISPLAYhost.docker.internal:0 u20:dev1.3 测试 # 安装测试软件 sudo apt-get -y install x11-apps# 显示测试程序 xclock2. Windows …...

Atcoder Beginner Contest 366

传送门 A - Election 2 时间限制&#xff1a;2秒 内存限制&#xff1a;1024MB 分数&#xff1a;100分 问题描述 在 AtCoder 市举行市长选举。候选人是 Takahashi 和 Aoki。 目前有 N 张有效选票投给了这两个候选人&#xff0c;并且计票正在进行中。这里&#xff0…...

【hexo博客问题】

windows下使用gitbash即可使用 其他bash会产生权限问题 npm install失败 $ npm install npm error code ENOENT npm error syscall open npm error path F:\pf_project\blog_pf\package.json npm error errno -4058 npm error enoent Could not read package.json: Error: E…...

用数组模拟栈和队列

栈 先进后出 //stk 表示定义的栈 //tt表示栈顶的下标 int stk[N], tt 0;//在栈顶上加入一个新的元素 stk[ tt] x;//弹出 tt --;//判断栈是否为空 if (tt > 0) 不为空 else empty//取出栈顶 stk[tt];1.题目 给定一个长度为 N 的整数数列&#xff0c;输出每个数左边第一个…...

Django内置后端和自定义后端

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 5.2.3 内置…...

嵌入式人工智能(OpenCV-基于树莓派的人脸识别与入侵检测)

1、人脸识别 人脸识别是一种技术&#xff0c;通过检测、跟踪和识别人脸上的关键特征&#xff0c;以确认人脸的身份。它通常用于安保系统、身份验证、社交媒体和人机交互等领域。 人脸识别技术的基本原理是先通过图像处理和计算机视觉算法&#xff0c;提取人脸的特征点和特征描…...

如何选择适合的香港云服务器提供商?

稳定性和可靠性 确保提供商有高水平的服务器正常运行时间&#xff0c;并提供可靠的数据备份和恢复选项。 网络速度和延迟 选择能够提供快速和低延迟网络连接的服务商&#xff0c;尤其是对于目标用户位于中国大陆的企业而言。 客户支持 查看提供商是否提供24/7的客户支持&#x…...

安卓Android JAVA校招/实习面试合集:多线程、强软弱虚引用、进程、内存管理、Activity、Fragment......

本人今年&#xff08;2023年&#xff09;参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&a…...

Jeecgboot 字典值自动转化:DictAspect类方法改造,支持IPage、List、Object、Map类自动转化,附有源码

改造的是DictAspect类&#xff1a; 原来使用的 parseDictText(Object result)方法&#xff0c;针对返回对象为Result 的IPage的分页列表数据进行动态字典注入&#xff0c;当单个对象查询&#xff0c;列表查询&#xff0c;或者多个数据放到Map中时&#xff0c;就不会自动转化&am…...

DVWA DOM Based Cross Site Scripting (DOM型 XSS)

DVWA DOM Based Cross Site Scripting (DOM型 XSS) 文章目录 DVWA DOM Based Cross Site Scripting (DOM型 XSS)XSS跨站原理DOM型 LowMediumHighImpossible XSS跨站原理 当应用程序发送给浏览器的页面中包含用户提交的数据&#xff0c;但没有经过适当验证或转义时&#xff0c;就…...

点集相等概念表明流传2300多年使世人深信不疑的直线公理将无穷多各异直线误为同一线

黄小宁 “科学”共识&#xff1a;在初等数学领域绝对不可能有颠覆性创新&#xff0c;谁若说“已非常成熟”的初等数学存在重大错误那就说明谁有“自大狂型精神病”。 “实数集”R可几何化为R轴。与x∈R相异&#xff08;等&#xff09;的实数均可表为yxδ&#xff08;增量δ可…...

2.3.插入排序——像打牌一样整理数组,为什么它对“几乎有序”数据特别友好?

2.3.插入排序——像打牌一样整理数组&#xff0c;为什么它对“几乎有序”数据特别友好&#xff1f; 系列&#xff1a;搜索与排序 | 第 3 篇&#xff0c;共 16 篇 难度&#xff1a;⭐☆☆☆☆ 入门级 标签&#xff1a;排序 插入排序 稳定排序 基础算法 小数据优化 上一篇&#x…...

解锁B站评论区成分检测器核心价值:从入门到精通的实战指南

解锁B站评论区成分检测器核心价值&#xff1a;从入门到精通的实战指南 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分&#xff0c;支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker …...

哈佛医学院做了5679次组学分析:大模型能力没差别,关键在验证

哈佛医学院Zitnik团队的MEDEA 给出了一条明确的技术路线&#xff1a;与其追求更强的骨干大模型&#xff0c;不如在分析流程的每一步嵌入验证机制。在理解 MEDEA 的设计逻辑之前&#xff0c;先看一组来自消融实验的数据。在细胞类型特异性靶点发现任务中&#xff0c;研究团队将M…...

FC-CLIP实战:为什么说“卷积不死”?在开放词汇分割中冻结CLIP主干的深度解析与避坑指南

FC-CLIP技术解析&#xff1a;卷积架构在开放词汇分割中的不可替代性 当整个计算机视觉领域似乎都被Transformer架构席卷时&#xff0c;FC-CLIP论文却掷地有声地宣告"卷积不死"。这个看似反潮流的结论背后&#xff0c;隐藏着哪些被忽视的视觉归纳偏置&#xff1f;冻结…...

5款轻量级效率工具让你的文字识别效率提升300%:Umi-OCR完全指南

5款轻量级效率工具让你的文字识别效率提升300%&#xff1a;Umi-OCR完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内…...

仿真波形截图](https://example.com/waveform.jpg

永磁同步电机全速域无位置传感器控制仿真&#xff0c;高频注入改进滑膜控制&#xff0c;PMSM矢量控制仿真 1&#xff0c;在零低速域&#xff0c;采用无数字滤波器高频方波注入法&#xff0c;减少滤波的相位影响&#xff0c;且对凸极性要求不高&#xff1b; 2&#xff0c;在中高…...

mtkclient-gui技术指南:联发科设备深度控制与系统修复实战

mtkclient-gui技术指南&#xff1a;联发科设备深度控制与系统修复实战 【免费下载链接】mtkclient-gui GUI tool for unlocking bootloader and bypassing authorization on Mediatek devices (Not maintained anymore) 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclie…...

H5与原生App高效通信:DSBridge桥方法实战解析

1. 为什么需要DSBridge&#xff1f; 在混合开发中&#xff0c;H5页面经常需要调用摄像头、地理位置等原生功能&#xff0c;而原生App也需要获取H5页面的数据更新。传统通信方式&#xff08;如URL Scheme拦截&#xff09;存在三个痛点&#xff1a;协议维护成本高&#xff08;需…...

Java编程避坑指南:九大类常见陷阱与解决方案,助你写出高质量代码

文章目录 基础类 类、继承与内存 继承特性与注意事项 内存管理 现代 Java 特性 记录类与密封类常见陷阱 集合与遍历 相等性约定 集合常见陷阱 并发与同步 并发 异常处理 泛型与类型擦除 泛型陷阱 泛型与类型擦除 泛型陷阱 JVM、垃圾回收与模块系统 JVM/GC 常见陷阱 模块系统(J…...