美团财务科技后端一面:如何保证数据一致性?延时双删第二次失败如何解决?

更多大厂面试内容可见 -> http://11come.cn

美团财务科技后端一面:项目内容拷打

美团财务科技后端一面:项目相关面试题,主要包含 Zset、延时双删失败重试、热点数据解决、ThreadLocal 这几个方面相关的内容

由于前几个问题是对个人项目的介绍,根据自己项目进行回答即可

是个人进行项目开发的吗?

如何进行系统设计的?

项目是否已经上线?

在项目开发中遇到的难点?如何解决?

项目开发过程中有什么收获?

Zset 底层数据结构,为什么要用Zset?

Zset 的底层实现是:压缩列表 + 跳表

什么时候使用压缩列表?

  • 有序集合保存的元素个数小于 128 个
  • 有序集合保存的所有元素成员的长度都必须小于 64 字节

否则使用跳表

跳表在 Redis 中的作用就是作为有序集合类型的底层数据结构,

跳表中每个节点保存着其他节点的指针,高层的指针越过的元素数量大于等于低层的指针,因此在跳表中,在查找元素时可以一次跳过多个节点,当找到大于或等于目标元素的节点后,再使用普通指针开始移动(可以向后移动,也可以向前移动,跳表含有前边节点的指针)寻找目标元素,跳表可以在 O(logn) 的时间内遍历跳表

跳表结构图:

1697874023019

至于为什么要用 Zset 结合自己的项目说的合理即可

你如何保证缓存与数据库一致性,延时双删的第二次删除缓存失败了呢,如何解决?

这个要看延时双删具体如何实现了,先说一下它的流程:

用户发起更新数据的请求
1、删除数据对应缓存
2、更新数据库
3、休眠一段时间(等待数据库更新完毕之后)
4、再次删除数据对应缓存

这里要休眠一段时间等待第二次删除缓存,因此可以通过 Redisson 的延时队列来做,将第二次删除缓存的信息发送到延时队列中,等待被消费

在消费的时候可以去对失败操作进行处理,从延时队列中取出消息进行消费,如果失败了,可以进行指定次数的重试,如果只是因为网络抖动失败,那么一般重试就可以成功消费了,但是如果是 Redis 出现了问题,那么这一段时间内重试可能都还会存在问题,因此要考虑将失败的消息给放在数据库中存储起来,再定时进行消费对失败的消息进行补偿(不过 Redis 宕机的概率很小,一般不会发生)

上边是个人思路,如有不足欢迎补充

Redis 如何存储热点数据?

热点数据就是某些数据访问频率过高

首先对于热点数据要先可以检测到,检测之后再看具体如何解决

检测的话,可以使用京东零售开源的 hotkey 框架,是一个轻量级通用热 key 探测中间件,可以快速将热数据推送到 JVM 内存,减少大量请求对下游服务、Redis、MySQL 的冲击

那么热点数据的存储的话,可以存储一份到 JVM 内存中,进一步提升数据的查询性能,可以选用 Caffeine (Java 高性能缓存库)来管理 Redis 的热点数据,Caffeine 是基于 Google Guava 改进的,因此 Caffeine 的性能表现、缓存命中率相对来说更好

项目为什么要用 ThreadLocal?ThreadLocal 如何保证线程隔离的?

项目为什么要用 ThreadLocal ,这个可以基于 ThreadLocal 的特性来回答

在多线程环境下,有些数据是你当前线程上下文中要使用到的,但是如果每次调用方法都将这些数据传递过去,或者每次使用的时候都重新过去是比较麻烦的,并且也会带来一定的时间开销,因此可以存储在 ThreadLocal 中,在当前线程的上下文中进行使用

这样在用到数据的时候,直接从 ThreadLocal 中取出来,既保证了线程之间的数据隔离性,又保证了较好的性能(不必重复去获取)

ThreadLocal 如何保证线程隔离的?

如下图,在每一个线程 Thread 中都会定义一个 ThreadLocalMap 属性,该属性就存储 ThreadLocal 所对应的值,那么每个线程中都有一份 ThreadLocalMap 的变量,以此来实现线程隔离

