一、秒杀场景的特性
1、顺时并发流量非常高
当有大量并发请求涌入秒杀系统时,可以使用Redis的高性能、高并发特性,先拦截掉大部分请求,避免大量请求直接发送给数据库,把数据库给压跨。
2、读多写少,读操作是简单的查询操作
在秒杀场景下,用户需要先检查商品是否有库存,只有库存有余量时,秒杀系统才能进行库存扣减和下单操作。库存查验操作是典型的键值对查询,Redis对键值对查询的高效支持,正好和 这个操作要求相匹配。
二、基于原子操作支撑秒杀场景
在秒杀场景中,一个商品的库存对应了两个信息,分别是总库存量和已秒杀量。这种数据模型正好是一个key(商品ID)对应两个属性关系,所以我们可以使用一个HASH键值类型来保存:
key:itemID
value:{total:N, ordered:M}
库存查验和库存扣减这两个扣作要保证原子性,可以直接使用Redis原子操作。因为有查询、扣减两步操作,无法用一条命令完成,所以我们需要使用Lua脚本原子性的执行这两个操作。如下所示:
#获取商品库存信息
local counts = redis.call("HMGET", KEYS[1], "total", "ordered");
#将总库存转换为数值
local total = tonumber(counts[1])
#将已被秒杀的库存转换为数值
local ordered = tonumber(counts[2])
#将当前秒杀数量转换为数值
loca