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 是一种网络协议,提供了在客户端和服务器之间进行全双工、持久化的通信通道。它在建立连接后,允许双方在同一连接上进行双向的数据传输,而无需重复建立连接。
主要特点
- 持久化连接:一旦建立,连接会保持打开状态,直到任一方关闭连接。
- 全双工通信:客户端和服务器可以同时发送和接收消息。
- 低延迟:通过减少开销和避免重复握手,提高了数据传输效率。
工作流程
- 握手阶段:客户端通过 HTTP 发起一个 WebSocket 握手请求,服务器回应以确认建立 WebSocket 连接。
- 数据传输:连接建立后,数据通过 WebSocket 协议在客户端和服务器之间双向传输。
- 连接关闭:任一方可以发送关闭帧来关闭连接。
补偿机制
补偿机制(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