美文网首页
一个简单的处理抢购的一个方法

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

作者: 爱吃酸菜的_鱼 | 来源:发表于2017-08-22 15:57 被阅读0次

    抢购

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

    解决思路

    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"
    

    相关文章

      网友评论

          本文标题:一个简单的处理抢购的一个方法

          本文链接:https://www.haomeiwen.com/subject/dleldxtx.html