分布式锁 - 985ch/egg-sachikawa GitHub Wiki

分布式锁用于解决分布式服务器环境下的数据一致性问题。我们通常使用分布式锁来处理那些对一致性要求很高的数据,以避免数据操作结果错误。

框架使用插件egg-redlock-9来实现分布式锁的管理。

应用场景

  • 从数据库中取出某个数据之后,需要对该数据进行一系列处理之后写回数据库的,可以使用分布式锁来避免中途有其他进程修改该数据。
  • 需要确保在一定时间内某个操作只能执行一次的,可以使用分布式锁来进行限制。
  • 某个操作有严格的先后流程的,必须在前一个操作结束之后才允许开始后一个操作的。可以使用分布式锁来实现。

使用示例

// config/config.{env}.js
exports.redlock9 = {
  clients: [ 'redis1', 'redis2', 'redis3' ], // 在这里配置对应的redis客户端,也可用client来配置单个客户端,若egg-redis没有配置clients可以省略该配置
  logger: app => e => app.info(e.message), // 获取锁失败时输出日志用的函数,可以省略
  options: { // redlock自带选项
    driftFactor: 0.01,
    retryCount: 5,
    retryDelay: 200,
    retryJitter: 50,
};
// app/service/{yourfile}.js
await app.redlock9.run(resouce, ttl, async (lock) => { /* 在这里完成你的任务 */ }); // 利用分布式锁执行任务
const success = await app.redlock9.once(resouce, async (lock)=>{ /* 在这里完成你的任务 */ }, wait, duration) // 在执行在持续时间内只执行一次的任务 

//你也可以在redlock9对象上直接使用redlock的方法,如:app.redlock.unlock(lock)

关于分布式锁的跟多内容请查看插件自身的文档