【每日八股】淘天一面

news2024/11/25 15:50:19

在这里插入图片描述

🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害

rocketmq的消息重复发送问题?如何保证幂等?

  1. 如何保证幂等性
    • 消息 Key 设置:不建议以 Message ID 作为处理依据,而是使用业务唯一标识作为幂等处理的关键依据。例如,在支付场景中,可以将消息的 Key 设置为订单号。
    • 业务逻辑自我实现幂等:消费逻辑需要自行实现幂等性。例如,通过数据库事务、乐观锁等方式,确保同一条消息的消费结果只能在业务系统中生效一次。
    • 注意并发场景:在高并发场景下,要注意并发重复消息的问题。例如,使用 select for update 语句锁定记录,以避免并发问题。

讲一下乐观锁和悲观锁的一些区别吗?

  1. 乐观锁
    • 思想:乐观锁对数据操作持乐观态度,认为其他线程不会同时修改数据。
    • 实现方式:乐观锁不会上锁,而是在执行更新操作时检查其他线程是否修改了数据。如果有其他修改,放弃操作;否则执行操作。
    • 常见实现:使用 CAS(Compare And Swap) 机制或版本号机制。
    • 适用场景:适用于并发写入较少的情况。
  2. 悲观锁
    • 思想:悲观锁对数据操作持悲观态度,认为其他线程可能同时修改数据。
    • 实现方式:悲观锁在操作数据时直接将数据锁住,直到操作完成后才释放锁。其他线程在锁定期间无法修改数据。
    • 常见实现:使用代码块锁(如 Java 的 synchronized 关键字)或数据库中的排它锁。
    • 适用场景:适用于并发写入较多的情况。
  3. CAS 机制
    • CAS(Compare And Swap) 是乐观锁的一种实现方式。
    • CAS 操作包括三个操作数:需要读写的内存位置、进行比较的预期值、拟写入的新值。
    • CAS 是由 CPU 支持的原子操作,在硬件层面保证原子性。
  4. 版本号机制
    • 乐观锁的另一种实现方式。
    • 在数据表中添加一个版本号字段,每次更新时增加版本号。
    • 更新时检查版本号,如果版本号匹配,执行操作;否则放弃。
  5. 适用场景
    • 乐观锁:适用于读多写少的场景,如缓存、分布式锁。
    • 悲观锁:适用于写多的场景,如数据库事务。

保证幂等中的幂等键是如何设计的?

在设计幂等性时,选择合适的幂等键(也称为幂等标识)是至关重要的。幂等键用于唯一标识一次请求,确保同一操作的多次请求具有相同的结果。以下是一些常见的幂等键设计方法:

  1. 业务唯一标识
    • 使用业务相关的唯一标识作为幂等键。例如,在订单系统中,可以使用订单号作为幂等键。
    • 这样,无论客户端发送多少次相同的请求,只要订单号相同,服务端都会保证处理结果一致。
  2. Token 机制
    • 在接口调用前,先获取一个全局唯一的 Token。
    • 将 Token 作为请求的一部分,服务端根据 Token 判断是否已处理过相同的请求。
    • 如果已处理,直接返回之前的结果;如果未处理,执行业务逻辑并保存 Token。
  3. 版本号机制
    • 在数据库表中增加一个版本号字段(或者时间戳字段)。
    • 在更新数据之前,先查询数据的版本号。
    • 更新数据时,使用版本号作为查询条件,确保只有相同版本号的请求才能修改数据。
  4. 悲观锁
    • 在高并发场景下,使用数据库的悲观锁来保证幂等性。
    • 通过 SELECT ... FOR UPDATE 查询语句锁定数据行,确保同一时刻只有一个请求能修改数据。
  5. 唯一索引
    • 在数据库表中添加唯一索引,确保某些字段的唯一性。
    • 如果插入重复数据,数据库会报唯一性约束错误,此时可以捕获异常并返回成功。
  6. 防重表
    • 针对特定场景,不允许产生重复数据的情况,可以创建一个防重表。
    • 防重表只包含必要的字段,例如业务标识和唯一索引。
    • 在插入数据时,先查询防重表,如果存在相同的标识,说明是重复请求,直接返回成功。

总之,选择合适的幂等键取决于具体业务场景。根据业务需求、性能要求和数据一致性,选用适当的方案来保证接口的幂等性。

讲一下get reset 跟 git reverse有什么区别?

