秒杀场景浅析

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis 秒杀 分布式锁

一、秒杀场景介绍

1.1 什么是秒杀?

  秒杀就是在同一时间段内对同一商品进行抢购。对于程序系统来讲就是多个进程同时访问同一个共享资源。

1.2 秒杀场景需要解决的问题

高并发:秒杀场景和其他场景不同,大量用户会在同一时间进行访问。
读多写少:访问请求数量远远大于商品数量,只有少部分用户能够秒杀成功。
数据正确性:秒杀流程比较简单,一般就是下订单减库存。但是,在此过程中一定要保证数据的正确性,防止超卖的现象。
防作弊:秒杀场景中,要做到防止通过插件等手段获得不良利益。
扩展性:对于超出预期的并发量,要能够动态扩展满足业务需求。

1.3 秒杀架构的设计理念

访问拦截:在前端限制大部分流量并且要求同一IP只能选购一件商品,只允许少部分流量进入服务后端。
分流:对于秒杀系统瞬时会有大量用户涌入,把瞬间的大量请求通过负载均衡均匀分布在各节点。
异步处理:将请求的接受和处理异步化,可以极大的提升系统并发。
可拓展:当秒杀系统连接用户大于预计值时,要能够动态扩展以应对大量用户、高并发的需求。
内存缓存:秒杀系统最大的瓶颈在于数据库读写性能,如果能够把部分数据或业务逻辑转移到内存缓存,效率会有极大地提升。可以在MySQL数据库上层使用Redis进行缓存,提高整体性能。

二、秒杀场景后端的实现

  Redis是一个分布式缓存系统,支持多种数据结构,我们可以利用Redis轻松实现一个强大的秒杀系统。

2.1 为什么使用Redis

  Redis是单线程的,可以很好地解决并发问题,如果使用普通的代码逻辑实现秒杀会出现并发问题导致多人秒杀成功货物超发的情况。
  Redis可以实现分布式锁,对于不同商品可以很好的支持并发。

2.2 Redis分布式锁的实现

  Redis通过分布式锁控制同步访问共享资源。它的基本原理是:通过一个状态值来表示锁,对锁的占用和释放通过状态值来标识。
  Redis为单线程,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。Redis的SETNX命令可以方便的实现分布式锁。

SETNX key value
如返回1,则该客户端获得锁,把key的value设置为时间戳表示该键已被锁定,该客户端最后可以通过DEL来释放该锁。
如返回0,表明该锁已被其他客户端取得,这时我们可以先返回或进行重试等对方完成或等待锁超时。

  如果一个持有锁的客户端失败或崩溃了不能释放锁,该怎么解决?
  新客户端发送SETNX key value想要获得锁,由于源客户端还持有锁,所以Redis返回给新客户端一个0,然后新客户端发送GET key命令检查锁是否超时了,如果没超时,则等待或重试。反之,如果已超时,则发送DEL key释放锁,SETNX key value获得锁。如果在新客户端SETNX key value之前,有个客户端更快一步执行了上面的操作,那么新客户端会返回0,继续等待或重试。

2.3 Redis缓存与数据库的同步

  Redis对于每个用户的秒杀,在获取锁之后使用 RPUSH key value插入秒杀请求,当插入的秒杀请求数达到上限时,停止所有后续插入。然后我们可以在台启动多个工作线程,使用 LPOP key 读取秒杀成功者的用户id,然后再操作数据库做最终的下订单减库存操作。

三、总结

  本文仅仅对秒杀场景做了一些基本的介绍,其中包括秒杀场景的基本概念、特点、问题以及Redis部分的实现原理。其余部分感兴趣的朋友可自行学习。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
缓存 前端开发 NoSQL
如何设计一个秒杀系统?
本文详细介绍了秒杀系统的原理与设计方法,包括高性能、一致性、高可用性和可扩展性等方面的要求。文中通过前端和后端的设计方案,探讨了如何实现秒杀系统的高并发处理,例如页面静态化、限流、降级策略及缓存优化等。此外,还分享了实际项目中的库存系统架构设计经验,并提供了面试中如何回答此类问题的建议。
191 2
|
消息中间件 缓存 NoSQL
如何设计一个秒杀系统???
如何设计一个秒杀系统???
188 0
|
消息中间件 缓存 安全
秒杀系统(1)——秒杀功能设计理念
秒杀系统(1)——秒杀功能设计理念
185 0
|
消息中间件 缓存 JavaScript
如何设计一个秒杀系统
如何设计一个秒杀系统
|
数据库
.商品秒杀-超卖
.商品秒杀-超卖问题
95 0
|
数据采集 缓存 前端开发
如何设计一个秒杀系统(上)
秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大流量的秒杀系统需要进行哪些关注,就是本文讨论的话题。
553 0
如何设计一个秒杀系统(上)
|
缓存 监控 NoSQL
秒杀系统
秒杀能够以极小的经费撬动巨大的流量,虽然会带来一定的口碑损失,但因为极具性价比,所以经常被运营同学使用。本文介绍如何设计一款能够支撑60W QPS的秒杀系统,希望能够帮助到大家。
|
存储 消息中间件 缓存
【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!
在电商领域,存在着典型的秒杀业务场景,那何谓秒杀场景呢。简单的来说就是一件商品的购买人数远远大于这件商品的库存,而且这件商品在很短的时间内就会被抢购一空。 比如每年的618、双11大促,小米新品促销等业务场景,就是典型的秒杀业务场景。
909 1
【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!
|
双11 数据库 黑灰产治理
高并发秒杀系统如何实现正确的扣减库存?
高并发秒杀系统如何实现正确的扣减库存?
512 1
高并发秒杀系统如何实现正确的扣减库存?
|
数据采集 Web App开发 IDE
Python爬虫抢购某宝秒杀商品
某宝秒杀,用毫秒级的精准度来抢购! 你还在为各种活动秒杀 抢不过别人而烦恼吗? 应粉丝要求 今天出一期 利用Python爬虫 抢购秒杀商品的文章 目录 ​ 1,项目环境 ​ 2,某宝抢购流程分析 ​ 3,程序实现思路 ​ 4,代码实践与梳理
627 0