首页 > 其他分享 >面试重点!!!必背

面试重点!!!必背

时间:2024-09-13 18:49:38浏览次数:9  
标签:必背 事务 redis 面试 补偿 call 操作 机制 重点

redisson底层实现加锁的原理

内部通过lua脚本,借助hash类型实现锁的操作
hash的key值是分布式锁的key
hash的filed值是uuid+当前线程id
hash的value值是加锁的次数

判断key是否存在,0表示不存在,key是锁的名称

例如keys[1]是taskLockKey
argv[1] 过期时间,比如10秒
argv[2] 是uuid+线程id,比如 wwerkl-343lkj-XXXX:80
if (redis.call(‘exists’, KEYS[1]) == 0) then
# 使用hash类型存储数据,field 根据uuid和线程id生成的字符串
redis.call(‘hincrby’, KEYS[1], ARGV[2], 1);
# 设置过期时间
redis.call(‘pexpire’, KEYS[1], ARGV[1]);
return nil;
end;

针对可重入锁,在加锁的代码中,又进行加锁

if (redis.call(‘hexists’, KEYS[1], ARGV[2]) == 1) then
redis.call(‘hincrby’, KEYS[1], ARGV[2], 1);
redis.call(‘pexpire’, KEYS[1], ARGV[1]);
return nil;
end;
return redis.call(‘pttl’, KEYS[1]);

redisson的看门狗机制的作用
实现自动续期
使用tryLock,不设置过期时间时,看门狗机制才会生效
默认每10秒钟,内部通过Timeout定时器,根据key和filed判断锁是否存在(redis.call(‘hexists’, KEYS[1], ARGV[2]) == 1)
如果存在,说明任务还没有执行完,将key的过期时间设置为30s

什么情况下可能使用分布式锁

针对集群,某些逻辑只能一台机器执行

OpenFeign底层以Http协议实现

cas锁

CAS(Compare-And-Swap)锁是一种原子操作的锁机制。它通过比较内存中的当前值与预期值,如果两者相同,则将内存值更新为新值。如果比较失败,操作会重试。这种机制可以在多线程环境中保证操作的原子性和一致性,常用于实现无锁数据结构和高效的同步。

WebSocker

WebSocket 是一种网络协议,提供了在客户端和服务器之间进行全双工、持久化的通信通道。它在建立连接后,允许双方在同一连接上进行双向的数据传输,而无需重复建立连接。

主要特点

  1. 持久化连接:一旦建立,连接会保持打开状态,直到任一方关闭连接。
  2. 全双工通信:客户端和服务器可以同时发送和接收消息。
  3. 低延迟:通过减少开销和避免重复握手,提高了数据传输效率。

工作流程

  1. 握手阶段:客户端通过 HTTP 发起一个 WebSocket 握手请求,服务器回应以确认建立 WebSocket 连接。
  2. 数据传输:连接建立后,数据通过 WebSocket 协议在客户端和服务器之间双向传输。
  3. 连接关闭:任一方可以发送关闭帧来关闭连接。

补偿机制

补偿机制(Compensation Mechanism)是一种在事务处理和分布式系统中用于处理失败和恢复一致性的技术。它的主要目的是确保在系统出现错误或异常情况时,能够恢复到一个一致且可靠的状态。补偿机制常见于以下几个领域:

1. 事务管理

在事务处理中,尤其是分布式事务中,当一个事务的某个部分成功执行但其他部分失败时,可能需要补偿机制来恢复系统的一致性。补偿机制用于处理那些无法成功回滚的事务,确保系统最终一致。

  • 补偿操作:补偿操作是用于逆转或撤销已经执行的事务操作。补偿操作会在事务失败后被执行,以恢复系统的正确状态。例如,若一个银行转账事务中的扣款操作成功但转账操作失败,则需要通过补偿操作将扣款撤销。

示例:在一个转账操作中,如果转账成功但扣款失败,可以进行补偿操作,将扣款撤回。

2. 分布式系统

在分布式系统中,补偿机制通常与补偿事务(Compensating Transactions)有关。这种机制确保在分布式环境下,即使一个操作或服务失败,也能够通过额外的操作恢复系统状态。

  • Saga 模式:Saga 模式是一种处理长时间运行事务的补偿机制。它将一个长事务拆分成一系列小事务,每个小事务都有一个对应的补偿事务。当某个小事务失败时,系统会执行补偿事务以撤销之前的操作,确保系统的一致性。

示例:在电商系统中,处理一个订单可能涉及多个步骤(如库存检查、支付处理、订单创建)。如果支付处理失败,之前的库存检查步骤需要通过补偿操作恢复库存。

3. 业务流程管理

在业务流程管理中,补偿机制用于处理在执行业务流程时发生的异常情况。它确保业务流程可以在出现问题时恢复到一个有效的状态。

  • 补偿逻辑:在业务流程中,当某个步骤失败时,可以通过补偿逻辑进行处理。补偿逻辑是预先定义的,用于处理错误情况并恢复系统到预期状态。

