秒杀系统的架构设计。那么,什么是秒杀系统?是典型的、短期的、大规模的、突发性的访问。针对这类问题,我们总结了以下三个性能优化思路:异步处理代替同步处理。写入内存,而不是硬盘。分布式处理。——那么,这三种优化秒杀系统性能的思路,无论秒杀时的负载有多大,都可以轻松应对。Redis可以满足以上三个优化性能,使用redis可以轻松实现秒杀系统。为什么以上三种性能优化思路可以轻松解决秒杀系统的性能问题呢?让我们一一介绍。异步处理,不是同步处理。对于像spike这样的短期高并发系统,性能负载有一个明显的峰值和长期的谷底。在较短的时间内准备大量服务器来处理大并发是非常不经济的。因此,应对秒杀类的需求,我们应该将同步化为异步,在用户请求写入内存后立即返回。后台启动多个线程异步从内存池中读取数据并进行处理。如果用户请求可能在1秒内到达,系统可能需要30分钟才能真正处理它。那么服务器在异步情况下的处理能力是同步情况下的1800多倍。——异步处理,通常用MQ(消息队列)实现。Redis可以看作是一个高性能的MQ。因为它的数据读写都发生在内存中。写入内存,而不是硬盘。传统硬盘的读写性能相当差。SSD硬盘比传统硬盘快100倍,内存比SSD硬盘快10倍以上。因此,写入内存,而不是写入硬盘,可以使系统容量增加千倍。也就是说,你的秒杀系统可能需要900台服务器来支撑,现在一台服务器就可以支撑了。有的开发者会有疑惑?写入内存而不是持久化。如果这时候电脑突然死机,写入的数据不就全部丢失了吗?运气不好怎么办?Touch服务器宕机了,秒不到,有什么大不了的!——后面我们真正处理秒杀命令的时候,会将信息持久化到硬盘中。因此不会丢失任何关键数据。Redis是一个缓存系统,数据写入内存后返回给客户端,可以支持这个特性。分布式处理如果你的客户很多,即使秒杀系统采用了以上两种方案,还是捉襟见肘,无法支撑?没关系,还有下面的大招【分布式处理】。如果一台服务器撑不住秒杀系统,那就多用几台服务器。如果五个单位不够,我们应该使用一百个单位。——分布式处理就是将大量用户的请求分发到多个服务器上,一般使用hash来实现均匀分布。大数据云计算时代已经有很多这样的系统。无非就是用Paxos算法和HashRing来实现。RedisCluster就是这样一个分布式产品。使用Redis实现描述系统redis和rediscluster(分布式版),是一个分布式缓存系统。它支持多种数据结构,也支持MQ。Redis在性能上做了很多优化。因此,使用Redis或者rediscluster可以轻松实现一个强大的秒杀系统。基本上,你可以使用redis的这些命令。RPUSH键值,插入秒杀请求。——当插入的秒杀请求数达到上限时,停止所有后续插入。LPOP密钥在后台启动多个工作线程。读取秒杀成功的用户id进行后续处理,或者使用LRANGEkeystartend命令读取秒杀成功的用户id进行后续处理。——每处理完一条秒杀记录,就执行一次INCRkey_num。处理完所有库存后,该商品秒杀结束,工作线程关闭,不再接受秒杀请求。
