用Redis实现各种秒杀功能
前言
个人经验总结的一些观点看法,阅读了各大平台提供的关于秒杀实现的资料,总结的仅供参考,文中有写的不对的地方请指正!
秒杀设计
一般处理秒杀有三种思路:
分布式处理
异步处理
写入内存处理
分布式处理
分布式处理就是把大量的请求分散到多个服务器上运行,一般使用hash实现均匀分布(通过支持MD5与MurmurHash两种计算方式,默认是采用MurmurHash,高效的hash计算实现均匀分布;还有Paxos算法;Hash Ring实现)
分布式锁也可以实现:通过setnx(lock_timeout)实现,如果设置了锁返回1, 已经有值没有设置成功返回0
死锁问题:主要通过获取过期时间,获取到过期时间get,然后判断getset是否与get相等。
异步处理
秒杀一般时间短,并发大,负载压力大。所以使用异步处理,后台启动多个线程从内存池中异步读取数据,进行处理。异步处理通常使用MQ处理(处理性能高,还能熔断),也可以使用Celery异步,
消息队列:主要目的是减少请求响应时间和解耦。所以主要的使用场景就是将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列。同时由于使用了消息队列,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦和。