const redisClient = require('redis').createClient(6379, '127.0.0.1');
const crypto = require('crypto') const lockScript = 'return redis.call("set", KEYS[1], ARGV[1], "NX", "PX", ARGV[2])'
const unlockScript = 'if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end' redisClient.set("num","0") for(let i=0;i<1000;i++) add()
for(let i=0;i<1000;i++) add()
for(let i=0;i<1000;i++) add() async function add() {
let resourse = "lock:num"
let uniqueStr = crypto.randomBytes(10).toString('hex') await attemplock(resourse, uniqueStr)
let nowCityNum = Number(await get('num'))
num++
await set('num', String(num))
await unlock(resourse, uniqueStr)
} async function loop(resourse, uniqueStr, ttl) {
return new Promise((resolve, reject) => {
setTimeout(async () => {
let result = await lock(resourse, uniqueStr, ttl)
resolve(!!result)
}, 10)
})
} async function attemplock(resourse, uniqueStr, ttl) {
let result = await loop(resourse, uniqueStr, ttl)
if (result) {
return true
} else {
return attemplock(resourse, uniqueStr, ttl)
}
} async function lock(resourse, uniqueStr, ttl) {
ttl = ttl ? ttl : "30000"
return new Promise((resolve, reject) => {
redisClient.eval(lockScript, 1, resourse, uniqueStr, ttl, (err, reply) => {
if (err) {
console.error(err)
reject(err)
} resolve(reply)
})
})
} async function unlock(resourse, uniqueStr) {
return new Promise((resolve, reject) => {
redisClient.eval(unlockScript, 1, resourse, uniqueStr, (err, reply) => {
if (err) {
console.error(err)
reject(err)
} resolve(reply)
})
})
} async function get(key) {
return new Promise((resolve, reject) => {
redisClient.get(key, (err, reply) => {
if (err) {
console.error(err);
reject(err)
}
resolve(reply)
})
})
} async function set(key, value) {
return new Promise((resolve, reject) => {
redisClient.set(key, value, (err, reply) => {
if (err) {
console.error(err)
reject(err)
}
resolve(reply)
})
})
}
async function setnx(key, value) {
return new Promise((resolve, reject) => {
redisClient.setnx(key, value, (err, reply) => {
if (err) {
console.error(err)
reject(err)
}
resolve(reply)
})
})
}

使用redis实现nodejs并发服务的更多相关文章

  1. hydra nodejs 微服务框架简单试用

    hydra 是一个以来redis 的nodejs 微服务框架 安装 需要redis,使用docker 进行运行 redis docker run -d -p 6379:6379 redis 安装yo ...

  2. Redis作为消息队列服务场景应用案例

    NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例   一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...

  3. Redis实现高并发分布式序列号

    使用Redis实现高并发分布式序列号生成服务 序列号的构成 为建立良好的数据治理方案,作数据掌握.分析.统计.商业智能等用途,业务数据的编码制定通常都会遵循一定的规则,一般来讲,都会有自己的编码规则和 ...

  4. 关于redis的几件小事(五)redis保证高并发以及高可用

    如果你用redis缓存技术的话,肯定要考虑如何用redis来加多台机器,保证redis是高并发的,还有就是如何让Redis保证自己不是挂掉以后就直接死掉了,redis高可用 redis高并发:主从架构 ...

  5. 阿里云发布 Redis 5.0 缓存服务:全新 Stream 数据类型带来不一样缓存体验

    4月24日,阿里云正式宣布推出全新 Redis 5.0 版本云数据库缓存服务,据悉该服务完全兼容 4.0 及早期版本,继承了其一贯的安全,稳定,高效等特点并带来了全新的 Stream 数据结构及多项优 ...

  6. Redis的高并发、持久化、高可用架构设计

    就是如果你用redis缓存技术的话,肯定要考虑如何用redis来加多台机器,保证redis是高并发的,还有就是如何让Redis保证自己不是挂掉以后就直接死掉了,redis高可用 我这里会选用我之前讲解 ...

  7. 【redis】基于redis实现分布式并发锁

    基于redis实现分布式并发锁(注解实现) 说明 前提, 应用服务是分布式或多服务, 而这些"多"有共同的"redis"; (2017-12-04) 笑哭, 写 ...

  8. CentOS 7安装/卸载Redis,配置service服务管理

    Redis简介 Redis功能简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 相比于传统的关系型数据库,Redis的存储方式是key-va ...

  9. Nginx与Redis解决高并发问题

    原文链接:http://bbs.phpchina.com/forum.php?mod=viewthread&tid=229629 第一版产品采用的是Jquery,Nginx,PHP(CI框架) ...

随机推荐

  1. 【一致性检验指标】Kappa(cappa)系数

    1 定义 百度百科的定义: 它是通过把所有地表真实分类中的像元总数(N)乘以混淆矩阵对角线(Xkk)的和,再减去某一类地表真实像元总数与被误分成该类像元总数之积对所有类别求和的结果,再除以总像元数的平 ...

  2. view组件的封装是否需要特有模型?

    必须需要. 现在接手的老项目,所有自定义组件全部使用的原始的全量数据,作为模型给view用来展示. 结果发现,基本数据的选择错误,需要选择另一个数据作为基本数据,这导致一个很麻烦的问题,需要改动全部的 ...

  3. ASCII码排序(hdu2000)

    思考:字符串的输入中是不包含空格的,所以可以用scanf_s("%字符类型占位符",&变量名,整型参数)来输入字符串. 因为scanf_s()函数的输入一遇到空格就会停止输 ...

  4. 技术大佬:我去,你竟然还不会用 this 关键字

    上一篇文章写的是 Spring Boot 的入门,结果有读者留言说,Java 都还没搞完,搞什么 Spring Boot,唬得我一愣一愣的.那这篇就继续来搞 Java,推出广受好评的我去系列第四集:你 ...

  5. CSS3中的rem单位

    一.rem介绍 rem是什么? 它的全称是 font size of the root element (根元素的字体大小) 它是CSS3中新增加的一个尺寸(度量)单位,根节点(html)的font- ...

  6. springboot连接数据源,配置数据库

    Spring官方DriverManagerDataSource的配置 修改yml #配置数据源的属性 spring: datasource: driver-class-name: com.mysql. ...

  7. multipart_formdata

    import requests def sendImg(img_path, img_name, img_type='image/jpeg'): """ :param im ...

  8. Ant标签详解--基础操作

    Ant的一些核心概念: build.xml:构建文件是以XML 文件来描述的,默认构建文件名为build.xml.        project:每个构建文件包含一个工程. property:属性,一 ...

  9. 新手福利!Blazor 从入门到砖家系列教程(你真的可以成为砖家)

    注意 作为 Blazor 新手的你(不是新手就当没看到这句话),请一定走完本教程再去上手其他组件库 标题跟你开个玩笑,你真的可以通过这个系列教程成为专家! 深入浅出,我翻译过程中都学到了很多. 我们不 ...

  10. jchdl - GSL实例 - Concat

    https://mp.weixin.qq.com/s/oJY6Xj9_oM1gSmvH_dHkJg   Concat节点把多根输入线线组合成一排线输出.   参考链接 https://github.c ...