redis事务以及锁

1.redis事务是一组命令的集合,串行序列化的执行,不允许加塞

2.MULTI 这个是标记一个事务块的开始
EXEC 执行事务块中的所有命令
这里写图片描述

4.放弃事务 如下图最后所示
这里写图片描述

5.. 事务全失败 , 直接报错 , 命令错误,error 只要有一个失败 全失败,不加入队列
这里写图片描述

6.命令无错误,但对于数据无法递增,只会这一个失败,加入队列
这里写图片描述

7.watch 监控
这里写图片描述

行级锁 : inndb
表级锁 : Myisam 并发性很差,一致性很好
乐观锁 : 加上version字段,每一次的操作都会更新version,提交时如果version不匹配,停止本次提交,工作一般都是乐观锁
乐观锁策略:提交的版本必须大于等于数据库当前版本才能提交

A , B 同时修改这个13号记录, A 读取时候 version是 1 ,B读取时候version也是 1,A修改完了之后,更新这个记录,版本号变为2,B这时候提交,但B的版本号是1,提交不成功,然后 重新读取 13号记录,在修改,就可以提交了

悲观锁 :锁整张表,性能下降
CAS :
这个watch类似于乐观锁
先 watch, 后改数据, 与上一个一样,依然事务不能执行
一旦执行了 UNWATCH 或者 EXEC 执行,
之前加的监控锁都清了

  1. redis事务执行。
    mutli 标记一个事务块的开始 -> 加命令 -> exec执行
在分布式系统中,使用 Redis 实现事务是一种常见的协调机制,用于确保多个服务实例之间对共享资源的访问具有互斥性和一致性。Redis 提供了多种机制来实现分布式事务,其中最核心的方法是利用其原子性操作和 Lua 脚本支持。 ### 基于 SETNX 和 EXPIRE 的基本实现 一种简单的实现方式是结合 `SETNX`(Set if Not Exists)命令和 `EXPIRE` 设置超时时间: - **获取**:使用 `SETNX` 命令尝试设置一个键值对,若键不存在则设置成功,表示获得。 - **释放**:通过 Lua 脚本保证删除指定键的操作是原子的,避免误删其他客户端的。 - **超时机制**:为设置合理的过期时间,防止死[^1]。 示例 Lua 脚本用于安全地获取: ```lua if redis.call("set", KEYS[1], ARGV[1], "nx", "px", ARGV[2]) then return 1 else return 0 end ``` 该脚本尝试以 NX 模式设置键,并附加 PX 参数设定过期时间,从而保证获取的过程是原子的。 ### 使用 Lua 脚本实现更复杂的逻辑 为了增强的功能,例如支持可重入、公平性等特性,可以编写更复杂的 Lua 脚本来处理的状态管理。例如,在解时验证持有者身份并执行删除操作: ```lua if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end ``` 此脚本确保只有的拥有者才能释放,增加了安全性[^4]。 ### 高级封装与 RedLock 算法 对于更加复杂的应用场景,可以考虑使用高级库如 Redisson 提供的封装接口,它不仅支持基础的分布式功能,还提供了诸如可重入、公平、联、红(RedLock)、读写等多种类型[^2]。RedLock 是一种改进的算法,旨在解决单点故障问题,通过在多个独立的 Redis 实例上进行操作,提高系统的可用性和可靠性。 ### 注意事项 - **唯一标识符**:每个客户端在请求时应提供唯一的标识符,以便正确地识别的归属。 - **网络稳定性**:确保所有进程能够稳定连接到 Redis 服务。 - **统一的键**:所有竞争资源的进程必须使用相同的键。 - **合理设置超时时间**:根据业务需求设定合适的超期时间,平衡性能与资源占用。 综上所述,Redis 可以通过多种方式有效地实现分布式事务,从基础的 `SETNX` 到基于 Lua 的自定义逻辑,再到利用现有库提供的高级特性,开发者可以根据具体需求选择适合的方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值