当涉及到版本控制时,git resetgit revert 是两个常用的 Git 命令,它们用于处理提交历史的不同方面。让我们来详细比较一下它们的区别:

  1. git reset

    • 作用git reset 用于将 HEAD 指向指定的提交,从而重置分支的历史。
    • 效果:执行 git reset 后,会丢弃指定提交之后的所有提交,这些提交将不再出现在分支历史中。
    • 常见用法git reset --hard <commit> 可以将 HEAD 和工作目录回退到指定提交。
  2. git revert

    • 作用git revert 用于撤销某个提交的更改,创建一个新的提交来还原之前的更改。
    • 效果:执行 git revert 后,会在分支上创建一个新的提交,该提交的内容与要还原的提交相反。
    • 常见用法git revert <commit> 可以撤销指定提交的更改。
  3. 区别总结

    • git reset 直接修改提交历史,可能导致本地仓库和远程仓库不一致,需要谨慎使用。
    • git revert 创建一个新的提交来撤销特定的提交,不会修改提交历史。

    ●使用git reset时,你可以修改当前分支的历史,但如果更改已经推送,可能会给团队带来问题。它主要用于本地更改的撤销或重组。
    ●使用git revert时,你在不更改现有历史的前提下撤销之前的更改,通过添加新的提交来实现。这对于处理已经推送的更改更为安全和推荐。
    简单来说,如果你想撤销本地的更改并且不担心改变历史,可以使用git reset。如果需要撤销已经推送的提交,并且希望保持项目历史的完整性,应该使用git revert。

怎么用threadlocal解决用户信息共享的问题嘛(黑马点评)?

ThreadLocal 是 Java 中的一个强大工具,用于解决多线程环境下的数据共享问题。虽然它可以用于处理线程安全问题,但它的资源并不是共享的,而是每个线程独享的。让我们深入了解一下 ThreadLocal 的使用和原理:

  1. ThreadLocal 的使用场景

    • 每个线程需要一个独享对象:例如,SimpleDateFormatRandom 等工具类。每个线程内有自己的实例副本,不共享。类比:教材只有一本,一起做笔记会有线程安全问题。使用 ThreadLocal 相当于复印了教材。
    • 每个线程内需要保存全局变量:例如,在拦截器中获取用户信息,可以让不同方法直接使用,避免参数传递的麻烦。
  2. ThreadLocal 的实践

    • 场景1:每个线程打印日期

      Java

      public class ThreadLocalExample {
          private static ThreadLocal<SimpleDateFormat> dateFormatThreadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
      
          public String formatDate(int seconds) {
              Date date = new Date(1000L * seconds);
              return dateFormatThreadLocal.get().format(date);
          }
      
          public static void main(String[] args) {
              ThreadLocalExample example = new ThreadLocalExample();
              for (int i = 0; i < 30; i++) {
                  int finalI = i;
                  new Thread(() -> {
                      String formattedDate = example.formatDate(finalI);
                      System.out.println(formattedDate);
                  }).start();
              }
          }
      }
      

      AI 生成的代码。仔细查看和使用。 有关常见问题解答的详细信息.

      运行结果:多个线程打印自己的时间,每个线程有自己的 SimpleDateFormat 对象,避免了线程安全问题。

    • 场景2:当前用户信息需要被线程内的所有方法共享

      • 方案1:传递参数。但这样会增加方法参数的复杂度。
      • 方案2:使用 ThreadLocal 存储用户信息,让不同方法直接访问,避免参数传递的麻烦。
  3. ThreadLocal 的注意点

    • 需要在使用完毕后调用 remove() 方法,以避免内存泄漏。
    • 不要过度使用 ThreadLocal,否则可能导致资源浪费。

总之,ThreadLocal 可以有效地解决多线程环境下的数据共享问题,但要谨慎使用,避免资源泄漏。1234

利用 Redis 实现了点赞和关注功能,那 Redis 跟点赞和关注功能有啥关系?点赞不应该存储在数据库里面的嘛?

