欢迎订阅小臣的公众号:小臣醉,亦可赏玩同名小程序:小臣醉。
在互联网电商系统中,海量数据存储与高并发处理,就是前后对着胸口和后背的利刃。绕不开的就得面对。
应对海量数据库表的快速访问,分库分表策略已然是大家耳熟目染了。而对于数据层面(暂不考虑借助内存数据库、缓存层)高并发的处理,还有不一样的思路否?
借用X米手机秒杀活动,场景强行代入,尝试分析秒杀单品数据存储设计:
一般情况,在商品基表下都关联SKU明细表,其中一个字段存储了库存数,活动商品可能是商品库中的某SPU。不过,和其他商品共用表,数量大而不利于秒杀活动商品的快速查找。
假设活动商品名(product_name):X米手机,库存数量(store_count)有n个。
为解决活动单品的并发访问快速读写压力:
将活动商品单独建表存放,并根据库存数量拆分该商品为对应数量的数据行。
拆分前:
问题:
对于高并发下单扣减库存,每个用户请求都需要对此商品库存进行更新操作。由于innodb存储引擎存在行锁,此时就会出现大量请求作用在同一条数据行上。不同请求线程对行锁的竞争,也就造成大部分线程的等待,邮储出现读写性能瓶颈,连接数可能就此被占满。
拆分后:
很大程度上解决行锁集中竞争问题。用户请求可以操作哪条记录,则可以灵活控制了。可以随机,也可以用取摸方式分配数据行,比如user_id mod(store_count),就可以把用户划分不同区间,去竞争对应数据行锁(抢到则可成功下单,否则就当失败),并发读写压力骤减、可控。
大体思路下,细节可优化。
领取专属 10元无门槛券
私享最新 技术干货