# 0x00 前言

# 秒杀常见问题

# 01 卖超问题

假设有 20 个商品要卖,1W 个请求打过来。

  1. SQL 加上数量判断,防止数量超掉

应用层的检查,并发量上来,肯定要加行级锁,开销比较大。

  1. redis 集合预先缓存好相关的数量,然后从 redis 上进行应用层的数量检查。

然后走异步队列。

因为对于数据库来说,我只要 20 个请求即可,redis 起到了一个阻挡多余的请求穿透到 DB 中的作用。

即便如此,redis 依然可能会出现一些意外的情况,比如为负数,这个时候多打进去几个请求,变成 24 个,这个时候 MQ 的作用就出来了。排好队伍。

  1. 唯一索引

数据库层的检查,可以从根本上防止问题

# 02 缓存问题

  1. page 级别的缓存,由于 wsgi 协议本身在 flask 中返回的就是文本,所以,当作文本处理即可
  2. obj 级别的缓存

能走内存的走内存,能走 redis 就走 redis, 能通过 mq 削减峰值的就走 mq, 能走 mongodb 的走 mongodb, 最后是数据库。

# 03 安全

  1. 验证码
  2. 接口防刷限流
  3. 秒杀接口隐藏

# 04 分布式锁

  1. 不加锁,并发起来资源浪费
  2. 加锁,然而,线路抖动会导致不能及时释放锁
  3. 加过期锁,或者加带有时间的锁,然后重新获取锁。
  4. redisson 封装好的方法

# 06 减少数据库访问时间

  1. 首先考虑在 where 和 order by 设计的列上建立索引
  2. 索引越多,插入越慢,这个要做好平衡
  3. 避免过长的事务级操作,提高并发能力

其他的可以参考 MySQL 的一些优化原则,油管上很多。

# 07 分布式事务

分布式事务,准确来说,是分布式

# 0xEE 参考

# PEP

https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html

https://blog.zulip.org/2016/10/13/static-types-in-python-oh-mypy/


ChangeLog:

  • 2018-11-25 初始化本文