Redis 在点赞和关注功能中扮演着重要的角色,尤其是在高并发环境下。让我们详细探讨一下 Redis 与点赞、关注功能之间的关系:

  1. 点赞和关注功能的需求

    • 点赞和关注功能是社交平台和内容应用中常见的交互特性。
    • 关键特性包括唯一性、即时性、可见性和可撤销性。
  2. Redis 在点赞和关注功能中的作用

    • 缓存点赞数:将文章的点赞数存储在 Redis 中,避免频繁查询数据库,提高性能。
    • 记录用户点赞的文章:使用 Redis 的数据结构(例如 Hash 或 Set)存储用户点赞的文章,以便快速判断用户是否已点赞某篇文章。
    • 定时同步到数据库:通过定时任务,将 Redis 中的点赞数据定期持久化到 MySQL 数据库中。
  3. 具体实现步骤

    • 点赞

      • 用户点赞时,将点赞信息存入 Redis:
        • 增加用户总点赞数。
        • 记录用户点赞的文章。
        • 增加文章的点赞数。
      • 定时任务从 Redis 读取数据,将点赞数据持久化到 MySQL。
    • 取消点赞

      • 用户取消点赞时,将取消点赞信息从 Redis 中移除:
        • 减少用户总点赞数。
        • 移除用户点赞的文章记录。
        • 减少文章的点赞数。
      • 同样,定时任务将 Redis 中的数据同步到 MySQL。
  4. 数据库设计

    • 主要涉及两张表:
      • article 表:存储文章信息,包括文章 ID、内容和总点赞数。
      • user_like_article 表:记录用户点赞的文章,是一张中间表。
  5. 总结

    • Redis 作为缓存数据库,用于存储点赞数和用户点赞的文章信息,可以有效减轻数据库压力,提高系统性能。
    • 定时任务确保 Redis 中的数据与数据库保持同步,实现数据的持久化存储。

如果你想了解更多关于 Redis 和点赞功能的实现细节,可以参考以下链接:

  • 知乎专栏:Redis 实现点赞功能模块
  • 鱼皮的编程宝典:Redis 实现文章点赞功能

遇到的Java的包冲突,一般怎么排查呢?

Maven Helper

使用IntelliJ IDE的Maven helper插件方便找到和排除冲突的依赖项

【1】command+, 打开工具的设置窗口

【2】设置搜索中输入plugin

【3】在Marketplace table页面中搜索Maven Helper,并安装

【4】重启后即可使用,打开pom文件后,文件下面会多出Dependency Analyzer这一个tab。

进入Dependency Analyzer视图之后有三个查看选项,

Conflicts(冲突)

All Dependencies as List(列表形式查看所有依赖)

All Dependencies as Tree(树结构查看所有依赖)

描述一下类加载的过程?

类加载是 Java 程序运行的关键步骤之一,它负责将编译后的 Java 类文件加载到虚拟机中,使得程序能够正确运行。类加载过程包括以下七个阶段:

  1. 加载(Loading)
    • 加载阶段通过类的全限定名获取类的二进制字节流。
    • 将字节流转换为方法区的运行时数据结构。
    • 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口。
  2. 验证(Verification)
    • 验证阶段确保 Class 文件的字节流符合 Java 虚拟机规范的约束要求。
    • 防止恶意代码的执行。
  3. 准备(Preparation)
    • 准备阶段为类变量分配内存并设置初始值。
    • 只包括类变量,不包括实例变量。
  4. 解析(Resolution)
    • 解析阶段将符号引用转换为直接引用。
    • 主要针对类、字段、方法等符号引用。
  5. 初始化(Initialization)
    • 初始化阶段执行类构造器 <clinit> 方法,为类变量赋予正确的初始值。
    • 静态变量和静态代码块的初始化都在这一阶段完成。
  6. 使用(Using)
    • 在类加载完成后,可以使用类的静态变量和静态方法。
  7. 卸载(Unloading)
    • 类的生命周期从加载开始到卸载结束。
    • 类卸载发生在类不再被引用且没有正在执行的线程使用时。

讲一下索引为什么可以提高数据库的查询速度?

索引的优缺点

优势:可以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;

劣势:索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍;索引表的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表;

深入理解MySQL索引原理和实现——为什么索引可以加速查询?-腾讯云开发者社区-腾讯云 (tencent.com)

