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

抢购

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

解决思路

  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 = `<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"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容