锁是一种安全机制。是对数据可靠性的保护。
以前在单机部署模式的时候,常用java lock 。现在微服务的分布式。部署到不同的机器上的服务需要通过中间件进行加锁。
最简单的模拟的场景是,两个台机子(或者两个服务)执行定时任务。本意是:这个定时任务只要执行一次就好。结果两个都执行了。
解决方案:
利用redis作为中间件,实现分布式锁。考虑到可能中途出错,无法释放锁的问题。
引用老钱的话
为了治理这个乱象,Redis 2.8 版本中作者加入了 set 指令的扩展参数,使得 setnx 和 expire 指令可以一起执行,彻底解决了分布式锁的乱象。从此以后所有的第三方分布式锁 library 可以休息了。
> set lock:codehole true ex 5 nx OK ... do something critical ... > del lock:codehole
上面这个指令就是 setnx 和 expire 组合在一起的原子指令,它就是分布式锁的奥义所在。... https://juejin.im 掘金 — 一个帮助开发者成长的社区