一个简单的处理抢购的一个方法

抢购

抢购是一个开发中很容易遇到的问题,不管是抢购也好还是什么也好都会遇到高并发下数据可能出现超卖的这种现象。

解决思路

  1. 关系型数据库 加锁
  2. 放在消息队列中
    这里主要是第二种解决方案

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 = `

Count:, alredy in queue!

` }); 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"

你可能感兴趣的:(一个简单的处理抢购的一个方法)