抢购
抢购是一个开发中很容易遇到的问题,不管是抢购也好还是什么也好都会遇到高并发下数据可能出现超卖的这种现象。
解决思路
- 关系型数据库 加锁
- 放在消息队列中
这里主要是第二种解决方案
kue
npm i kue --save
具体的怎么使用参考: kue
code
- index.js
const Koa = require('koa');
const kue = require('kue')
const Redis = require('ioredis');
const router = require('koa-router')();
const redis = new Redis();
const app = new Koa();
const queue = kue.createQueue();
router.get('/', async (ctx, next) => {
queue.create('queue',{title:"Test"}).priority(-10).save()
ctx.response.body = `<h1>Count:, alredy in queue!</h1>`
});
app.use(router.routes());
app.listen(3000,async ()=>{
await redis.hmset('testOnly',{count:1000})
console.log('app started at port 3000...');
});
- queue.js
const Redis = require('ioredis');
const kue = require('kue')
const queue = kue.createQueue();
const redis = new Redis();
orderProduct = async (cb)=>{
let vData = await redis.hmget('testOnly',["count"])
let vCount = vData[0]
let vReqData = await redis.hmget('reqCount',["count"])
let vReqCount = Number(vReqData[0])
await redis.hmset('reqCount',{count:vReqCount + 1})
if(vCount <= 0){
cb()
}
else {
await redis.hmset('testOnly',{count:vCount-1})
cb()
}
}
queue.process('queue',(done)=>{
orderProduct(job,done)
})
kue.app.listen( 3011 )
- 测试
~ » ab -n 10000 -c 500 http://127.0.0.1:3000/
查看请求数
127.0.0.1:6379> HMGET 'reqCount' count
1) "10001"
这里的结果其实是 10000 从1开始的。。。
查看剩余数
127.0.0.1:6379> HMGET 'testOnly' count
1) "0"