秒杀场景浅析

本文涉及的产品
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 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天前
|
消息中间件 程序员 Kafka
抢购不再卡顿!揭秘异步处理如何优化秒杀流程!
本文由程序员小米分享,详细介绍了如何通过异步处理简化秒杀请求中的业务流程,提高系统效率与稳定性。主要内容包括秒杀场景的挑战、核心思路、核心业务(生成订单、扣减库存)及次要业务(发放优惠券、增加积分)的异步处理方法,并探讨了使用消息队列的优势及优化用户体验的策略。通过异步处理,系统能更好地应对高并发请求,提升响应速度和稳定性。
14 4
抢购不再卡顿!揭秘异步处理如何优化秒杀流程!
|
数据库
.商品秒杀-超卖
.商品秒杀-超卖问题
80 0
|
缓存 CDN
实现高并发秒杀的7种方式 建议收藏!!
实现高并发秒杀的7种方式 建议收藏!!
128 0
|
Java 测试技术 数据库
实现高并发秒杀的七种方式(2)
实现高并发秒杀的七种方式(2)
|
消息中间件 JavaScript 小程序
实现高并发秒杀的七种方式(1)
实现高并发秒杀的七种方式(1)
|
缓存 监控 NoSQL
秒杀系统
秒杀能够以极小的经费撬动巨大的流量,虽然会带来一定的口碑损失,但因为极具性价比,所以经常被运营同学使用。本文介绍如何设计一款能够支撑60W QPS的秒杀系统,希望能够帮助到大家。
|
消息中间件 缓存 安全
从零开始打造简易秒杀系统(一):防止超卖
本文主要是通过实际代码讲解,帮助你一步步搭建一个简易的秒杀系统。从而快速的了解秒杀系统的主要难点,并且迅速上手实际项目。
682 1
|
SQL 缓存 NoSQL
高并发下秒杀商品,你必须知道的9个细节
高并发下秒杀商品,你必须知道的9个细节
高并发下秒杀商品,你必须知道的9个细节
|
存储 消息中间件 缓存
【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!
在电商领域,存在着典型的秒杀业务场景,那何谓秒杀场景呢。简单的来说就是一件商品的购买人数远远大于这件商品的库存,而且这件商品在很短的时间内就会被抢购一空。 比如每年的618、双11大促,小米新品促销等业务场景,就是典型的秒杀业务场景。
844 1
【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!
|
双11 数据库 黑灰产治理
高并发秒杀系统如何实现正确的扣减库存?
高并发秒杀系统如何实现正确的扣减库存?
460 1
高并发秒杀系统如何实现正确的扣减库存?