可靠的分布式锁和应用场景
流芳不待人 9/14/2022
分布式锁,是分布式场景基本操作,是必须完全掌握的东西。
关于分布式锁相关的文章已经很多了,随便一个都讲得很清楚。
比如:https://mp.weixin.qq.com/s/xZAPAPQprXTSScoCvGkO4Q (opens new window)
一般分布式锁风险点在于:
- 规避死锁,Redis锁超时和抢锁操作必须是原子的
- 规避锁误删除,Redis 解锁要用Lua去检查,保证检查和删除操作是原子的
- Redis 分布式锁可以通过 RedLock 规避单机风险
# 其他
# 1.是否需要重入锁
Redission 通过 Lua 支持了可重入锁。
然而重入锁一般是不需要。
如果需要用到重入锁,一般是设计不合理,可以尝试更优化的设计。
# 2.控制锁粒度
假如多个请求要同时修改用户信息,为了防止数据被写花需要抢锁。
常规情况是根据 uid 加锁。
但是其实可以把粒度调小:
- 修改昵称的只加 uid 昵称锁
- 修改手机号可以只加手机号锁
# 3.脚本抢锁要注意锁过期
执行脚本一般时间会比较长,不可控因素更多,因此更容易遇到锁过期。
比较好的办法是使用 zookeeper 或者使用 Redission 的 watchdog 锁续期。