数据库


数据库

MySQL常用的存储引擎,如何根据应用场景选择

  • InnoDB:支持事务、外键,适用于高可靠性需求的应用。
    • 特点:支持ACID事务、行级锁、外键约束。
      • ACID是衡量事务的四个特性
        • 原子性(Atomicity)
        • 一致性(Consistency)
        • 隔离性(Isolation)
        • 持久性(Durability)
    • 适用场景:需要高并发、数据一致性的应用,如金融系统。
  • 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:监视键,防止并发修改。

详细介绍

  1. MULTI:开启一个事务块,之后的命令会被放入队列中,而不会立即执行。

    MULTI
  2. 命令队列:在MULTI之后,可以添加多个命令,这些命令会被放入队列中。

    SET key1 value1
    SET key2 value2
  3. WATCH:在执行MULTI之前,可以使用WATCH命令监视一个或多个键。如果在事务执行之前这些键被修改,事务将被取消。

    WATCH key1
  4. EXEC:提交事务,执行所有在MULTI之后添加的命令。如果WATCH监视的键在事务执行之前被修改,EXEC将返回空回复,表示事务失败。

    EXEC
  5. DISCARD:如果在MULTI之后决定不执行事务,可以使用DISCARD命令取消事务。

    DISCARD

示例

以下是一个使用Redis事务的示例:

WATCH mykey
MULTI
INCR mykey
INCR mykey
EXEC

在这个示例中,首先监视mykey,然后在事务块中将mykey的值增加两次,最后提交事务。如果在事务执行之前mykey被修改,事务将失败。

缓存击穿,以及如何防止

缓存击穿:热点数据失效导致大量请求打到数据库。
防止方法:设置热点数据永不过期、使用互斥锁。

LSM Tree

日志结构合并树,适用于写密集型应用。

  • 特点:写操作先写入内存,再批量写入磁盘,减少磁盘I/O。
  • 适用场景:写操作频繁的应用,如日志系统。

MySQL 数据的同步与复制

  • 主从复制:主库写操作,从库读操作,提高读写性能。
  • 半同步复制:主库写操作等待至少一个从库确认,提高数据一致性。
  • 组复制:多主复制,所有节点都可以读写,提高可用性。

文章作者: xucanxx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xucanxx !
  目录