有没有遇到过跨域的问题。你知道跨域是啥意思?

  1. 什么是跨域?

    • 跨域指的是在浏览器中,一个网页的脚本试图访问不同源(Origin)的资源(例如不同域名、协议或端口)时,会受到浏览器的限制。
    • 同源策略是浏览器的一种安全机制,它限制了不同源之间的交互。
  2. 为什么会出现跨域问题?

    • 浏览器出于安全考虑,限制了不同源之间的资源访问。
    • 如果请求的协议、主机、端口有任何一个不同,就被视为跨域请求。
  3. 跨域问题的解决方法

    • CORS(跨域资源共享):在响应头中添加特定的字段,允许不同源的请求访问资源。
    • JSONP(JSON with Padding):通过动态创建 <script> 标签,实现跨域数据传输。
    • 代理服务器:在同源服务器上设置代理,将跨域请求转发到目标服务器。

    前后端分离项目,如何解决跨域问题?_项目测试环境、生产环境里,前后端跨域是如何解决的-CSDN博客

能讲一下 session 跟 cookie 的区别吗?

当谈到 Web 应用程序的用户身份验证和状态管理时,SessionCookie 是两个常见的概念。让我详细解释一下它们之间的区别:

  1. Cookie
    • 概念:Cookie 是一种在客户端存储数据的技术,由服务器发送给客户端的小型文本文件。
    • 存储位置:Cookie 存储在客户端的浏览器中。
    • 安全性:相对较低,因为 Cookie 可以被客户端修改和查看。
    • 大小限制:Cookie 大小通常限制在 4KB 左右。
    • 有效期:可以设置较长时间,只要不超过设置的过期时间,可以一直存储。
  2. Session
    • 概念:Session 是在服务器端创建的会话,用于跟踪用户的状态和数据。
    • 存储位置:Session 数据存储在服务器上。
    • 安全性:相对较高,因为 Session 数据在服务器上,客户端无法直接修改。
    • 有效期:Session 在一定时间内保存在服务器上,通常为 30 分钟左右。
  3. 区别总结
    • 存储位置:Cookie 存储在客户端,Session 存储在服务器端。
    • 安全性:Session 比 Cookie 更安全。
    • 生命周期:Cookie 可以长期存储,Session 有固定的过期时间。
    • 存储大小:Cookie 有大小限制,Session 大小受服务器内存限制。
    • 跨域访问:Cookie 受同源策略限制,Session 不受限制。

总之,Cookie 和 Session 都用于存储用户状态和身份信息,但它们的存储位置、安全性和生命周期等方面存在差异。在实际应用中,通常会结合使用 Cookie 和 Session 来实现用户认证和状态管理。12345

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

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

相关文章

基于.NET WinForms 数据CURD功能的实现

使用开发工具 VS 2022 C#&#xff0c;数据库MS SQL SERVER 2019 &#xff0c;基于NET WinForms&#xff0c;实现数据记录的创建(Create)、更新(Update)、读取(Read)和删除(Delete)等功能。主要控件包括&#xff1a;DataGridView&#xff0c;SqlDataApater &#xff0c; DataTab…

JSP ssm 智能水表管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 智能水表管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

生成指定范围的随机整数

private static final Random RANDOM new Random();// 生成指定范围的随机整数public static int generateRandomInt(int min, int max) {return RANDOM.nextInt(max - min 1) min;}public static void main(String[] args) {Integer count 5;Integer randomInt generateR…

缓存菜品操作

一&#xff1a;问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 二&#xff1a;实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; 每个分…

【UnityRPG游戏制作】Unity_RPG项目_玩法相关※

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

【基础算法总结】滑动窗口二

滑动窗口二 1.水果成篮2.找到字符串中所有字母异位词3.串联所有单词的子串4.最小覆盖子串 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.水…

Dbeaver network unavailable due to certificate issue

场景&#xff1a;出现在DBeaver连接数据库下载驱动的时候 解决&#xff1a; 别勾选就可以了

Java的基本语法

文章目录 Java语言的一些基本语法要点&#xff1a;Java语言的一些进阶概念和特性&#xff1a;Java代码示例基础示例1. Hello World2. 计算两个数的和 进阶示例1. 使用Lambda表达式过滤列表2. 实现一个简单的泛型类3. 使用多线程打印数字 异常处理示例捕获并处理异常 接口使用示…

【前端】HTML实现个人简历信息填写页面

文章目录 前言一、综合案例&#xff1a;个人简历信息填写页面 前言 这篇博客仅仅是对HTML的基本结构进行了一些说明&#xff0c;关于HTML的更多讲解以及CSS、Javascript部分的讲解可以关注一下下面的专栏&#xff0c;会持续更新的。 链接&#xff1a; Web前端学习专栏 下面我对…

