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

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

作者: 爱吃酸菜的_鱼 | 来源:发表于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"

相关文章

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

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

  • 对java锁的理解

    比如淘宝抢购的时候,数量有限 多个用户共同抢购,调用同一个方法,必须上锁synchronized,避免数据库更新错误。

  • MT2503D 按键编程

    方法一 所有按键的消息都经过dev_key_handle进行处理,所以一个简单粗暴的方法就是将自己的按键处理函数添...

  • selenium---警告框处理

    目前selenium处理JavaScript方法很简单,只是需要调用一个方法就可以哈 accept() 点击...

  • 2022-09-27

    赢家把投资看得很简单,只用简单的方法去处理;输家把投资看得很复杂,就用复杂的方法来对待。一个事物,简单还是复杂,不...

  • python版:单机redis实现秒杀,防止超限

    测试环境 ubuntu 16.04 python 3.6.6 redis 3.0.6 简单描述 抢购、秒杀是一个很...

  • Java字符串处理

    一,异常处理 1.简单粗暴的,直接打印 如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关...

  • 高并发下用户抢购问题简答

    高并发下用户抢购问题简答 前言 面试题当中如何处理高并发用户抢购问题可以说是一个十分经典的问题,经常被提及,在这就...

  • 开篇,[Spring]我踩的@Async坑

    Spring里提供了对大处理的多线程支持。对一个service的方法来说,这个@Async注解就可以简单实现处理的...

  • 一个导入数据的简单处理

    由于觉得公司对于导入数据处理的五花八门有特别啰嗦,所以写着这么一个工具方法供大家用,专门处理导入的excel数据 ...

网友评论

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

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