【每日八股】淘天一面

在这里插入图片描述

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

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.mzph.cn/pingmian/9714.shtml

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

相关文章

如何自定义Markdown中插入图片的位置

工作中常常需要在VsCode下写Markdown笔记&#xff0c;在写笔记的过程中不免需要插入图片。  Markdown中插入笔记的操作往往是比较繁琐的&#xff0c;比如&#xff1a;在文档中引用本地某个文件夹下的图片&#xff0c;首先需要你先保存图片到本地路径&#xff0c;然后需要你在文…

Vue-Cli脚手架项目的搭建【新手快速入手】

目录 一、Vue CLI脚手架简介☺ 1.Node.js前置环境的安装 2.安装npm管理器 3.安装淘宝镜像(cnpm) 二、安装vue-cli 1. 版本号查看 2.旧版本卸载 3.新版本安装 4.检查 三、Vue项目的搭建 &#x1f4cc;进入Vue项目管理器 ★命令方式创建 若localhost拒绝访问怎么办&…

技术速递|Python in Visual Studio Code 2024年5月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2024 年 5 月发布&#xff01; 此版本包括以下公告&#xff1a; “Implement all inherited abstract classes”代码操作新的自动缩进设置Debugpy 从 Python 扩展中删除&#…

Unity TileMap入门

概述 相信很多同学学习制作游戏都是从2D游戏开始制作的吧&#xff0c;瓦片地图相信大家都有接触&#xff0c;那接下来让我们学习一下这部分的内容吧&#xff01; Tilemap AnimationFrameRate:设置每帧动画的播放速率。Color:瓦片地图的颜色TileAnchor:锚点&#xff0c;&#x…

Docker容器创建各种镜像

目录 1.Docker创建Mysql容器 2.Docker创建Redis容器 3.Docker 创建minio容器 1.Docker创建Mysql容器 拉取镜像 docker pull mysql:8.0.20 宿主机创建挂载目录 /opt/mysql/conf /opt/mysql/data /opt/mysql/log 启动命令 docker run --name mysql -p 3306:3306 -v /opt/…

Set接口

Set接口的介绍 Set接口基本介绍 无序&#xff08;添加和取出的顺序不一致&#xff09;&#xff0c;没有索引不允许重复元素&#xff0c;所以最多包含一个nullJDK API中Set接口的实现类&#xff1a;主要有HashSet&#xff1b;TreeSet Set接口的常用方法 和List 接口一样&am…

Windows11提示升级,我要点确定吗?

Windows 11自2021年10月推出以来&#xff0c;一直保持着缓慢而稳定的增长&#xff0c;相对来说在游戏PC上的影响力较大&#xff0c; 而Windows 10也即将于2025年10月结束支持。 截至2024年&#xff0c;Windows 11的主要版本包括24H2、 23H2、22H2和21H2。 24H2&#xff1a;20…

k8s遇到的常见问题及解决

1. error: open /var/lib/kubelet/config.yaml: no such file or directory 解决&#xff1a;关键文件缺失&#xff0c;多发生于没有做 kubeadm init就运行了systemctl start kubelet。 要先成功运行kubeadm init 2. 执行初始化kubeadm init ------的时候报错 The HTTP call…

五一超级课堂---Llama3-Tutorial(Llama 3 超级课堂)---第四节Llama 3 高效部署实践(LMDeploy 版)

课程文档&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 课程视频&#xff1a; https://space.bilibili.com/3546636263360696/channel/collectiondetail?sid2892740&spm_id_from333.788.0.0 操作平台&#xff1a; https://studio.intern-ai.org.cn/consol…

GAMMA Lab——知识图谱和LLM大模型

图机器学习的发展与分类 图基础模型 LLM基础模型 GNN LLM 前沿工作

JUC下的CompletableFuture详解

详细介绍 CompletableFuture是Java 8引入的一个实现Future接口的类&#xff0c;它代表一个异步计算的结果。与传统的Future相比&#xff0c;CompletableFuture提供了更丰富的功能&#xff0c;比如链式调用、组合异步操作、转换结果、异常处理等&#xff0c;极大地增强了Java在…

TikTok shop多账户需要防关联吗?

TikTok是一个非常垂直的平台&#xff0c;每个账号的内容都应该尽可能的垂直&#xff0c;这样平台才能引流更多的流量。但是&#xff0c;TikTokShop只有一两个账号&#xff0c;流量往往难以保证&#xff0c;所以很多商家选择了TikTok的多账号运营模式。 众所周知&#xff0c;多店…

什么是SOL链跟单机器人与阻击机器人?

SOL链作为一个快速增长的区块链生态系统&#xff0c;为各种应用程序提供了丰富的发展机会。在SOL链上&#xff0c;智能合约的应用已经开始蓬勃发展&#xff0c;其中包括了许多与加密货币交易相关的应用。在本文中&#xff0c;我们将介绍在SOL链上开发的阻击机器人&#xff08;S…

【静态分析】软件分析课程实验A3-死代码检测

官网&#xff1a; 作业 3&#xff1a;死代码检测 | Tai-e 参考&#xff1a; https://www.cnblogs.com/gonghr/p/17981720 --------------------------------------------------------------------- 1 作业导览 为 Java 实现一个死代码&#xff08;dead code&#xff09;检…

【计算机毕业设计】springboot果蔬种植销售一体化服务平台

伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对果蔬种植销售一体化服务管理进行规范而严格是十分有必要的&#xff0c;所以许许多多的 信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套果蔬种植销售一体化服务平台&…

RS2255XN功能和参数介绍及PDF资料

RS2255XN是一款由Runic&#xff08;润石&#xff09;公司生产的模拟开关。以下是关于RS2255XN的一些技术参数和特点&#xff1a; 封装&#xff1a;MSOP-10 电源电压范围&#xff1a;2.5V至5.5V 工作温度范围&#xff1a;-40C至125C 类型&#xff1a;模拟开关 品牌&#xff1a;R…

如何使用Whisper音频合成模型

Whisper 是一个通用语音识别模型&#xff0c;由 OpenAI 开发。它可以识别多种语言的语音&#xff0c;并将其转换为文本。Whisper 模型采用了深度学习技术&#xff0c;具有高准确性和鲁棒性。 1、技术原理及架构 Whisper 的工作原理&#xff1a;音频被分割成 30 秒的片段&#…

云计算导论(2)---云计算基础

文章目录 1. 分布式计算2. 分布式计算系统架构3. 分布式计算关键技术4. 分布式计算性能优化方法5. 云计算的基本概念6. 云计算的关键技术 1. 分布式计算 1. 定义&#xff1a;分布式计算是一种计算方法&#xff0c;将一个大型任务拆分成多个小任务&#xff0c;并分配给多台计算机…

c#绘制渐变色的Led

项目场景&#xff1a; c#绘制渐变色的button using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; using static System.Windows.Forms.AxHost;namespace WindowsFormsApp2 {public class Gradie…

【C++】-类模板-002

1创建类模板 &#xff08;1&#xff09;新建工程 &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; &#xff08;5&#xff09;模板运行结果 2【UI】设计器 &#xff08;1&#xff09;跳转到【UI】设计器 &#xff08;2&#xff09;添加…