Python专题:六、循环语句(2)

for循环语句 列表可以简单的理解为&#xff1a; 顺序保存的若干元素 注释&#xff1a;变量largest&#xff0c;循环语句for&#xff0c;还有二层缩进八个空格 依次取出counts&#xff08;列表&#xff09;里的数字&#xff0c;并赋予给x&#xff0c;判断x和largest数值大小。…

深度学习之视觉特征提取器——AlexNet

AlexNet 参考资料&#xff1a; &#xff08;1&#xff09;ImageNet十年历任霸主之AlexNet - 知乎 (zhihu.com) &#xff08;2&#xff09;AlexNet - Wikipedia 引入 AlexNet在2012年以第一名在Top-1分类精度霸榜ImageNet&#xff0c;并超过第二名近10个百分点&#xff0c;…

OpenCV-基于累计直方图的中值滤波算法

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 实现原理 基于累计直方图的中值滤波算法是一种图像处理技术&#xff0c;用于去除图像中的噪声。它利用了像素值的频数分布&#…

图片过大怎么处理变小?在线编辑图片工具推荐

在各种平台进行图片上传时&#xff0c;经常会遇到由于图片过大而无法成功上传的问题&#xff0c;为了顺利进行下一步操作&#xff0c;我们需要将图片进行缩小处理&#xff0c;通常情况下&#xff0c;我们可以使用各种软件工具来对图片进行缩小&#xff0c;如何快速有效地调整图…

自动驾驶系统中的端到端学习

资料下载-《自动驾驶系统中的端到端学习&#xff08;2020&#xff09;》https://mp.weixin.qq.com/s/ttNpsn7qyVWvDMZzluU_pA 近年来&#xff0c;卷积神经网络显著提高了视觉感知能力。实现这一成功的两个主要因素是将简单的模块组合成复杂的网络和端到端的优化。然而&#xf…

源代码防泄密-文档加密与沙盒加密的区别

研发人员比普通办公人员要精通电脑&#xff0c;除了常见的网络&#xff0c;邮件&#xff0c;U盘&#xff0c;QQ等数据扩散方法外&#xff0c;外设中转对研发人员来说轻而易举&#xff1a; — 对于嵌入式开发场景&#xff0c;可以通过串口&#xff0c;U口&#xff0c;网口把代码…

美团二面:SpringBoot读取配置优先级顺序是什么?

引言 Spring Boot作为一种轻量级的Java应用程序框架&#xff0c;以其开箱即用、快速搭建新项目的特性赢得了广大开发者的青睐。其核心理念之一就是简化配置过程&#xff0c;使开发者能够快速响应复杂多变的生产环境需求。为了实现这一点&#xff0c;Spring Boot支持丰富的外部…

OpenVoiceV2本地部署教程,苹果MacOs部署流程,声音响度统一,文字转语音,TTS

最近OpenVoice项目更新了V2版本&#xff0c;新的模型对于中文推理更加友好&#xff0c;音色也得到了一定的提升&#xff0c;本次分享一下如何在苹果的MacOs系统中本地部署OpenVoice的V2版本。 首先下载OpenVoiceV2的压缩包&#xff1a; OpenVoiceV2-for-mac代码和模型 https:…

Minio(官方docker版)容器部署时区问题研究记录

文章目录 感慨&概述补充&#xff1a;MINIO_REGION和容器时间的关系 问题一&#xff1a;minio容器和本地容器时间不一致问题说明原因探究解决方法结果验证 问题二&#xff1a;minio修改时间和本地查询结果不一致具体问题原因探究解决办法时间转化工具类调用测试和验证上传文…

4. 从感知机到神经网络

目录 1. 从感知机到神经网络 2. 最简单的神经网络 3. 激活函数的引入 1. 从感知机到神经网络 之前章节我们了解了感知机&#xff0c;感知机可以处理与门、非与门、或门、异或门等逻辑运算&#xff1b;不过在感知机中设定权重的工作是由人工来做的&#xff0c;而设定合适的&a…

障碍物识别软件的优缺点

在这个科技与人文关怀交织的时代&#xff0c;一款基于激光雷达技术的障碍物识别软件正悄然为视障人士的日常生活带来一场革命性的改变。这一款叫做“蝙蝠避障”的软件利用先进科技的力量&#xff0c;为盲人出行铺设了一条更加安全、独立的道路。今天&#xff0c;让我们从资深记…