基础知识:深入理解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 在系统中的具体位置及其内部结构:
- 应用层(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 在系统中的位置及其扩展机制:
- 应用层(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 在系统中的位置及其扩展功能:
- 应用层(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.host和spring.redis.port用于配置 Redis 服务器的连接地址和端口。
四、总结对比
我们通过下表来总结 MongoDB、MySQL 和 Redis 的主要区别:
| 特性 | MongoDB | MySQL | Redis |
|---|---|---|---|
| 数据模型 | 文档(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类似: 有序元素可以重复插入和删除快查询速度一般 常用来存储一个有序数据,…...
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设计搜索表单
设计搜索表单 页眉中包含表单,表单中只需包含label和Input. 实现如下效果:文本框动态变宽效果 代码:6.2.4.设计搜索表单.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title></t…...
JavaScript constructor原型原型继承
constructor 在 JavaScript 中,构造函数是一种特殊的函数,使用 new 关键字来调用,用于创建对象实例。JavaScript 中的构造函数通常通过 function 关键字定义。 例如: 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 时间限制:2秒 内存限制:1024MB 分数:100分 问题描述 在 AtCoder 市举行市长选举。候选人是 Takahashi 和 Aoki。 目前有 N 张有效选票投给了这两个候选人,并且计票正在进行中。这里࿰…...
【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 的整数数列,输出每个数左边第一个…...
Django内置后端和自定义后端
【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 5.2.3 内置…...
嵌入式人工智能(OpenCV-基于树莓派的人脸识别与入侵检测)
1、人脸识别 人脸识别是一种技术,通过检测、跟踪和识别人脸上的关键特征,以确认人脸的身份。它通常用于安保系统、身份验证、社交媒体和人机交互等领域。 人脸识别技术的基本原理是先通过图像处理和计算机视觉算法,提取人脸的特征点和特征描…...
如何选择适合的香港云服务器提供商?
稳定性和可靠性 确保提供商有高水平的服务器正常运行时间,并提供可靠的数据备份和恢复选项。 网络速度和延迟 选择能够提供快速和低延迟网络连接的服务商,尤其是对于目标用户位于中国大陆的企业而言。 客户支持 查看提供商是否提供24/7的客户支持&#x…...
安卓Android JAVA校招/实习面试合集:多线程、强软弱虚引用、进程、内存管理、Activity、Fragment......
本人今年(2023年)参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来&a…...
Jeecgboot 字典值自动转化:DictAspect类方法改造,支持IPage、List、Object、Map类自动转化,附有源码
改造的是DictAspect类: 原来使用的 parseDictText(Object result)方法,针对返回对象为Result 的IPage的分页列表数据进行动态字典注入,当单个对象查询,列表查询,或者多个数据放到Map中时,就不会自动转化&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跨站原理 当应用程序发送给浏览器的页面中包含用户提交的数据,但没有经过适当验证或转义时,就…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
