在 EggJS 中实现 Redis 上锁
配置环境
下载 Redis
Windows
访问 https://github.com/microsoftarchive/redis/releases 选择版本进行下载 - 勾选 [配置到环境变量] - 无脑下一步并安装

命令行执行:redis-cli -v 查看已安装的 Redis 版本,能成功查看就表示安装成功啦~
Mac
brew install redis # 安装 redis
brew services start redis # 启动 redis
brew services stop redis # 停止 redis
brew services restart redis # 重启 redis
启动 Redis
打开任务管理器,找到 Redis 服务,点击启动即可

配置 EggJS 项目
- 安装依赖
pnpm i egg-redis
- 配置插件
// config/plugin.js
exports.redis = {enable: true,package: 'egg-redis',
};
// config/config.default.js
exports.redis = {client: {port: 6379, // Redis porthost: '127.0.0.1', // Redis hostpassword: '',db: 0,},
};
- 扩展 helper
// app/extend/helper.js
module.exports = {// 生成 redis 锁的控制器; val 为随机数, 防止解锁时误删其他请求的锁redisLockController(key, val = Math.random(), ttl = 5 * 60) {const app = this.app;return {// 上锁async lock() {// 使用 set 命令上锁并设置过期时间, 保证原子性const lockResult = await app.redis.set(key,val,'EX',ttl,'NX');return lockResult === 'OK';},// 解锁async unlock() {// 使用 lua 脚本校验锁并解锁, 保证原子性const script = `if redis.call('get', KEYS[1]) == ARGV[1] thenreturn redis.call('del', KEYS[1])elsereturn 0end`;// 使用 eval 命令执行 lua 脚本const unlockResult = await app.redis.eval(script, 1, key, val);return unlockResult === 1;},};},
};
- 使用 redis 上锁
// app/controller/home.js
const { Controller } = require('egg');module.exports = class HomeController extends Controller {async index() {const { id } = this.ctx.query;const result = await this.service.home.index(id);this.ctx.body = result;}
};
// app/service/home.js
const { Service } = require('egg');module.exports = class HomeService extends Service {async index(id = 0) {// 从 header 中获取 region 参数const region = this.ctx.get('region') || 'default';// 生成锁的 keyconst lockKey = `lock:${region}:${id}`;// 获取锁的控制器const { lock, unlock } = this.ctx.helper.redisLockController(lockKey);// 上锁const lockResult = await lock();// 上锁失败if (!lockResult) return { code: 500, msg: 'lock failed' };// 上锁成功, 执行业务逻辑let result;try {result = await this.mockSql(id);} catch (err) {result = { code: 500, msg: err.message };}// 解锁await unlock();// 返回结果return result;}// 模拟数据库查询async mockSql(id) {// 2s 后返回结果return new Promise((resolve) => {setTimeout(() => {resolve({code: 200,msg: 'success',data: { id, desc: 'egg is very good', time: Date.now() },});}, 2000);});}
};
模拟抢锁
开两个浏览器访问 http://localhost:7001 即可模拟抢锁的场景
相关文章:
在 EggJS 中实现 Redis 上锁
配置环境 下载 Redis Windows 访问 https://github.com/microsoftarchive/redis/releases 选择版本进行下载 - 勾选 [配置到环境变量] - 无脑下一步并安装 命令行执行:redis-cli -v 查看已安装的 Redis 版本,能成功查看就表示安装成功啦~ Mac brew i…...
Unity-场景
创建场景 创建新的场景后: 文件 -> 生成设置 -> Build中的场景 -> 将项目中需要使用的场景拖进去 SceneTest public class SceneTest : MonoBehaviour {// Start is called before the first frame updatevoid Start(){// 两个类: 场景类、场…...
MATLAB R2023b for Mac 中文
MATLAB R2023b 是 MathWorks 发布的最新版本的 MATLAB,适用于进行算法开发、数据可视化、数据分析以及数值计算等任务的工程师和科学家。它包含了一系列新增功能和改进,如改进了数据导入工具,增加了对数据帧和表格对象的支持,增强…...
01 MyBatisPlus快速入门
1. MyBatis-Plus快速入门 版本 3.5.31并非另起炉灶 , 而是MyBatis的增强 , 使用之前依然要导入MyBatis的依赖 , 且之前MyBatis的所有功能依然可以使用.局限性是仅限于单表操作, 对于多表仍需要手写 项目结构: 先导入依赖,比之前多了一个mybatis-plus…...
HarmonyOS 应用开发入门
HarmonyOS 应用开发入门 前言 DevEco Studio Release版本为:DevEco Studio 3.1.1。 Compile SDK Release版本为:3.1.0(API 9)。 构建方式为 HVigor,而非 Gradle。 最新版本已不再支持 (”Java、JavaScrip…...
【机器学习300问】9、梯度下降是用来干嘛的?
当你和我一样对自己问出这个问题后,分析一下!其实我首先得知道梯度下降是什么,也就它的定义。其次我得了解它具体用在什么地方,也就是使用场景。最后才是这个问题,梯度下降有什么用?怎么用? 所以…...
第13章 1 进程和线程
文章目录 程序和进程的概念 p173函数式创建子进程Process类常用的属性和方法1 p175Process类中常用的属性和方法2 p176继承式创建子进程 p177进程池的使用 p178并发和并行 p179进程之间数据是否共享 p180队列的基本使用 p180使用队列实现进程之间的通信 p182函数式创建线程 p18…...
什么是中间件?
文章目录 为什么需要中间件?中间件生态漫谈数据库中间件读写分离分库分表引进数据库中间件MyCat 服务端代理模式ShardingJDBC 客户端代理模式 总结 IT 系统从单体应用逐渐向分布式架构演变,高并发、高可用、高性能、分布式等话题变得异常火热,…...
汽车售后服务客户满意度调查报告
本文由群狼调研(长沙旅行社满意度调查)出品,欢迎转载,请注明出处。汽车售后服务客户满意度调查报告通常包括以下内容: 1.调研概况:介绍调研的目的、背景和范围,包括调研的时间、地点和样本规模等…...
初始RabbitMQ(入门篇)
消息队列(MQ) 本质上就是一个队列,一个先进先出的队列,队列中存放的内容是message(消息),是一种跨进程的通信机制,用于上下游传递消息, 为什么使用MQ: 削峰填谷: MQ可以很好的做一个缓冲机制,例如在一个系统中有A和B两个应用,A是接收用户的请求的,然后A调用B进行处理. 这时…...
JVM:Java类加载机制
Java类加载机制的全过程: 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始, 这是为了支持Java…...
要经历痛苦,才能在赚钱路上觉醒!
新手赚钱,一个秘诀就够了! 黎明前的黑暗实际是最漫长的,就如同开发进度99%到100%这个过程尤其漫长。赚钱的路上起初就是黑暗,不断地摸索最终才能走出迷雾,真正的迎接朝阳。如果有一段路程,十来公里的路线&a…...
LeetCode 第381场周赛个人题解
目录 100191. 输入单词需要的最少按键次数 I 原题链接 题目描述 思路分析 AC代码 100188. 按距离统计房屋对数目 I 原题链接 题目描述 思路分析 AC代码 100192. 输入单词需要的最少按键次数 II 原题链接 题目描述 思路分析 AC代码 100213. 按距离统计房屋对数目…...
数据结构之二叉树的性质与存储结构
数据结构之二叉树的性质与存储结构 1、二叉树的性质2、二叉树的存储结构 数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,…...
机器视觉检测设备在连接器外观缺陷检测中的应用
作为传输电流或信号连接两个有源器件的器件,连接器被广泛应用于各个行业,从手机、平板、电脑,到冰箱、空调、洗衣机,再到汽车、国防、航空,处处是它的所在。每个电子产品少了连接器将无法运作,因此…...
ChatGPT vs 文心一言(AI助手全面比较)
随着人工智能的不断发展,ChatGPT(OpenAI)和文心一言都代表了当前先进的自然语言处理技术。它们在智能回复、语言准确性和知识库丰富度等方面都有各自的优势。在下面的比较中,我们将从多个角度探讨这两个AI助手,帮助你更…...
MSPM0L1306例程学习-UART部分(2)
MSPM0L1306例程学习系列 1.背景介绍 写在前边的话: 这个系列比较简单,主要是围绕TI官网给出的SDK例程进行讲解和注释。并没有针对模块的具体使用方法进行描述。所有的例程均来自MSPM0 SDK的安装包,具体可到官网下载并安装: https://www.ti…...
Baichuan2百川模型部署的bug汇总
1.4bit的量化版本最好不要在Windows系统中运行,大概原因报错原因是bitsandbytes不支持window,bitsandbytes-windows目前仅支持8bit量化。 2. 报错原因是机器没有足够的内存和显存,offload_folder设置一个文件夹来保存那些离线加载到硬盘的权…...
ChatGPT 如何解决 “Something went wrong. lf this issue persists ….” 错误
Something went wrong. If this issue persists please contact us through our help center at help.openai.com. ChatGPT经常用着用着就出现 “Something went wrong” 错误,不管是普通账号还是Plus账号,不管是切换到哪个节点,没聊两次就报…...
怎么移除WordPress后台工具栏的查看站点子菜单?如何改为一级菜单?
默认情况下,我们在WordPress后台想要访问前端网站,需要将鼠标移动到左上角的站点名称,然后点击下拉菜单中的“查看站点”才行,而且还不是新窗口打开。那么有没有办法将这个“查看站点”子菜单变成一级菜单并显示在顶部管理工具栏中…...
百度网盘Mac版终极破解指南:免费解锁SVIP高速下载体验
百度网盘Mac版终极破解指南:免费解锁SVIP高速下载体验 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘Mac版的下载速度限制而…...
D1021UK,125W高功率输出的推挽式DMOS RF FET射频晶体管
简介今天我要向大家介绍的是 TT Electronics/Semelab 的金金属化多用途硅DMOS RF FET晶体管——D1021UK。这是一款专为HF/VHF/UHF通信频段(1 MHz至400 MHz)设计的推挽式(Push-Pull)射频功率场效应管,在28V工作电压下可…...
Pearcleaner:Mac应用彻底清理的终极解决方案,告别数字垃圾困扰
Pearcleaner:Mac应用彻底清理的终极解决方案,告别数字垃圾困扰 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 还在为Mac应用卸载后残…...
2026届必备的五大AI写作网站实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 现如今人工智能内容生成技术被广泛运用,好多创作者依靠它迅速生成文章标题。然而…...
如何快速实现Android Studio中文界面:终极完整汉化指南
如何快速实现Android Studio中文界面:终极完整汉化指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Android…...
别再问客服了!手把手教你用VNC在AutoDL GPU服务器上跑起你的第一个GUI程序
云端GPU服务器VNC实战:从零部署GUI开发环境全指南 租用云GPU服务器进行深度学习训练已成为算法工程师的常态,但当代码涉及图形界面时,许多开发者会在cv2.imshow()或PyQt窗口弹出的环节卡壳。本文将基于AutoDL平台,详解如何通过Tur…...
Beyond Compare 5密钥生成终极指南:从激活失败到完全使用
Beyond Compare 5密钥生成终极指南:从激活失败到完全使用 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 你是否也遇到过Beyond Compare 5弹出"评估模式错误"的困扰&#…...
在华为欧拉openEuler 22.03 SP2上搞定Oracle 11g R2:一个踩坑无数的可视化安装实录
在华为欧拉openEuler 22.03 SP2上搞定Oracle 11g R2:一个踩坑无数的可视化安装实录 当国产操作系统遇上传统商业数据库,这场跨越技术栈的"联姻"注定充满挑战。作为在openEuler 22.03 SP2上成功部署Oracle 11g R2的实践者,我将以时间…...
5分钟搞定虚拟显示器:ParsecVDD终极指南,解锁4K游戏串流新境界
5分钟搞定虚拟显示器:ParsecVDD终极指南,解锁4K游戏串流新境界 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 你是否曾经因为物理显示器限制而无法获得完…...
Rust 服务器存档管理 地图配置指南
对于想要自建游戏服务器的玩家,云鸢互联是一个不错的专业联机平台选择。它提供稳定、低延迟且724小时在线的服务器环境,助你轻松打造专属游戏世界。平台主打极致的新手友好——全图形化控制面板,无需编写代码,也无需掌握Linux命令…...
