分布式锁选型+缓存db一致性

基于Redis Cluster模式

setnx就可以实现加锁,del实现解锁,但是这样不具备原子性,存在无法释放的可能。

因此可以使用在加锁时增加过期时间命令,做到原子性的加锁并且可以自动释放。

一些问题:

  • key的过期时间不能设置太长,避免其他线程阻塞
  • 可能出现误解锁,比如当前线程在锁期间没有完成,解锁时锁已经被别人占据,导致解掉别人的锁
  • 获取锁是非阻塞的,直接返回结果
  • 存在锁公平问题,需要自己实现

解决:

  • 守护线程对当前任务进度进行监控,及时续过期时间,知道锁释放或任务完成
  • 释放验证,释放时比对线程id和锁的value,防止释放不属于自己的锁
  • 阻塞机制,只能通过代码比如死循环去实现
  • 公平机制需要依赖等待队列来实现

可重入性需要自己开发,安全性方面可能丢失锁(redis主从复制)

可以了解一下基于多节点的高可用分布式锁的算法 RedLock。

缓存一致性问题解决讨论(增加思考能力)

加入缓存就不可避免的引入数据一致性的问题,所以在这里讨论,先说结论,我在项目上使用的是旁路缓存模式------

读策略:

从缓存中读取数据;如果缓存命中,则直接返回数据;如果缓存不命中,则从数据库中查询数据;查询到数据后,将数据写入到缓存中,并且返回给用户。

写策略:

更新数据库中(HBASE,Redis)的记录;删除缓存记录。

然后探讨一下各种模式的优缺点以及相应的解决方案。

相关推荐
Deryck_德瑞克5 小时前
redis和分布式锁
分布式
徐徐同学5 小时前
cpolar为IT-Tools 解锁公网访问,远程开发再也不卡壳
java·开发语言·分布式
视界先声5 小时前
国产分布式存储替代VMware vSphere?:20+功能对比,一文了解SmartX
分布式
露天赏雪11 小时前
Java 高并发编程实战:从线程池到分布式锁,解决生产环境并发问题
java·开发语言·spring boot·分布式·后端·mysql
没有bug.的程序员13 小时前
Spring Boot 事务管理:@Transactional 失效场景、底层内幕与分布式补偿实战终极指南
java·spring boot·分布式·后端·transactional·失效场景·底层内幕
LuminescenceJ14 小时前
GoEdge 开源CDN 架构设计与工作原理分析
分布式·后端·网络协议·网络安全·rpc·开源·信息与通信
组合缺一17 小时前
论 AI Skills 分布式发展的必然性:从单体智能到“云端大脑”的跃迁
java·人工智能·分布式·llm·mcp·skills
shepherd12618 小时前
深度剖析SkyWalking:从内核原理到生产级全链路监控实战
分布式·后端·skywalking
h7ml20 小时前
基于 RabbitMQ 构建异步化淘客订单处理流水线:解耦、削峰与失败重试
分布式·rabbitmq·ruby
夜月蓝汐20 小时前
分布式监控SkyWalking链路追踪
分布式·skywalking