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. HDU1588

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1588 题目大意:g(i)= k * i + b. 给定 k 和 b,求0 <= i < n ...

  2. Lowest Common Multiple Plus(hdu2028)

    思考: 乘法爆咋数据.把int换成unsigned就过了,同时%d换成%u.求最大公约数和最小公倍数. #include<stdio.h> int gcd(unsigned x, unsi ...

  3. Spring全家桶——SpringBoot渐入佳境

    Spring全家桶系列--SpringBoot渐入佳境 萌新:小哥,我在实体类写了那么多get/set方法,看着很迷茫 小哥:那不是可以自动生成吗? 萌新:虽然可以自动生成,但是如果我要修改某个变量的 ...

  4. Docker 错误:network xxx id xxxx has active endpoints

    问题描述:Docker Compose 部署的项目,使用docker-compose down 命令关闭时,提示错误: Removing network xxxl_default ERROR: net ...

  5. python_Excel_xlwt

    xlwt 创建excel,向excel写入数据,并保存数据 安装 推荐方法: 通过pip 安装,方便简洁,如下图所示: 导入 import xlrd 创建workbook(即excel) book = ...

  6. Java-LinkedList围圈的人名

    import java.util.*; public class Example12_7 { public static void main(String[] args) { int m=5; Lin ...

  7. MVC设计模式-查询与删除

    MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式,它把应用程序分成三个核心模块: 模型:模型是应用程序的主体部分,模型表示业务数据和业务逻辑. 一个 ...

  8. 50个SQL语句(MySQL版) 问题一

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  9. CentOS安装Python3.5

    1.  安装python3.5可能使用的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel s ...

  10. Rocket - subsystem - CrossingWrapper

    https://mp.weixin.qq.com/s/3-MfNJDCIgOBqUbf4fuerQ 简单介绍CrossingWrapper的实现. 1. CrossesToOnlyOneClockDo ...