Redis lock
- 性能高(寫在memory)、 最終一致性
- 預防死鎖(Deadlock free),Lock在ttl後自動釋放,避免握有lock的client當機,lock不能被釋放
- 分布式鎖,避免單點故障(Fault Tolerance),redis跨cluster部署
- 互斥(mutual exclusive),同一時間只有一個client可以取得鎖
Demo
流程
redlock & ioredis
|
|
redisLock 放在程式碼的入口
輪流取得資源(redis lock)
|
|
Redis
單個Redis Node
用SETNX + PX 上鎖,搭配lua腳本取鎖、釋放鎖
SETNX: SET if Not exists PX: expiration (milliseconds) lua腳本:若同一個人在ttl內取得已經上鎖的鎖,則可以把鎖釋放
|
|
多個Redis Node
Redlock演算法
Redis 實例數量設定 N >= 3 的奇數
如果同一個資源被過半數以上的 Redis Nodes 取得,
且時間小於ttl - 系統允許誤差時間, 則該資源可以被鎖住
節點需要在5-50ms取得鎖,否則timeout(防止節點死亡,資源被卡住)
|
|
Tools
- node version: v16.19.1
- redlock “^4.2.0”(目前最新版是 5.0.0-beta.2,目前仍有bug,建議降版使用 4.2.0 版本)
- ioredis: “^5.4.1”
Reference
面试官:说一下红锁RedLock的实现原理? https://www.cnblogs.com/vipstone/p/18036976
Redis Lock (Redlock) 分散式 lock 原理分析與實作: https://yuanchieh.page/posts/2020/2020-01-14_redis-lock-redlock-%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90%E8%88%87%E5%AF%A6%E4%BD%9C/
Distributed Locks with Redis: https://redis.io/docs/latest/develop/use/patterns/distributed-locks/
node-redlock: https://github.com/mike-marcacci/node-redlock
Achieving Distributed Locking in Node.js with Redis and Redlock: https://medium.com/@ayushnandanwar003/achieving-distributed-locking-in-node-js-with-redis-and-redlock-0574f5ac333d