- 博客(470)
- 收藏
- 关注
原创 阿里二面:redis分布式锁过期了但业务还没有执行完,怎么办
可以为每个客户端指定一个clientID,在VALUE中增加一个clientID的前缀,这样在续锁的时候,可以判断当前分布式锁的value前缀来确定是不是当前客户端的,如果是再续锁,否则不做处理。:当客户端加锁成功后,可以启动一个定时任务,每隔10s(最好支持配置)来检测业务是否处理完成,检测的依据就是判断分布式锁的key是否还存在,如果存在,就进行续约。加锁的命令,我们参照spring包里的分布式锁代码,如果锁存在并且是当前客户端加的锁,那就续锁,如果锁不存在,则加锁。设置成功返回1,设置失败返回0。
2026-10-19 14:01:49
117
原创 Redis灵魂拷问:如何使用stream实现消息队列
上面的$表示group的offset是队列中的最后一个元素,MKSTREAM这个参数会判断stream是否存在,如果不存在会创建一个我们指定名称的stream,不加这个参数,stream不存在会报错。redis5.0开始引入了stream这个数据结构,stream可以很好地用于消息队列,它支持消息持久化,同时可以记录消费者的位置,即使客户端断开重连,也不会丢失消息。,比如一个stream包括1、2、3、4这4条消息,消费者组内有2个消费者,如果其中一个消费者消费了1、2,则第二个消费者就只能消费3、4了。
2026-10-19 14:01:06
130
原创 Redis灵魂拷问:19图+11题带你面试通关!
bitmap类型使用的数据结构是String,底层存储格式是二进制的bit数组。假如我们有1、4、6、9四个数,保存在bit数组中如下图:在这个bit数组中用10个bit的空间保存了四个整数,占用空间非常小。再回到面试题,我们使用bit数组长度是10亿整数中「(最大值 - 最小值 + 1)」。❝如果有负数,需要进行一个转化,所有数字加最小负数的绝对值。比如,我们转换成,因为数组下标必须从0开始❞。
2026-10-19 13:58:18
134
原创 Redis灵魂拷问:聊一聊bitmap使用?
这样我们创建一个长度为10万的bitmap,每个用户id占一个位,我们定义key为:user:login,number为用户编号。假如一个公司有100个员工,公司要对员工11月份的打卡行为进行统计,我们可以为11月份每一天分配一个bitmap,这个bitmap保存100个bit位,来记录员工的打卡行为。bigmap底层使用的是String的数据结构,而String保存在计算机中的格式是二进制的字节数组,这样bitmap就充分利用了每个字节的bit位,大大节省了内存开销。下面我们看一下bitmap的使用。
2026-10-19 12:15:00
148
原创 Redis灵魂拷问:聊一聊zset使用?
zset使用了压缩列表、跳表的数据结构,并且使用哈希表来保存value:score键值对。range命令得益于底层使用了跳表,复杂度并不高,但是会随着返回元素的数量而增加。zscan命令复杂度很低,但是spring提供的api不友好,超过1000需要分页的时候,就不好用了。元素个数少于1000时使用zscan命令一次取出是最快的。交集并集的复杂度很高,如果有bigkey的情况,会严重阻塞主线程,建议一般不要使用。可以把2个zset的元素取出来,在应用内存中进行交集并集运算,这样不会阻塞redis主线程。
2026-10-19 12:00:00
309
原创 Redis灵魂拷问:为什么响应变慢了?
如果lazyfree-lazy-user-del不设置为yes,redis是否采用异步删除,还是要看删除的时间的,对于底层采用整数数组和压缩列表的情况,redis是不会采用异步删除的,还就就是String类型,所以尽量不要存String类型的bigkey。对bigkey的删除需要释放大量的空间,空闲内存使用一个链表进行管理,释放的过程就是把需要释放的内存块加入这个链表中,如果释放的太多,加入链表的时间会增加,从而影响redis响应性能。另外,如果redis实例很大,也会造成RDB文件太大,从库加载时间长。
2026-10-18 21:48:37
156
原创 Rdis灵魂拷问:聊一聊主从复制缓冲区?
3.增量数据同步时,为了让主从断开后再次连接后不用全量同步,就需要用到offsetrepl_backlog_buffer,这个缓冲区是所有从库共用的,每个从库记录自己的上次断开的offset,再次连接后发给主库就可以继续接收数据了。上面的流程图我们只是考虑了RDB文件的全量同步,我们没有考虑RDB同步给从库的这段时间内主库接收到的写请求,我们也没考虑全量同步完成后增量同步。但是如果环形缓冲区写满了,继续写入就会覆盖之前的命令,如果从库读取慢,从库发送的offset就找不到了,只能进行一次全量同步。
2026-10-18 21:45:33
132
原创 Redis灵魂拷问:聊一聊AOF日志重写?
auto-aof-rewrite-percentage 100 #AOF文件大小较上次重写超过100%时进行重写auto-aof-rewrite-min-size 64mb #aof文件大小超过64m时重写OKOKOKOKOKOK"12345678"这2个key的值被赋予了最新的一次赋值,虽然我们执行了6条命令,但是AOF重写后日志文件就剩了最后2条命令。
2026-10-18 21:43:35
161
原创 Redis灵魂拷问:聊一聊redis底层数据结构?
redis处理hash冲突的方法使用的是链表法,即如果2个key的hashcode一样,则在同一个hash桶中用一个链表组织起来,链表查找的时间复杂度是o(n),所以当hash桶中的元素越来越多时,查找性能会下降。对于redis的list数据类型,它用到了压缩列表和双向链表,时间复杂度是o(n),我们做随机读写是不太合适的,但是pop和push效率高,作为队列是很好的选择。redis能具有很好的性能表现,一个重要的原因就是redis底层的数据结构的使用非常巧妙,今天,我们来聊一聊这些数据结构。
2026-10-18 21:42:11
197
原创 Redis灵魂拷问:怎样搭建一个哨兵主从集群?
本文主要讲述了redis哨兵主从集群的搭建,这个过程中要注意一些参数的设置。搭建好集群后就可以做各种试验了。
2026-10-18 21:40:43
185
原创 面试官:什么是回表,什么是索引下推?
使用 MySQL 时,我们经常会听到“回表”、“索引下推”这样的概念,今天就来聊一聊什么是回表,什么是索引下推。
2026-10-16 20:38:03
138
原创 面试官:MySQL 执行计划都有哪些属性?分别是什么含义?
本文对 MySQL 执行计划中的属性进行了详细介绍,使用执行计划优化 SQL 时,关注下面几点:查看 type 避免全表扫描 ALL 和全索引扫描 index,尽量能使用 const, eq_ref, ref, range。查看 key 是否使用了合适的索引。查看 rows 是否过大,结合 filtered 估算最终结果集大小。查看 Extra,避免使用 Using temporary 和 Using filesort,尽量使用 Using index(覆盖索引)。
2026-10-16 20:37:25
57
原创 面试官:MySQL 为什么要是使用 MVCC?原理是什么?
MVCC 是 MySQL 中非常重要的一个并发优化,从事务隔离级别、版本链、ReadView 这几个方面着手,很容易理解 MVCC 的原理。
2026-10-16 20:36:38
87
原创 面试官:什么是快照读?什么是当前读?有什么区别?
当前读和快照读的区别总结如下:差异点快照读当前读数据版本基于快照,不一定最新最新提交版本是否加锁不加加锁一致性可能有不一致情况强一致并发性强可能有阻塞实现原理MVCC数据库锁适用隔离级别可重复读、读已提交全部对于简单的数据查询,不要求查询最新提交数据,可以考虑使用快照读。如果要求读取到最新提交数据,那就考虑使用当前读。
2026-10-16 20:35:44
139
原创 腾讯一面:如何停止一个正在运行的线程?
来判断thread对象所代表的线程是否停止,但从控制台打印的结果来看,线程并未停止,这也证明了interrupted()方法的解释,测试当前线程是否已经中断。我们先来看看this.interrupted()方法的解释:测试当前线程是否已经中断,当前线程是指运行this.interrupted()方法的线程。由于stop()方法以及在JDK中被标明为“过期/作废”的方法,显然它在功能上具有缺陷,所以不建议在程序张使用stop()方法。上面的示例虽然停止了线程,但如果for语句下面还有语句,还是会继续运行的。
2026-10-16 20:30:41
86
原创 面试官:什么是快照读?什么是当前读?有什么区别?
当前读和快照读的区别总结如下:差异点快照读当前读数据版本基于快照,不一定最新最新提交版本是否加锁不加加锁一致性可能有不一致情况强一致并发性强可能有阻塞实现原理MVCC数据库锁适用隔离级别可重复读、读已提交全部对于简单的数据查询,不要求查询最新提交数据,可以考虑使用快照读。如果要求读取到最新提交数据,那就考虑使用当前读。
2026-10-15 21:50:42
48
原创 面试官:MySQL 为什么要是使用 MVCC?原理是什么?
MVCC 是 MySQL 中非常重要的一个并发优化,从事务隔离级别、版本链、ReadView 这几个方面着手,很容易理解 MVCC 的原理。
2026-10-15 21:50:22
218
原创 面试官:MySQL BETWEEN AND 语句包括边界吗?
BETWEEN AND 语句是包括边界值的,是一个前闭后闭的区间。BETWEEN A AND B 等价于 >= A AND <= B。注意时间类型的字段,DATETIME 和 TIMESTAMP,如果采用日期格式来查询,结果是前闭后开的区间。BETWEEN A AND B 等价于 >= A AND < B。为了避免漏掉数据,datetime 和 timestamp 使用日期做范围查询,可以在后面的日期上加 1 天。
2026-10-15 21:50:12
189
原创 面试官:MySQL Redo Log 和 Binlog 有什么区别?分别用在什么场景?
从前面介绍可以看到,Redo Log 是存储引擎层控制的日志,事实上,Redo Log 是 InnoDB 存储引擎特有的日志,它是一个物理日志, 记录了在某个数据页上做了哪些修改,主要用于崩溃恢复。0:事务提交时,Redo Log 不会被立刻被写入磁盘,而是存在缓存中(Redo Log Buffer),InnoDB 后台日志线程每秒将日志从缓冲区写入文件系统缓存(Page Cache),然后调用 fsync 落盘。
2026-10-15 21:50:01
249
原创 面试官:什么是 Next-Key Lock?作用是什么?
Next-Key Lock 是 InnoDB 引擎行锁加间隙锁的组合,它锁住的是一个前开后闭的区间,消除了 REPEATABLE READ 隔离级别下的幻读问题。理解 Next-Key Lock 要把握两点:可重复隔离级别下才会生效;锁住一个前开后闭的区间,但一定条件下可能退化成行锁或者间隙锁。
2026-10-15 21:49:51
280
原创 面试官:为什么高性能场景选用 PostgresSQL 而不是 MySQL?
MySQL声称自己是最流行的开源数据库,它属于最流行的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。LAMP中的M指的就是MySQL。构建在LAMP上的应用都会使用MySQL。MySQL最初是由MySQL AB开发的,然后在2008年以10亿美金的价格卖给了Sun公司,Sun公司又在2010年被Oracle收购。Oracle收购导致MySQL的出现两个版本:商业版和社区版。
2026-10-14 14:34:24
182
原创 从 MySQL 迁移到 GoldenDB,这个参数记得改!
开启 ANSI_QUOTES 后,双引号 (") 被解释为标识符引号,作用与反引号 (`) 相同,用于引用数据库、表、字段等名称。例如下面 SQL 中的 name 被解释为列名,而 my_table 被解释为表名。ANSI_QUOTES 是 MySQL 数据库中的 SQL 模式选项,用于调整标识符与字符串常量的引用规则,使其符合 ANSI SQL 标准。这个配置开启,对于 SQL 规范化和数据库迁移很有帮助。
2026-10-14 14:34:10
78
原创 面试官:PostgreSQL 为什么不选择 B+ 树索引?
PostgreSQL 索引对 B- 树进行了改造。改造后的索引结构如下图:上图的索引结构中最顶层是元数据页,存储索引根节点页相关信息。内部节点位于根节点下面,只包含键值和指向子页面的指针。叶子页位于最下面一层,存储所有指向实际表数据行(TIDs)的指针。什么是 TID?PostgreSQL 采用堆表存储,数据独立于索引存储在一个无序的结构中。数据行插入时,数据库会找到一个空闲的空间来存放它,并记录一个唯一的物理地址,称为 TID,由页号和行指针组成。
2026-10-14 14:33:56
329
原创 面试官:MySQL 内存飙升,可能是什么原因?
本文讲述了导致 MySQL 内存升高的主要原因,除了 InnoDB buffer pool 外,其他配置都是会话级别的。业务量突增、SQL 编写不规范等,都可能造成 MySQL 内存升高。
2026-10-14 14:33:42
184
原创 面试官:MySQL Redo Log 和 Undo Log 有什么区别?分别用在什么场景?
MySQL 有三大日志体系,Redo Log、Undo Log 和 Binlog,其中 Undo Log 和 Redo Log 都是 InnoDB 存储引擎特有的日志。今天就来聊一聊 MySQL Redo Log 和 Undo Log 的区别。
2026-10-14 14:33:27
201
原创 面试官:MySQL执行计划出现 Using filesort 可能是什么原因?该怎样进行优化?
当执行计划的 Extra 属性出现 Using filesort 时,大概率我们的 SQL 需要优化了。可能查看 SQL 属于那种情况,针对性地进行优化。
2026-10-10 13:00:00
308
原创 面试官:PostgreSQL的MVCC是怎样实现的?
PostgreSQL 基于数据库表存储历史版本的方式实现了 MVCC,这种实现方式的优点是读取历史版本更加方便,不用像 MySQL 那样依赖额外的 Undo Log 存储。缺点是在高并发的场景下,数据库表会保存大量的过期 tuple(dead tuples),可能会导致表膨胀。PostgreSQL 使用 VACUUM 机制清理过期的 tuple 数据,步骤包括识别过期 tuple、清理过期 tuple、标记过期 tuple 空间可重用、更新系统统计信息。
2026-10-10 12:45:00
428
原创 面试官:数据库怎样保存 IP 地址?
主流数据库一般不推荐直接使用 VARCHAR 类型来存储 IP 地址,而是提供了内置的类型和函数,存储和查询效率更高。
2026-10-10 12:30:00
366
原创 面试官:如果你是架构师,PostgreSQL 和 MySQL 你选择哪个?
PostgreSQL 确实在多个方面比 MySQL 具有优势,但是大多数的场景,MySQL 也能满足。除了技术方面,也要结合其他非技术的因素综合考虑。
2026-10-10 12:15:00
368
原创 面试官:MySQL in 语句为什么要限制参数数量?
在 MySQL 中使用 in 语句时,要注意 MySQL Server 端的限制,同时要考虑对内存和性能的影响。可以使用业务代码中拆分 SQL 和使用临时表的方法进行优化。
2026-10-10 12:00:00
348
原创 面试官:什么是数据库范式?什么是反范式?有什么优缺点?
设计数据库表结构时,数据库范式是我们经常考虑的策略。但往往很多时候,我们会违反范式,以获得更好的性能。今天来聊一聊这个话题。
2026-10-09 13:00:00
255
原创 面试官:如果你是架构师,GoldenDB 和 openGauss 选择哪个?
GoldenDB 和 openGauss 虽然都是非常典型的国产数据库,但他们的定位有明显的区别,选型时需要根据实际的业务场景、成本预算、团队情况、监管要求等方面来做选择。
2026-10-09 12:45:00
310
原创 面试官:MySQL 空值字段应该保存 NULL 还是默认值?
使用 MySQL 数据库时,对于一个可以为空的字段,如果没有值,应该保存 NULL 还是给一个默认值呢?多数时候我们不太注意,有时候不赋值,直接保存 NULL,有时候赋值一个业务指定的默认值。今天来聊一聊这个话题。
2026-10-09 12:30:00
375
原创 面试官:MySQL 分区表和分表有什么区别?分别适合什么场景?
MySQL 分表和分区表本质上解决都是单表数据量过大导致的性能问题。分区表通过分区过滤的方式来减少查询数据量,分表则通过单表操作提升性能。对于架构上已经使用分库分表的情况,采用分表是最好的选择。如果架构上没有采用分库分表,又不想有太高的维护成本,可以选择使用分区表。对于分区表,一定要考虑分区键的选择,保证数据分布均匀,减少跨区查询的可能。对于分表,则要多考虑各个表之间的数据一致性问题。
2026-10-09 12:15:00
356
原创 面试官:MySQL 的 MyISAM 和 InnoDB 索引结构都使用了 B+树,有什么区别呢?
虽然 MyISAM 和 InnoDB 存储引擎使用的索引都是 B+ 树,但索引结构完全不同,一个是聚集索引,一个是非聚集索引。
2026-10-09 12:00:00
314
原创 如何用Redis实现分布式锁?
分布式锁的使用场景其实很多,我主要遇到以下场景:在服务集群中执行定时任务,我们希望只有一台机器去执行,就需要用到分布式锁,只有拿到锁的机器,才能执行该定时任务;当外部请求打到集群中时,比如该请求是对订单进行操作,为了避免请求重入,我们需要在入口加上订单维度的分布式锁。
2026-10-08 13:00:00
309
原创 【消息队列】原理初探之RocketMQ
RocketMQ是一个纯Java、分布式、队列模型的开源消息中间件,前身是MetaQ,是阿里参考Kafka特点研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目,具有高性能、高可靠、高实时、分布式特点。
2026-10-08 12:30:00
192
原创 【消息队列】 原理初探之RabbitMQ
消费者订阅队列的时候,可以指定autoAck参数,当autoAck为true的时候,RabbitMQ采用自动确认模式,RabbitMQ自动把发送出去的消息设置为确认,然后从内存或者硬盘中删除,而不管消费者是否真正消费到了这些消息。DLX也是一个正常的交换器,和一般的交换器没有区别,他能在任何的队列上面被指定,实际上就是设置某个队列的属性。延迟队列就是进入该队列的消息会被消费者延迟消费,延迟队列中存储的对象是的延迟消息,“延迟消息”是指当消息被发送以后,等待特定的时间后,消费者才能拿到这个消息进行消费。
2026-10-08 12:15:00
359
原创 【消息队列】原理初探之Kafka
在 Kafka 中,我们把产生消息的那一方称为生产者,比如我们经常回去淘宝购物,你打开淘宝的那一刻,你的登陆信息,登陆次数都会作为消息传输到 Kafka 后台,当你浏览购物的时候,你的浏览信息,你的搜索指数,你的购物爱好都会作为一个个消息传递给 Kafka 后台,然后淘宝会根据你的爱好做智能推荐,致使你的钱包从来都禁不住诱惑,那么这些生产者产生的消息是怎么传到 Kafka 应用程序的呢?也就是说,在重平衡期间,消费者组中的消费者实例都会停止消费,等待重平衡的完成,而且重平衡这个过程很慢......
2026-10-08 12:00:00
253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