示例:在订单处理过程中,如果订单的配送步骤失败,可以进行补偿逻辑来处理配送问题,如重新调度配送或通知客户。

4. 应用层

在应用层,补偿机制可以用于处理应用程序的状态恢复和错误处理。应用层的补偿机制确保在发生异常时,应用能够进行适当的恢复操作。

  • 补偿方法:在应用程序中,补偿方法可以用于恢复数据或重新执行失败的操作。例如,在电子邮件发送失败时,可以将邮件放入重试队列,并在之后重试发送。

死信队列对订单超时处理

xml配置

spring:
  rabbitmq:
    host: 192.168.17.101
    port: 5672
    username: test
    password: test
    virtual-host: /test
    # 消费者监听
    listener:
      simple:
        # 消息确认机制更改为手动
        acknowledge-mode: manual
        #预处理模式,指定消费只每次读取指定条数的消息,在消费者未返回确认之前,不再处理下一条消息
        prefetch: 1

创建订单队列的配置类

package com.qfedu.common.mq.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import 

标签:必背,事务,redis,面试,补偿,call,操作,机制,重点
From: https://blog.csdn.net/m0_53369973/article/details/142187515

相关文章

  • Java笔试面试题AI答之单元测试JUnit(4)
    文章目录19.简述JUnitorg.junit.TestSuite类的作用?1.组织测试类2.简化测试执行3.灵活配置测试环境4.嵌套测试套件注意事项20.在JUnit中@Test注释的作用和用法?作用用法21.简述Junit基础注解(@BeforeClass、@Before、@Test、@After、@AfterClass)?22.编写代......
  • c++面试八股文(大公司通用)
    在C++面试中,常见的问题通常会围绕C++的基础知识、数据结构与算法、系统设计、编程技巧、以及实际应用中的场景。以下是华为C++面试中常见的“八股文”问题及其简要回答思路。1.C++语言基础C++中const的用法有哪些?回答:常量变量:constinta=10;指针常量:constint*p;(指向......
  • 吊打面试官!从多维度理解架构
    大家好,我是汤师爷~在工作当中,我们经常会听到以下说法:产品负责人说,现在的业务架构太复杂,需要仔细梳理下。技术领导说,这个项目很复杂,需要做下系统架构方案评审。研发经理说,这次秒杀活动访问量非常大,需要用到高并发架构方案。一线研发说,互联网大厂都会用到微服务架构,我要学学微......
  • 面试-运行环境-网页渲染
    网页加载过程网页是如何加载并渲染出来的从输入url到渲染出页面的整个过程(经典题来了)资源有哪些形式加载的大致过程请求啥就是返回啥,图片、音频都有可能。请求的是页面则返回HTML代码。渲染过程-①RenderTree:渲染树,每个节点挂了很多CSS属性,这样就能渲染......
  • Java面试随手记3
    一、面试题总结31、mysql中char和varchar的区别?特性charvarchar存储方式定长,长度不足时填充空格可变长,按实际长度存储存储效率固定空间,浪费内存根据实际长度动态分配性能较高,适合固定长度数据稍低,适合不定长度数据适用场景固定长度的字符串不定长度的字符串空格处理自动去......
  • 面试-JS Web API - 存储
    cookieHTML5存储(localStorage和sessionStorage)cookiecookie本身用于浏览器和server通讯的,被借用到本地存储来。可以用document.cookie来修改。同一个变量会覆盖,不同变量会追加。localStorage和sessionStorage//保存数据到localStoragelocalStorage.getItem('a......
  • 面试004
    1、自动化测试框架具体如何实现介绍整体技术名词:框架使用到了pytest、allure、jsonpath等技术实现框架搭建框架底层执行逻辑:根据执行选项读取测试用例信息Pytest插件用于读取测试用例信息并根据需要动态生成测试用例。最终按照编写的测试用例流程模板,执行用例具体执行......
  • 面试-JS Web API-Linux命令
    关键Linux命令虽然前端开发者不需要掌握Linux的所有命令,但以下基本的命令对日常工作是非常有用的:文件和目录管理ls:列出当前目录下的文件和文件夹。lsls-l#显示详细信息ls-a#显示隐藏文件cd:切换目录。cd/path/to/directorycd..#返回上一级目录pwd:显......
  • 面试官:线程池遇到未处理的异常会崩溃吗?
    首先,这个问题考察的是你对线程池execute方法和submit方法的理解,在Java线程池的使用中,我们可以通过execute方法或submit方法给线程池添加任务,但如果线程池中的程序在执行时,遇到了未处理的异常会怎么呢?接下来我们一起来看。1.execute方法execute方法用于提交一个不需要......
  • 面试- JS Web API - ES6模块化
    ES6模块化的基础概念ES6模块化的核心在于两个关键字:export和import。export:用于将模块中的变量、函数、类等导出,供其他模块使用。import:用于从其他模块中导入需要的功能。2.模块的导出(export)ES6提供了两种导出方式:命名导出(NamedExports)和默认导出(DefaultExport)。......