MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?回答重点
Delete 用于删除行数据,但保留表结构和相关的对象。
Drop 用于完全删除数据库表,包括数据和结构。
Truncate 只删除数据,不会删除表结构和索引等其他结构。
从性能来看,Drop > Truncate > Delete
扩展知识Delete本质上这个删除其实就是给数据行打个标记...
MySQL 三层 B+ 树能存多少数据?回答重点在 MySQL 的 InnoDB 存储引擎中,B+ 树默认数据页大小为 16KB。
参数:
每个节点页大小为 16KB(即 16384 字节)。
假设每个数据记录的主键和数据大小为 1KB(一般会比这个小,但这里取整方便计算)。
每个内部节点(非叶子节点)存储的是指向子节点的指针和索引键。
三层 B+ 树的存储计算:
叶子节点:第三层为...
MySQL 中 INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别是什么?回答重点INNER JOIN:
只返回两个表中匹配的行。如果没有匹配,则该行不会出现在结果集中。
适用于只关心交集数据的场景。
LEFT JOIN(或 LEFT OUTER JOIN):
返回左表中的所有行,即使右表中没有匹配的行。如果右表没有匹配,则结果中的右侧列会显示为NULL。
适用...
MySQL 事务的二阶段提交是什么?回答重点MySQL 事务的二阶段提交是指在 MySQL 中,为了确保redo log(重做日志)和 binlog(二进制日志)之间的一致性,使用的一种机制。MySQL 通过二阶段提交来保证在crash recovery(崩溃恢复)时,不会出现数据丢失或数据不一致的情况。
二阶段提交的两个阶段:
准备阶段(Prepare Phase):在事务提交时,MyS...
MySQL 在设计表(建表)时需要注意什么?回答重点设计表的时候,在满足业务需求的情况下,需要额外考虑表结构的高效性、扩展性以及维护性。
1)选择合适的数据类型:为字段选择合适的数据类型可以有效减少存储空间,并提高查询效率。例如:
使用 INT 而不是 BIGINT,前提是如果数据不会超出 INT 范围。
使用 VARCHAR 而不是 TEXT,如果字段长度比较短且可变。
使用 DATE、...
Redis 通常应用于哪些场景?回答重点1)缓存:
Redis 最常用的场景是作为缓存层,以减少数据库的负载,提高数据读取速度。例如,常用的用户会话数据和页面渲染结果可以存储在 Redis 中。
2)实时系统:
Redis 支持快速的数据写入和读取,非常适合用于实时分析,如网站点击统计、实时排行榜等。
3)消息队列:
利用 Redis 的 List 和 Pub/Sub 功...
说说 Redisson 分布式锁的原理?回答重点Redisson 是基于 Redis 实现的分布式锁,实际上是使用 Redis 的原子操作来确保多线程、多进程或多节点系统中,只有一个线程能获得锁,避免并发操作导致的数据不一致问题。
1)锁的获取:
Redisson 使用 Lua 脚本,利用 exists + hexists + hincrby 命令来保证只有一个线程能成功设置键(表示获得锁...
Redis 为什么这么快?回答重点主要有 3 个方面的原因,分别是存储方式、优秀的线程模型以及 IO 模型、高效的数据结构。
Redis 将数据存储在内存中,提供快速的读写速度,相比于传统的磁盘数据库,内存访问速度快得多。
Redis 使用单线程事件驱动模型结合 I/O 多路复用,避免了多线程上下文切换和竞争条件,提高了并发处理效率。
Redis 提供多种高效的数据结构(如字符串...
为什么 Redis 设计为单线程?6.0 版本为何引入多线程?回答重点单线程设计原因:
Redis 的操作是基于内存的,其大多数操作的性能瓶颈主要不是 CPU 导致的
使用单线程模型,代码简便的同时也减少了线程上下文切换带来的性能开销
Redis 在单线程的情况下,使用 I/O 多路复用模型就可以提高 Redis 的 I/O 利用率了
6.0 版本引入多线程的原因:
...
Redis 中跳表的实现原理是什么?回答重点跳表主要是通过多层链表来实现,底层链表保存所有元素,而每一层链表都是下一层的子集。
插入时,首先从最高层开始查找插入位置,然后随机决定新节点的层数,最后在相应的层中插入节点并更新指针。
删除时,同样从最高层开始查找要删除的节点,并在各层中更新指针,以保持跳表的结构。
查找时,从最高层开始,逐层向下,直到找到目标元素或确定元素不存在。查找效率高,时...
Redis 的 hash 是什么?回答重点Redis 的 hash 是一种键值对集合,可以将多个字段和值存储在同一个键中,便于管理一些关联数据。特点如下:
适合存储小数据,使用哈希表实现,能够在内存中高效存储和操作。
支持快速的字段操作(如增、删、改、查),非常适合存储对象的属性。
扩展知识hash 常用命令HSET:设置 hash 中指定字段的值。
1HSET user:1001 na...
Redis 中常见的数据类型有哪些?回答重点Redis 常见的数据结构主要有五种,这五种类型分别为:String(字符串)、List(列表)、Hash、Set(集合)、Zset(有序集合,也叫sorted set)。
String字符串是Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。
使用场景:
缓存:存储临时数据,如用户会话、...
Redis 支持事务吗?如何实现?回答重点Redis 支持事务,但它的事务与 MySQL 中的事务有所不同。MySQL 中的事务主要支持 ACID 的特性,而 Redis 中的事务主要保证的是多个命令执行的原子性,即所有的命令在一个原子操作中执行,不会被打断。
还有一个很重要的点,就是 MySQL 中的事务是支持回滚的,而 Redis 中的事务是不支持回滚的。
扩展知识Redis 的事务Re...
Redis 和 Memcached 有哪些区别?回答重点从数据结构上:
Redis:支持多种数据结构,如字符串、列表、集合、有序集合和哈希表,适合存储复杂数据类型。
Memcached:仅支持简单的键值对存储,数据结构较为单一。
从持久化上:
Redis:支持持久化功能,可以将数据保存在磁盘上,通过 RDB 和 AOF 两种方式实现数据的持久化。
Memcached:不支持数据持久化,...
Redis 数据过期后的删除策略是什么?回答重点Redis 数据过期主要有两种删除策略,分别为定期删除、惰性删除两种:
定期删除:Redis 每隔一定时间(默认是 100 毫秒)会随机检查一定数量的键,如果发现过期键,则将其删除。这种方式能够在后台持续清理过期数据,防止内存膨胀。
惰性删除:在每次访问键时,Redis 检查该键是否已过期,如果已过期,则将其删除。这种策略保证了在使用过程中只...
Redis 中有哪些内存淘汰策略?回答重点Redis 的内存淘汰策略一共有 8 种。 8 种里面可以细分为两大类,即开启数据淘汰和不开启数据淘汰两大类,然后开启数据的那一类又可以进行细分,分为基于过期时间的淘汰策略以及全部数据的淘汰策略。
不淘汰数据(默认):
noeviction:当运行内存超过最大设置内存的时候,不会淘汰数据,而是直接返回报错禁止写入
设置了过期时间的数据淘汰:
v...
Redis 的 Lua 脚本功能是什么?如何使用?回答重点Redis 的 Lua 脚本功能允许用户在 Redis 服务器端执行自定义的 Lua 脚本,以实现原子操作和复杂逻辑。其核心点包括:
原子性:Lua 脚本的所有命令在执行过程中是原子的,避免了并发修改带来的问题。
减少网络往返次数:通过在服务器端执行脚本,减少了客户端和服务器之间的网络往返次数,提高了性能。
复杂操作:可以在 Lua...
Redis 的 Pipeline 功能是什么?回答重点Redis 的 Pipeline 功能允许客户端在一次网络请求中批量发送多个命令,以减少网络延迟并提高性能。通过将多个命令打包发送,客户端可以在不等待每个命令响应的情况下继续发送其他命令,从而显著提高吞吐量。
好处:
节省了网络传输时间
减少了 Redis 服务端上下文切换带来的开销
扩展知识与事务的区别
Pipeline 并不保证命...
Redis 中的 Big Key 问题是什么?如何解决?回答重点Redis 中的 “big Key” 是指一个内存空间占用比较大的键(Key),它有什么危害呢?
内存分布不均。在集群模式下,不同 slot 分配到不同实例中,如果大 key 都映射到一个实例,则分布不均,查询效率也会受到影响。
由于 Redis 单线程执行命令,操作大 Key 时耗时较长,从而导致 Redis 出现其它命令阻...
如何解决 Redis 中的热点 key 问题?回答重点Redis 中的热点 Key 问题是指某些 Key 被频繁访问,导致 Redis 的压力过大,进而影响整体性能甚至导致集群节点故障。
解决热点 Key 问题的主要方法包括:
热点 key 拆分:将热点数据分散到多个 Key 中,例如通过引入随机前缀,使不同用户请求分散到多个 Key,多个 key 分布在多实例中,避免集中访问单一 Key...
Redis 的持久化机制有哪些?回答重点Redis 提供两种主要的持久化机制:
RDB(Redis Database)快照:
RDB 是通过生成某一时刻的数据快照来实现持久化的,可以在特定时间间隔内保存数据的快照。
适合灾难恢复和备份,能生成紧凑的二进制文件,但可能会在崩溃时丢失最后一次快照之后的数据。
AOF(Append Only File)日志:
AOF 通过将每个写操作追加到日...
Redis 在生成 RDB 文件时如何处理请求?回答重点在 Redis 生成 RDB 文件时是异步的(使用 bgsave 命令),采用了 fork 子进程的方式来进行快照操作。生成 RDB 文件的过程由子进程执行,主进程继续处理客户端请求,所以可以保证 Redis 在生成快照的过程中依然对外提供服务,不会影响正常请求。
扩展知识生成 RDB 文件的时候,数据可以修改吗?当然可以。主进程会正常...
Redis 主从复制的实现原理是什么?回答重点Redis 的主从复制是指一个 Redis 实例(主节点)可以将数据复制到一个或多个从节点(从节点),从节点从主节点获取数据并保持同步。
复制流程:
开始同步:从节点通过向主节点发送 PSYNC 命令发起同步。
全量复制:如果是第一次连接或之前的连接失效,从节点会请求全量复制,主节点将当前数据快照(RDB文件)发送给从节点。
增量复制:全量复制...
Redis 的哨兵机制是什么?回答重点Redis 的哨兵机制(Sentinel) 是一种高可用性解决方案,用于监控 Redis 主从集群,自动完成主从切换,以实现故障自动恢复和通知。
主要功能包括:
监控:哨兵不断监控 Redis 主节点和从节点的运行状态,定期发送 PING 请求检查节点是否正常。
自动故障转移:当主节点发生故障时,哨兵会选举一个从节点提升为新的主节点,并通知客户端更新主...
Redis 集群的实现原理是什么?回答重点Redis 集群(Redis cluster)是通过多个 Redis 实例组成的,每个实例存储部分的数据(即每个实例之间的数据是不重复的)。
具体是采用哈希槽(Hash Slot)机制来分配数据,将整个键空间划分为 16384 个槽(slots)。每个 Redis 实例负责一定范围的哈希槽,数据的 key 经过哈希函数计算后对 16384 取余即可定...
Redis 的订阅发布功能是什么?你了解吗?回答重点Redis 的订阅发布功能(Publish/Subscribe,简称 Pub/Sub),是一种消息通信机制,用于在不同客户端之间实现消息的实时传递和广播。使用 Pub/Sub 模型,客户端可以订阅一个或多个频道,当有其他客户端向这些频道发布消息时,所有订阅了该频道的客户端都会立即收到消息。
主要功能包括:
发...
Redis 中如何实现分布式锁?回答重点在 Redis 中实现分布式锁的常见方法是通过set ex nx 命令 + lua 脚本组合使用。确保多个客户端不会获得同一个资源锁的同时,也保证了安全解锁和意外情况下锁的自动释放。
扩展知识理解 Redis 实现的分布式锁如果基于 Redis 来实现分布锁,需要利用 set ex nx 命令 + lua 脚本。
1)加锁:SET lock_key u...
分布式锁在未完成逻辑前过期怎么办?回答重点若锁在未完成逻辑前就过期,此时可能会产生数据不一致的问题。因为锁过期了,此时如果再出现一个客户端争抢锁,即可拿到锁然后同时进行业务操作,这等于锁失效了。
此时可以在逻辑执行过程中定期续期锁,确保锁在处理过程中不会过期。
扩展知识看门狗机制业界出了一个看门狗机制来防止这种情况的产生。
理论很简单,在抢到锁之后,后台会有一个任务,定时向 redis...
Redis 集群会出现脑裂问题吗?回答重点Redis 集群存在脑裂问题的风险,特别是在网络分区的情况下,可能会导致同一集群内出现多个主节点,导致数据不一致。
扩展知识什么是脑裂脑裂是指在分布式系统中,由于网络分区或其他问题导致系统中的多个节点(特别是主节点)误以为自己是唯一的主节点。这种情况会导致多个主节点同时提供写入服务,从而引起数据不一致。
分布式系统就像一个团队在干活,如果发生了脑裂,...
Redis 实现分布式锁时可能遇到的问题有哪些?回答重点
业务未执行完,锁已到期
单点故障问题
主从问题不同步问题
网络分区问题
时钟漂移问题
锁的可重入性问题
误释放锁问题
扩展知识业务未执行完,锁已到期为了避免持有锁的客户端崩溃或因网络问题断开连接时,锁无法被正常释放,需要给锁设置过期时间。
那么就有可能出现业务还在执行,锁已到期的情况。
可以设置一种续约机制(Redisson 中的看...