借助redis做秒杀和限流的思考

物联网、大数据      2022-02-17     689

关键词:

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

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

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万。用户请求过来的时候,可以随机数或者散列取模,找对应实例来进行抢购。

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

 

上面是大量秒杀的简单场景,那么小数据场景呢?比如就只有几万并发的场景

小数据场景,单应用实例,可以考虑把Redis都给省了。

初级模型:

Interlocked.Increase(ref count);

if(count >= 1000) throw "抢光啦!"

中级模型:

private volatile Int32 count;

var old = 0;

do {

    old = count;

    if(old >= 1000) throw "抢光啦!"

}while(Interlocked.CompareExchange(ref count, old + 1, old) != old);

这个CAS原子操作可是好东西,在x86指令集下有专门指令CMPXCHG来处理,在处理器级别确保比较和交换数据的原子性。大多数系统想要迈过10万tps的门槛向100万tps靠齐,就必须得实现无锁操作lock-free,其中CAS是最为简单易懂,尽管有时候有ABA问题,但我们可以找到许多解决办法。

 

在实际使用场景中,可能有更复杂的需求,那就另当别论,这里只能班门弄斧几个简单易用的模型。

dubbo是如何控制并发数和限流的?(代码片段)

ExecuteLimitFilterExecuteLimitFilter,在服务提供者,通过的"executes"统一配置项开启:表示每服务的每方法最大可并行执行请求数。ExecuteLimitFilter是通过信号量来实现的对服务端的并发数的控制。ExecuteLimitFilter执行流程:首先会... 查看详情

用idea基于springboot2+mybatis+redis实现一个秒杀系统

实现一个秒杀系统,采用springboot2.x+mybatis+redis+swagger2+lombok实现。先说说基本流程,就是提供一个秒杀接口,然后针对秒杀接口进行限流,限流的方式目前我实现了两种,上次实现的是累计计数方式,这次还有这个功能,并且我... 查看详情

双十一电商java开发聊聊秒杀限流的多种实现

...滴水穿石非一日之功,罗马也不是一天就建成的。两周前秒杀案例初步成型,分享到了中国最大的同性交友网站-码云。同时也收到了不少小伙伴的建议和投诉。我从不认为分布式、集群、秒杀这些就应该是大厂的专利,在互联... 查看详情

springcloudgateway之限流操作

...考技术A高并发系统常用三板斧来保护系统:缓存、降级和限流,API网关作为所有请求的入口,请求量大,可以通过对并发访问的请求进行限速来保护系统的可用性。常用的限流算法比如有令牌桶算法,漏桶算法,计数器算法等... 查看详情

秒杀系统关注的问题

秒杀系统关注的问题服务单一职责+独立部署(秒杀服务即使自己扛不住压力,挂掉了,不能影响其他系统)秒杀链接加密防止恶意攻击,模拟秒杀请求,1000次/s攻击,防止链接暴露,自己的工作... 查看详情

电商的秒杀和抢购

...自:【问底】徐汉彬:Web系统大规模并发——电商秒杀与抢购电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万... 查看详情

istio熔断限流

Istio使用目标规则中的TrafficPolicy属性来配置熔断和限流,其中connectionPool属性配置限流方式,outlierDetection配置异常检测的熔断方式。下面,来分别看一下这二者是如何配置的。 1.ConnectionPool下有TCP和HTTP两个类别的配置,二者... 查看详情

redis限流的3种方式,还有谁不会

参考技术A面对越来越多的高并发场景,限流显得尤为重要。当然,限流有许多种实现的方式,Redis具有很强大的功能,我用Redis实践了三种的实现方式,可以较为简单的实现其方式。Redis不仅仅是可以做限流,还可以做数据统计... 查看详情

解密秒杀系统架构,不是所有的系统都能做秒杀!(代码片段)

摘要:教你如何设计一个秒杀系统架构:从电商系统架构到秒杀系统、从高并发“黑科技”与致胜奇招到服务器硬件优化,全方位立体掌握秒杀系统架构!!本文分享自华为云社区《实践出真知:全网最强... 查看详情

高并发三个方案

...开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。本文结合作者的一些经验介绍限流的相关概念、算法和常规的实现方式。限流的算法常见的限流算法有:计数器、漏桶和令牌桶算法。计数器计数器是最简单粗暴... 查看详情

springcloudgateway限流操作

开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。API网关作为所有请求的入口,请求量大,我们可以通过对并发访问的请求进行限速来保护系统的可用性。常用的限流算法比如有令牌桶算法,漏桶算法,计数器算... 查看详情

解决redis秒杀超卖的问题

我们再使用redis做秒杀程序的时候,解决超卖问题,是重中之重。以下是一个思路。  用上述思路去做的话,我们再用户点击秒杀的时候,只需要检测,kucun_count中是否能pop出数据,如果能pop出来则证明还有库存,且秒杀成功... 查看详情

redis限流的3种方式,还有谁不会!

...,Java干货及时送达面对越来越多的高并发场景,限流显示的尤为重要。当然,限流有许多种实现的方式,Redis具有很强大的功能,我用Redis实践了三种的实现方式,可以较为简单的实现其方式。Redis不仅仅... 查看详情

redis限流的3种方式,还有谁不会..(代码片段)

面对越来越多的高并发场景,限流显示的尤为重要。当然,限流有许多种实现的方式,Redis具有很强大的功能,我用Redis实践了三种的实现方式,可以较为简单的实现其方式。Redis不仅仅是可以做限流,还可... 查看详情

springboot接口-如何实现接口限流之单实例(代码片段)

...;系统可能会出现卡死、崩溃的情况,所以就有了降级和限流。在接口层如何做限流呢?本文主要回顾限流的知识点,并实践单实例限流的一种思路。SpringBoot接口-如何实现接口限流之单实例准备知识点为什么要限流限... 查看详情

电商系统架构如何做秒杀?分析与实战来了!(代码片段)

点击上方关注“终端研发部”设为“星标”,和你一起掌握更多数据库知识来源:https://my.oschina.net/xianggao/blog/5249431秒杀业务分析正常电子商务流程(1)查询商品; (2)创建订单; (3)... 查看详情

主流的几种限流策略,我都可以通过python+redis实现(代码片段)

...漏桶redis-cell保护高并发系统的三大利器:缓存、降级和限流。那什么是限流呢?用我没读过太多书的话来讲,限流就是限制流量。我们都知道服务器的处理能力是有上限的,如果超过了上限继续放任请求进来的话... 查看详情

电商网站秒杀和抢购的高并发技术实现和优化

一、如何防止多个用户同时抢购同一商品,防止高并发同时订购同一商品?​最近双十一抢购系统应用频繁,销量火爆的同时,让人头疼是却是多用户高并发情况下出现的库存问题。据调查,多个用户同时下单,导致查询和插入... 查看详情