Spring Boot02(数据库、Redis)02---java八股
MySQL和Redis的区别?
1. 数据类型:
MySQL是一种关系型数据库,表结构化存储,使用 SQL 查询。支持表、列、行等结构化数据。
Redis是一种基于内存的缓存系统,支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。
2. 存储方式:
MySQL则将数据存储在磁盘上,读写速度相对较慢,但可以存储更大的数据量。
Redis将所有数据存储在内存中,因此读写速度非常快。
3. 访问模式:
MySQL则使用多线程模型,可以同时处理多个请求。
Redis是单线程模型,所有请求都在一个线程中依次执行,因此可以获得更高的并发性能。
4. 持久化支持:
MySQL提供了多种持久化方式,如InnoDB引擎的redo log和binlog等。
Redis提供了多种持久化方式,如RDB(快照)和 AOF(追加日志)两种持久化方式等。
5.数据一致性
MySQL支持 ACID 事务,可靠性强。
Redis支持部分事务(通过 MULTI、EXEC),但缺乏回滚机制,安全性略逊。
6.数据容量
MySQL适用于大数据集,TB 级别数据处理能力强。支持主从复制、分库分表、集群等扩展方式。
Redis受内存大小限制,适合小而频繁的数据。支持主从复制、Cluster 模式,扩展性强,但需要手动管理。
7.应用场景
场景 MySQL Redis 数据持久化 核心业务系统(如订单、库存、财务系统等) 适用于对数据完整性要求不高的场景(如日志、缓存等)。 高并发读写 适合中等并发场景。 擅长秒杀、排行榜、实时计数等高并发场景。 临时数据存储 数据需落盘保存,临时数据不推荐。 适用于短暂数据缓存,数据可随时丢弃。 消息队列 不适合。 适用于轻量级消息队列(如 pub/sub
)。在实际开发中,MySQL + Redis 常被组合使用:
- Redis 作为缓存层,快速返回热点数据。
- MySQL 作为持久化存储层,保证数据完整性。
- Cache Aside 模式(缓存旁路):
读取数据时,先查询 Redis,若未命中再查询 MySQL 并将结果写入 Redis。
写入数据时,同时更新 MySQL 和 Redis(或选择延迟淘汰 Redis 数据)。
Mysql底层数据结构,在磁盘上如何存储的?
MySQL 的底层数据存储结构以其存储引擎为基础,最常用的存储引擎是 InnoDB(默认)和 MyISAM。
InnoDB的底层数据结构
InnoDB 将数据以 表空间 (Tablespace) 的形式组织,并进一步划分为以下层次:
- 表空间(ibd文件):一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。
- 段:由多个区组成,是 InnoDB 分配和管理数据的基本单位.
分为
数据段(Leaf node segment)
索引段(Non-leaf node segment)
回滚段(Rollback segment)
InnoDB是索引组织表,数据段就是B+tree的叶子节点,索引段即为B+tree的非叶子节点。段用来管理多个Extent(区)。- 区:表空间的单元结构,每个区的大小为1M。默认情况下,InnoDB存储引擎页大小为16K,既一个区中一共有64个连续的页。
- 页:页是 InnoDB 磁盘存储的最小单元,默认大小为 16KB。
页的类型多样,常见的有:
数据页 (DATA_PAGE):存储表的行数据(叶子节点)
索引页 (INDEX_PAGE):存储 B+树的非叶子节点
Undo 页 (UNDO_PAGE):存储回滚日志
页的内容以行记录 (Row Record) 为核心,页内数据按主键有序存储,支持范围查询。- 行:InnoDB存储引擎数据是按行进行存放的。
InnoDB 的磁盘存储结构采用页 (Page) 为核心单元,通过表空间 (Tablespace)、段 (Segment)、区 (Extent) 等机制,有效组织数据并提升性能。其设计充分利用了 B+树、缓冲池、日志等机制,确保数据的高效存储与快速恢复。
InnoDB 的数据组织体现了层次化的设计思路:
✅ B+树 提供快速检索能力,非叶子节点存储指针,叶子节点对应数据页。
✅ 页 (Page) 是磁盘 I/O 的基本单位,直接存储行数据或索引。
✅ 区 (Extent) 和 段 (Segment) 提供更大粒度的内存管理,减少碎片化,提高 I/O 性能。
✅ 表空间 (Tablespace) 则承载整个数据文件,方便管理与扩展。
Redis的持久化机制?
什么是RDB和AOF-CSDN博客
RDB(Redis DataBase)快照
AOF(Append-Only File)只追加日志文件
RDB 是 Redis 通过创建 数据快照 (snapshot) 来持久化数据的一种机制。它会将某一时刻的内存数据以二进制文件 (.rdb
) 形式存储到磁盘中。
AOF 是 Redis 通过将 每次写操作 以日志形式记录下来的持久化机制。
在生产环境中,推荐同时开启 RDB 和 AOF 以结合两者的优点:
✅ RDB 负责快速备份,适合全量恢复。
✅ AOF 负责实时记录,确保数据安全。
Redis的内存淘汰策略都有什么
1. noeviction(默认策略)
描述:当Redis内存不足时,不执行任何淘汰操作,所有的写操作都会返回错误。这种策略可以确保Redis内存不会被其他进程抢占,但会导致Redis进程被强制杀死,数据全部丢失,因此不建议在生产环境中使用。
适用场景:通常不推荐使用,除非对数据的完整性有极高的要求,且能够接受在内存不足时拒绝所有写操作的后果。
2. allkeys-lru
描述:从所有key中使用LRU(最近最少使用)算法进行淘汰。LRU算法通过记录每个key的最近访问时间,淘汰最长时间未被访问的key。
适用场景:适用于缓存场景,可以确保经常被访问的数据保留在内存中,提高缓存命中率。3. volatile-lru
描述:从设置了过期时间的key中使用LRU算法进行淘汰。这种策略只针对设置了过期时间的key进行操作,优先淘汰那些最近最少使用且已经设置了过期时间的key。
适用场景:适用于需要设置过期时间,同时希望缓存尽可能保留热门数据的场景。4. allkeys-random
描述:从所有key中随机淘汰数据。这种策略不考虑key的访问频率或过期时间,完全随机选择key进行淘汰。
适用场景:在不确定哪些key是热门数据,或者对淘汰策略没有特殊要求的情况下,可以使用这种简单的随机淘汰策略。5. volatile-random
描述:从设置了过期时间的key中随机淘汰。与allkeys-random类似,但这种策略只针对设置了过期时间的key进行操作。
适用场景:在需要淘汰过期key,但又不希望完全依赖LRU算法的情况下,可以使用这种随机淘汰策略。6. volatile-ttl
描述:在设置了过期时间的key中,淘汰过期时间剩余最短的。这种策略优先淘汰那些即将过期的key,确保Redis存储的数据尽可能新鲜。
适用场景:适用于需要快速淘汰即将过期数据的场景,比如缓存即将失效的会话信息等。