MySQL
1. binlog 和 redolog 有什么区别?
Binlog(Binary Log)和Redo Log(重做日志)是MySQL中两种不同的日志类型,它们在用途、写入方式和是否特定于InnoDB引擎等方面有所不同。
1. **用途:**
- **Binlog:** Binlog是用于记录数据库的所有DDL(数据定义语言)和DML(数据操作语言)操作的日志。它包含了对数据库的所有更改操作,可以用于数据备份、主从复制、数据恢复等操作。
- **Redo Log:** Redo Log用于确保数据库的事务持久性。它记录了数据库中发生的所有修改操作,以便在数据库崩溃或异常关闭时进行数据恢复。
2. **写入方式:**
- **Binlog:** Binlog是按照事件的方式写入的,即每个数据库操作被记录为一个事件,这些事件按照顺序依次写入Binlog文件。
- **Redo Log:** Redo Log是按照页的方式写入的,即将修改过的数据页直接写入Redo Log中,而不是以逻辑操作的形式记录。
3. **是否特定于InnoDB引擎:**
- **Binlog:** Binlog不是特定于任何存储引擎,它记录了对数据库的所有更改操作,可以被所有存储引擎使用。
- **Redo Log:** Redo Log是InnoDB存储引擎特有的,它是InnoDB引擎实现事务持久性的机制之一。
4. **恢复过程:**
- **Binlog:** 使用Binlog进行数据恢复时,需要先从Binlog中找到要恢复的时间点或操作序列,然后将这些操作逐个执行,来还原数据库到指定的状态。
- **Redo Log:** 使用Redo Log进行数据恢复时,可以直接利用Redo Log中记录的数据修改信息来恢复数据库,因为Redo Log记录了对数据库的所有修改操作。
MyBatis
1.#{} 和 ${} 的区别是什么?
#{}
:参数占位符。先被识别成? ,再通过反射找到具体对象的具体值。
${}
:文本替换。${}
中的内容会被直接替换成实际的参数值。
Redis
什么是分布式锁?实现分布式锁的三种方式 - 刘清政 - 博客园 (cnblogs.com)
2.String 和Hash存储对象的区别
1.String存储的是序列化后的完整对象,Hash存储的是对象的字段。
2.缓存相同数量的对象数据,String仅需要一半内存。
Redis 的有序集合底层为什么要用跳表,而不用平衡树、红黑树或者 B+树?
- 平衡树 vs 跳表:平衡树的插入、删除和查询的时间复杂度和跳表一样都是 O(log n)。对于范围查询来说,平衡树也可以通过中序遍历的方式达到和跳表一样的效果。但是它的每一次插入或者删除操作都需要保证整颗树左右节点的绝对平衡,只要不平衡就要通过旋转操作来保持平衡,这个过程是比较耗时的。跳表诞生的初衷就是为了克服平衡树的一些缺点。跳表使用概率平衡而不是严格强制的平衡,因此,跳表中的插入和删除算法比平衡树的等效算法简单得多,速度也快得多。
- 红黑树 vs 跳表:相比较于红黑树来说,跳表的实现也更简单一些,不需要通过旋转和染色(红黑变换)来保证黑平衡。并且,按照区间来查找数据这个操作,红黑树的效率没有跳表高。
- B+树 vs 跳表:B+树更适合作为数据库和文件系统中常用的索引结构之一,它的核心思想是通过可能少的 IO 定位到尽可能多的索引来获得查询数据。对于 Redis 这种内存数据库来说,它对这些并不感冒,因为 Redis 作为内存数据库它不可能存储大量的数据,所以对于索引不需要通过 B+树这种方式进行维护,只需按照概率进行随机维护即可,节约内存。而且使用跳表实现 zset 时相较前者来说更简单一些,在进行插入时只需通过索引将数据插入到链表中合适的位置再随机维护一定高度的索引即可,也不需要像 B+树那样插入时发现失衡时还需要对节点分裂与合并。
RDB VS AOF
AOF(Append Only File)和RDB(Redis DataBase)都是Redis中的持久化方式,它们有着不同的特点和适用场景。
**异同点:**
1. **数据格式**:
- AOF:AOF持久化将Redis执行的写操作以追加的方式记录到AOF文件中,这些写操作以文本格式保存,每个写操作对应一个Redis命令。
- RDB:RDB持久化是一种快照方式,它会定期将Redis中的数据集合以二进制格式保存到磁盘上的RDB文件中。
2. **恢复速度**:
- AOF:AOF持久化的恢复速度相对较慢,因为在恢复数据时需要逐行执行AOF文件中的Redis命令。
- RDB:RDB持久化的恢复速度相对较快,因为在恢复数据时只需要将RDB文件加载到内存中即可。
3. **文件大小**:
- AOF:AOF文件通常比较大,因为它记录了每个写操作的文本形式。
- RDB:RDB文件通常比较小,因为它以二进制格式保存了整个数据集合的快照。
4. **可读性**:
- AOF:AOF文件是可读的,因为它记录了Redis执行的每个写操作的文本形式,方便查看和调试。
- RDB:RDB文件是二进制格式的,不太容易直接查看和理解,但它对于数据的备份和迁移比较方便。
**适用场景:**
- **AOF适用于对数据的实时性要求较高的场景**,例如需要每条写入操作都立即持久化保存到磁盘的情况下,可以选择AOF持久化方式。AOF持久化还可以提供更好的数据恢复粒度,可以尽可能地减少数据丢失。
- **RDB适用于对数据的一致性要求较高的场景**,例如进行备份、数据迁移或者在低IO负载的情况下进行持久化。RDB持久化方式可以快速地生成数据快照,并且生成的快照文件比AOF文件通常更小,因此适合在需要频繁备份数据或者对磁盘空间有限的情况下使用。