ThreadLocal保证线程之间数据隔离

扩展:ThreadLocal 正确使用姿势

ThreadLocal 的使用规范:将 ThreadLocal 变量定义为 private static final ,并且在使用完,记得通过 try finally 来 remove 掉,避免出现脏数据

扩展:ThreadLocal 内存泄漏问题

ThreadLocal的内存泄漏问题

这里假设将 ThreadLocal 定义为方法中的局部变量,那么当线程进入该方法的时候,就会将 ThreadLocal 的引用给加载到线程的栈 Stack 中

如上图所示,在线程栈 Stack 中,有两个变量,ThreadLocalRef 和 CurrentThreadRef,分别指向了声明的局部变量 ThreadLocal ,以及当前执行的线程

而 ThreadLocalMap 中的 key 是弱引用,当线程执行完该方法之后,Stack 线程栈中的 ThreadLocalRef 变量就会被弹出栈,因此 ThreadLocal 变量的强引用(ThreadLocalRef)消失了,那么 ThreadLocal 变量只有 Entry 中的 key 对他引用,并且还是弱引用,因此这个 ThreadLocal 变量会被回收掉,导致 Entry 中的 key 为 null,而 value 还指向了对 Object 的强引用,因此 value 还一直存在 ThreadLocalMap 变量中

由于 ThreadLocal 被回收了,无法通过 key 去访问到这个 value,导致这个 value 一直无法被回收, ThreadLocalMap 变量的生命周期是和当前线程的生命周期一样长的,只有在当前线程运行结束之后才会清除掉 value,因此会导致这个 value 一直停留在内存中,导致内存泄漏

当然 JDK 的开发者想到了这个问题,在使用 set get remove 的时候,会对 key 为 null 的 value 进行清理,使得程序的稳定性提升。

当然,我们要保持良好的编程习惯,在线程对于 ThreadLocal 变量使用的代码块中,在代码块的末尾调用 remove 将 value 的空间释放,防止内存泄露。

ThearLocal 内存泄漏的根源是:

由于 ThreadLocalMap 的生命周期跟 Thread 一样长,如果没有手动删除对应 key 就会导致内存泄漏

ThreadLocal 正确的使用方法:

  • 每次使用完 ThreadLocal 都调用它的 remove() 方法清除数据
  • 将 ThreadLocal 变量定义成 private static final,这样就一直存在 ThreadLocal 的强引用,也能保证任何时候都能通过 ThreadLocal 的弱引用访问到 Entry 的 value 值,进而清除掉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ STL 容器 list

目录 1. list 对象2. list 迭代器2.1 实现2.2 迭代器失效 本文测试环境为 gcc 13.1 1. list 对象 std::list 底层是一个双向循环链表 list 对象本身包含一个头节点,通过指针指向元素节点,节点定义如下 头节点 header 和元素节点 node 都继承于基类 no…

历史遗留问题1-Oracle Mysql如何存储数据、索引

在学习到Oracle redo和undo时,涉及到很多存储结构的知识,但是网上的教程都不是很详细,就去复习了一下mysql,感觉是不是开源的问题,Mysql的社区和知识沉淀远高于Oracle, 对于初学者很友好,我想请…

2025考研数学武忠祥强化班视频,百度网盘课程+讲义PDF更新

25考研的小伙伴们现在应该基础都学习的差不多了吧! 是时候进入强化阶段的学习啦。 2025考研数学强化班全程网盘:https://pan.baidu.com/s/1Z029fuCLkyyhIRFqd5QKcg 提取码:p3ue 晚上好,聊聊17堂课的看课攻略。 今年的17堂课还…

IP-guard WebServer 权限绕过漏洞复现(QVD-2024-14103)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

Mac下brew安装php7.4

这里作者挂了梯子,所以很流畅! brew的下载,可参考另外一篇博文~Homebrew 安装与卸载 1、将第三方仓库加入brew brew tap shivammathur/php2、安装指定版本的PHP brew install php7.43、替换Mac自带PHP环境并刷新环境变量 -> …

