首页 > 编程语言 >node 使用 redlock 分布式锁

node 使用 redlock 分布式锁

时间:2024-03-19 10:34:50浏览次数:22  
标签:node acceptNum const redlock lock redis redisClient 分布式

'use strict';
const Service = require('egg').Service; const moment = require('moment'); const redis = require('redis'); const RedlockClass = require('redlock'); const { port, host, password } = require('../../../config/config.default')({ getter: 'redis' }).client;
class BusinessHandlingService extends Service {   // sql实例   sqlClient() {     return this.ctx.state.sqlClient || this.app.mysql.get(this.ctx.session.sqlName)   }
  // redlock实例   redlockClient() {     // redis客户端     const redisClient = redis.createClient(port, host, { password: password, db: '1' })     redisClient.on('redisClient-err', err => { redisClient.quit() })
    const redlock = new RedlockClass(       [redisClient],       {         driftFactor: 0.01, // 漂移值         retryCount: 60, // 重试次数         retryDelay: 500, // 重试间隔         retryJitter: 200 // 间隔增量随机最大值       }     )
    return redlock   }
  // 生成受理单号   async createBusNo() {     const { ctx } = this
    // 分布式锁     const redlockClient = this.redlockClient()     const flag = `createBus` // 锁名(场景唯一标识)     const ttl =  1 * 30 * 1000 // 有效期(过期自动释放锁)     const lock = await redlockClient.lock(flag, ttl).then(lock => lock).catch(err => false)     if (!lock) {       return { code: 1, msg: '【生成受理单号】系统繁忙,请稍后重试' }     }
    // 新增号     const nowDate = moment().format('YYYYMMDD')     const lastNoRes = await this.sqlClient().query(`select substring(acceptNum, -4) as no from bus_accept_num where acceptNum is not null and substring(acceptNum, 1, 8) = '${nowDate}' order by (substring(acceptNum, -4)) desc limit 0, 1`)     const no = lastNoRes.length ? +lastNoRes[0].no : 0     const acceptNum = nowDate + ('' + (no + 1)).padStart(4, 0) // 202403180009
    // 记录号     await this.sqlClient().insert('bus_accept_num', { acceptNum, acceptTime: moment().format('YYYY-MM-DD HH:mm:ss') })
    // 解锁     lock.unlock()     return { code: 0, data: { acceptNum }, msg: '受理单号生成成功' }   } }

标签:node,acceptNum,const,redlock,lock,redis,redisClient,分布式
From: https://www.cnblogs.com/senjer/p/18082185

相关文章

  • NodeJS 中的设计模式
    Node.js是一个流行的JavaScript运行时,允许开发者使用事件驱动、非阻塞I/O模型构建可扩展的网络应用程序。和任何复杂的框架一样,Node.js应用程序可以从使用成熟的设计模式中受益,以促进代码重用、可维护性和健壮性。本文将概述一些对Node.js开发非常有用的设计模式。......
  • 分布式锁的详细解释
    什么是分布式锁  分布式锁是一种用于协调分布式系统中多个进程或线程之间访问共享资源的机制。在分布式系统中,多个进程或线程可能同时竞争访问某个共享资源,为了避免并发访问导致的数据不一致或冲突,需要使用分布式锁来保证资源的独占性。分布式锁使用互斥的方式来控制对共......
  • 搭建完全分布式
    下载网络工具1.进入rootsuroot2.进入指定路径3.编辑文件viifcfg-eno*no改为yesvi文件时,i编辑模式,esc退出编辑模式,:wq保存退出,:q!退出4.重启网络服务servicenetworkrestart5.下载网络工具yuminstall-ynet-tools使用SecureCRT使用时请求超时,虚拟机可以ping主机,......
  • 使用nvm解决nodejs版本切换
    https://nvm.uihtm.com/首先电脑完全卸载电脑上已经安装的nodejs然后查看一下一下文件是否存在,存在就删除C:\ProgramFiles(x86)\NodejsC:\ProgramFiles\NodejsC:\Users\用户名\AppData\Roaming\npmC:\Users\用户名\AppData\Roaming\npm-cacheC:\Users\用户名.npmrcnvm......
  • 【Linux】基础 IO(文件系统 & inode & 软硬链接)-- 详解
    一、理解文件系统1、前言我们一直都在说打开的文件,磁盘中包含了上百万个文件,肯定不可能都是以打开的方式存在。其实文件包含打开的文件和普通的未打开的文件,下面重点谈谈未打开的文件。我们知道打开的文件是通过操作系统被进程打开,一旦打开,操作系统就要维护多个文件,所以它......
  • 从单机到分布式微服务,大文件校验上传的通用解决方案
    一、先说结论本文将结合我的工作实战经历,总结和提炼一种从单体架构到分布式微服务都适用的一种文件上传和校验的通用解决方案,形成一个完整的方法论。本文主要解决手段包括多线程、设计模式、分而治之、MapReduce等,虽然文中使用的编程语言为Java,但解决问题和优化思路是互通的,......
  • 有手就会做!保姆级Jmeter分布式压测操作流程(图文并茂)
    分布式压测原理分布式压测操作保证本机和执行机的JDK和Jmeter版本一致配置Jmeter环境变量配置Jmeter配置文件上传每个执行机服务jmeterchmod-R755apache-jmeter-5.1.1/执行机配置写自己的ip控制机配置所有执行机ip,把server.rmi.ssl.disable改成true将本机也作......
  • node后端helmet中间件
    认识helmethelmet是一个Node.js的中间件,用于增强Web应用程序的安全性。它通过设置各种HTTP头来增加安全性,以防止一些常见的攻击。作用以下是一些helmet中间件可以帮助你处理的安全问题:设置HTTP头部:helmet可以设置诸如X-Frame-Options、X-XSS-Protection、S......
  • 第四章、nodejs高级
    目录十六、知识点补充1、环境变量十六、知识点补充1、环境变量//1、nodejs自带模块化功能,一个js文件就是一个模块console.log(this===global)//false//2、console.time('start')和console.timeEnd('start')记录时间间隔console.time('start')letnum=0for(leti......
  • HDFS分布式文件系统
    HDFS分布式文件系统一、HDFS概念HDFS介绍HDFS是HadoopDistributeFileSystem的简称,意为:Hadoop分布式文件系统。是Hadoop核心组件之一,作为最底层的分布式存储服务而存在。分布式文件系统解决的问题就是大数据存储。它们是横跨在多台计算机上的存储系统。分布式文件系统在大......