使用redis实现nodejs并发服务
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并发服务的更多相关文章
- hydra nodejs 微服务框架简单试用
hydra 是一个以来redis 的nodejs 微服务框架 安装 需要redis,使用docker 进行运行 redis docker run -d -p 6379:6379 redis 安装yo ...
- Redis作为消息队列服务场景应用案例
NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例 一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- Redis实现高并发分布式序列号
使用Redis实现高并发分布式序列号生成服务 序列号的构成 为建立良好的数据治理方案,作数据掌握.分析.统计.商业智能等用途,业务数据的编码制定通常都会遵循一定的规则,一般来讲,都会有自己的编码规则和 ...
- 关于redis的几件小事(五)redis保证高并发以及高可用
如果你用redis缓存技术的话,肯定要考虑如何用redis来加多台机器,保证redis是高并发的,还有就是如何让Redis保证自己不是挂掉以后就直接死掉了,redis高可用 redis高并发:主从架构 ...
- 阿里云发布 Redis 5.0 缓存服务:全新 Stream 数据类型带来不一样缓存体验
4月24日,阿里云正式宣布推出全新 Redis 5.0 版本云数据库缓存服务,据悉该服务完全兼容 4.0 及早期版本,继承了其一贯的安全,稳定,高效等特点并带来了全新的 Stream 数据结构及多项优 ...
- Redis的高并发、持久化、高可用架构设计
就是如果你用redis缓存技术的话,肯定要考虑如何用redis来加多台机器,保证redis是高并发的,还有就是如何让Redis保证自己不是挂掉以后就直接死掉了,redis高可用 我这里会选用我之前讲解 ...
- 【redis】基于redis实现分布式并发锁
基于redis实现分布式并发锁(注解实现) 说明 前提, 应用服务是分布式或多服务, 而这些"多"有共同的"redis"; (2017-12-04) 笑哭, 写 ...
- CentOS 7安装/卸载Redis,配置service服务管理
Redis简介 Redis功能简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 相比于传统的关系型数据库,Redis的存储方式是key-va ...
- Nginx与Redis解决高并发问题
原文链接:http://bbs.phpchina.com/forum.php?mod=viewthread&tid=229629 第一版产品采用的是Jquery,Nginx,PHP(CI框架) ...
随机推荐
- 使用CountDownLatch等待多线程
前言 CountDownLatch 允许一个或多个线程等待其他线程完成操作. 应用场景 假如有一个列表的大量数据等待处理,最后全部处理完毕后返回处理结果.普通做法就是从头遍历,一个个顺序执行,这 ...
- 王艳 201771010127《面向对象程序设计(java)》第十一周学习总结
一:理论部分. 1.数据结构:分为a.线性数据结构,如线性表.栈.队列.串.数组和文件. b.非线性数据结构,如树和图. 1)所有数据元素在同一个线性表中必须是相同的数据类型. 线性表按其存储结构可分 ...
- 【百度网盘活动】扩容2T+7天会员
https://pan.baidu.com/component/view?id=455 https://pan.baidu.com/union/smartProgramShare?scheme=bdn ...
- GRpc添加客户端的四种方式
随着微服务的发展,相信越来越多的.net人员也开始接触GRpc这门技术,大家生成GRpc客户端的方式也各不相同,今天给大家介绍一下依据Proto文件生成Rpc客户端的四种方式 前提:需要安装4个Nug ...
- eatwhatApp开发实战(十)
android应用中,很少有一个activity的app,这次我们设置一个activity,通过listview的点击跳转并显示对应的商店信息. 首先创建类ShopInfoActivity,对应设置其 ...
- Sniffer截包工具的使用
Sniffer软件的安装 sniffer需要在xp或者win2003环境下才能正常运行,如果没有这两个系统,可以安装虚拟机,在虚拟机上使用sniffer.如果没有这两个系统就会出现找不到网卡或者打不开 ...
- 创建多线程的方式&Thread类的常用方法
创建多线程的第一种方式:继承java.lang.Thread类 注意:1.一个线程只能执行一次start() 2.不能通过Thread实现类对象的 run()去启动一个线程 3.增加加一个线程,需要新 ...
- CNN卷积神经网络的卷积层、池化层的输出维度计算公式
卷积层Conv的输入:高为h.宽为w,卷积核的长宽均为kernel,填充为pad,步长为Stride(长宽可不同,分别计算即可),则卷积层的输出维度为: 其中上开下闭开中括号表示向下取整. MaxPo ...
- JVM系列.JVM内存模型
<Java虚拟机规范>将虚拟机的内存分为以下几个区域: 堆区:堆区是JVM中最大的一块内存区域,按照垃圾分代收集的角度划分,又可以分成年轻代和老年代,而年轻代内存又被分成三部分,Eden空 ...
- 高性能可扩展mysql 笔记(六) SQL执行计划及分页查询优化、分区键统计
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 常见业务处理 一.使用数据库处理常见业务: 案例: 如何对评论进行分页展示 使用 EXPLAIN 获得s ...