【ACM列表推荐会议 | EI稳定检索】2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)

2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024) 2024 4th International Conference on Artificial Intelligence, Automation and High Performance Computing 2024第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)将于20…

【网站项目】新生报到系统小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

局域网MongoDB的数据库访问不了

局域网MongoDB的数据库访问不了 确认bindIp: 0.0.0.0后,仍然是访问不了,查询资料发现是windows自带防火墙的问题 进入到 允许其他应用,选择mongod.exe的位置 这样就好了。

【电路笔记】-数字逻辑门总结

数字逻辑门总结 文章目录 数字逻辑门总结1、概述2、逻辑门真值表3、总结 数字逻辑门有三种基本类型:与门、或门和非门。 1、概述 我们还看到,数字逻辑门具有与其相反或互补的形式,分别为“与非门”、“或非门”和“缓冲器”,并且…

ansible进阶-剧本调试方法

目录 1、调试方法 2、实例 2.1 Debug模块 2.2 tags标签 2.3 忽略错误 1、调试方法 具体方法应用场景debug标签执⾏剧本的时候输出剧本的执⾏流程,⼀般配合register⼀起使⽤. 输出facts变量自定义变量tags标签给⼀些模块加上标签,运⾏剧本的时候可以运⾏指定标签的…

OpenHarmony UI动画-rebound

简介 rebound是一个模拟弹簧动力学,用于驱动物理动画的库。 下载安装 ohpm install ohos/reboundOpenHarmony ohpm环境配置等更多内容,请参考如何安装OpenHarmony ohpm 使用说明 import rebound from ohos/rebound;功能一:创建维护弹簧对…

MySQL 锁机制全面解析

目录 1. MySQL的锁类型1.1 全局锁1.2 表锁1.3 行锁1.4 共享锁(读锁)1.5 排它锁(写锁)1.6 死锁 2 乐观锁和悲观锁2.1 乐观锁2.2 悲观锁 3 意向锁4 间隙锁5 临键锁6. 事务隔离级别对锁的影响6.1 读未提交(Read Uncommitt…

3ds Max2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 3ds Max是一款基于PC系统的强大3D建模、渲染和制作软件,广泛应用于游戏开发、影视后期制作、建筑设计、工业设计等多个领域。其拥有丰富的建模工具,可轻松创建逼真的三维场景和模型;同时&#…

OpenMesh 极小曲面(局部迭代法)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 我们的目标是想得到一个曲率处处为0的曲面,具体操作如下所述: 二、实现代码 #define _USE_MATH_DEFINES #include

Linux 操作系统gdb、makefile

今天是对前面两天的补充和完善。 1、gdb 1.1 gdb 作用 调试程序 1.2 调试bug的步骤 测试:发现问题 固化:让bug重现 定位:找到bug的位置 修改:修改bug 验证 1.3 gdb调试工具的使用 1->想要使用gdb调试工具,在编…

【网站项目】自习室预约系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

汽车充电桩充电效率的四大决定因素

随着电动汽车的快速普及,交流充电桩作为电动汽车的充电基础设施,其充电效率受到了广泛的关注。接下来,我们将深入探讨交流充电桩的充电效率,包括充电效率的定义、影响因素以及提升方法。 充电效率的定义 交流充电桩的充电效率指的…

【微信小程序从入门到精通(项目实战)】——微电影小程序

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

2024华中杯C题完整解题思路及代码

C 题 基于光纤传感器的平面曲线重建算法建模 光纤传感技术是伴随着光纤及光通信技术发展起来的一种新型传感器技 术。它是以光波为传感信号、光纤为传输载体来感知外界环境中的信号,其 基本原理是当外界环境参数发生变化时,会引起光纤传感器中光波参量&…

Vue前端框架如何调用天聚数行API?

Vue是一个业内优秀的前端解决方案,采用了最新流行的MVVM框架模式,深受web前端开发者的喜爱,在相关开发者社区也一直都是热门交流话题。那么,如何通过Vue调用天行数据的API接口呢,下面就具体给大家示例。 vue采用的是数…