zoukankan      html  css  js  c++  java
  • 借助Redis做秒杀和限流的思考

    最近群里聊起秒杀和限流,我自己没有做过类似应用,但是工作中遇到过更大的数据和并发。

    于是提出了一个简单的模型:

    var count = rds.inc(key);

    if(count > 1000) throw "已抢光!"

    借助Redis单线程模型,它的inc是安全的,确保每次加一,然后返回加一后的结果。如果原来是234,加一了就是235,返回的一定是235,在此中间,不会有别的请求来打断从而导致返回236或者其它。

    其实我们可以理解为inc的业务就是占坑排队,每人占一个坑,拿到排队小票后看看是不是超额了,再从业务层面输出秒杀结果,甚至做一些更加复杂的业务。

    六条提到限流,可能基于某种考虑,希望把key对应的count给限制在1000附近,可以接受1%偏差。

    于是有了改进模型:

    var count = rds.inc(key);

    if(count > 1000){

        rds.dec(key);

        throw "超出限额!"

    就加了一句,超出限额后,把小票给减回去^_^

    采用Redis有一个好处,比如支持很多应用服务器一起抢……

    当然,对于很大量的秒杀,这个模型也不一定合理,比如要枪10万部手机,然后来了300万用户,瞬间挤上来。

    这里有个变通方法可以试一下,那就是准备10个Redis实例,每个放1万。用户请求过来的时候,可以随机数或者散列取模,找对应实例来进行抢购。

    同理可以直接更多用户的场景。总的来说,在数据较大的时候,随机和散列就具有一定统计学意义,相对来说是比较均衡的。

  • 相关阅读:
    让你一次性搞定堆、栈、值类型、引用类型…… (Part 2) (zt)
    延时加载图片(原创)
    Bambook 简介
    无框架Ajax分页(原创)
    windows系统下Python环境的搭建
    将制定内容输出为压缩后的xls文件
    (原创)对DateTime进行强制约束
    VS 2010中JS代码折叠插件
    延时加载图片(终极版,解决一行多张图片无法显示的问题)
    javascript this详解(转)
  • 原文地址:https://www.cnblogs.com/maomaochong123/p/8306695.html
Copyright © 2011-2022 走看看