数据库
MySQL常用的存储引擎,如何根据应用场景选择
- InnoDB:支持事务、外键,适用于高可靠性需求的应用。
- 特点:支持ACID事务、行级锁、外键约束。
- ACID是衡量事务的四个特性
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
- ACID是衡量事务的四个特性
- 适用场景:需要高并发、数据一致性的应用,如金融系统。
- 特点:支持ACID事务、行级锁、外键约束。
- MyISAM:不支持事务,适用于读多写少的应用。
- 特点:不支持事务、表级锁、存储空间小。
- 适用场景:读操作多于写操作的应用,如数据仓库。
- Memory:数据存储在内存中,适用于需要快速访问的数据。
- 特点:数据存储在内存中,访问速度快,断电数据丢失。
- 适用场景:需要快速访问的数据,如缓存表、临时数据。
乐观锁和悲观锁
乐观锁:假设不会发生冲突,提交时检查冲突。
- 实现方式:版本号机制、时间戳机制。
- 适用场景:读多写少的场景,冲突概率低。
悲观锁:假设会发生冲突,操作前加锁。
- 实现方式:数据库锁机制(行锁、表锁)。
- 适用场景:写操作多的场景,冲突概率高。
MySQL多版本控制(MVCC)
通过保存数据的多个版本,实现并发控制,常用的是InnoDB的MVCC。
- 实现方式:
- 每行数据有两个隐藏列,分别存储创建时间和删除时间。
- 使用Undo日志保存数据的旧版本。
- 读取数据时,通过比较当前事务的版本号与数据版本号,决定读取哪个版本的数据。
- 优点:
- 提高并发性能:读操作不加锁,写操作只锁定必要的行。
- 避免读写冲突:读操作可以读取旧版本数据,写操作可以并发进行。
- 缺点:
- 占用更多存储空间:需要保存多个版本的数据。
- 版本管理复杂:需要维护多个版本的数据和Undo日志。
- 适用场景:高并发读写操作,保证数据一致性。
分库分表
将数据分散到多个数据库或表中,提高性能和可扩展性。
- 分库:将数据分散到多个数据库实例中,减轻单个数据库的压力。
- 分表:将数据分散到多个表中,减轻单个表的压力。
- 适用场景:数据量大、并发高的应用,如电商系统。
InnoDB的事务等级
- READ UNCOMMITTED:最低级别,允许读取未提交的数据,可能导致脏读。
- READ COMMITTED:允许读取已提交的数据,防止脏读,但可能导致不可重复读。
- REPEATABLE READ:默认级别,保证同一事务内多次读取结果一致,防止不可重复读,但可能导致幻读。
- SERIALIZABLE:最高级别,完全串行化执行事务,防止幻读,但性能较低。
Redis的数据结构类型
- 字符串:最基本的数据类型,可以存储字符串、整数、浮点数。
- 哈希:键值对集合,适用于存储对象。
- 列表:有序字符串集合,适用于消息队列。
- 集合:无序字符串集合,适用于去重。
- 有序集合:带有分数的有序字符串集合,适用于排行榜。
- 位图:位数组,适用于高效存储二进制数据。
- HyperLogLog:基数估计算法,适用于统计独立元素数量。
- 地理空间索引:存储地理位置信息,支持半径查询。
- 流:日志数据结构,适用于消息队列。
如何使用Redis实现事务
使用MULTI、EXEC、WATCH命令实现事务。
- MULTI:开启事务。
- EXEC:提交事务。
- WATCH:监视键,防止并发修改。
详细介绍
MULTI:开启一个事务块,之后的命令会被放入队列中,而不会立即执行。
MULTI
命令队列:在MULTI之后,可以添加多个命令,这些命令会被放入队列中。
SET key1 value1 SET key2 value2
WATCH:在执行MULTI之前,可以使用WATCH命令监视一个或多个键。如果在事务执行之前这些键被修改,事务将被取消。
WATCH key1
EXEC:提交事务,执行所有在MULTI之后添加的命令。如果WATCH监视的键在事务执行之前被修改,EXEC将返回空回复,表示事务失败。
EXEC
DISCARD:如果在MULTI之后决定不执行事务,可以使用DISCARD命令取消事务。
DISCARD
示例
以下是一个使用Redis事务的示例:
WATCH mykey
MULTI
INCR mykey
INCR mykey
EXEC
在这个示例中,首先监视mykey
,然后在事务块中将mykey
的值增加两次,最后提交事务。如果在事务执行之前mykey
被修改,事务将失败。
缓存击穿,以及如何防止
缓存击穿:热点数据失效导致大量请求打到数据库。
防止方法:设置热点数据永不过期、使用互斥锁。
LSM Tree
日志结构合并树,适用于写密集型应用。
- 特点:写操作先写入内存,再批量写入磁盘,减少磁盘I/O。
- 适用场景:写操作频繁的应用,如日志系统。
MySQL 数据的同步与复制
- 主从复制:主库写操作,从库读操作,提高读写性能。
- 半同步复制:主库写操作等待至少一个从库确认,提高数据一致性。
- 组复制:多主复制,所有节点都可以读写,提高可用性。