我们在使用redis做秒杀程序的时候,解决超卖问题,是重中之重。
首先我们来了解一下redis
1、消息队列
什么是消息队列?
是一个消息的链表,是一个异步处理的数据处理引擎。
用途有哪些?
邮件发送、手机短信发送,数据表单提交、图片生成、视频转换、日志储存等。
有什么好处?
不仅能够提高系统的负荷,还能够改善因网络阻塞导致的数据缺失。
有哪些软件?
ZeroMQ、Posix、SquirrelMQ、Redis、QDBM、Tokyo Tyrant、HTTPSQS等(linux平台下)。
怎么实现?
顾名思义,先入队,后出队;先把数据丢到消息队列(入队),后根据相应的key来获取数据(出队)。
首先,redis设计用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列,它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列;另外,做消息队列的其他特性例如FIFO(先入先出)也很容易实现,只需要一个list对象从头取数据,从尾部塞数据即可;redis能做消息队列还得益于其list对象blpop brpop接口以及Pub/Sub(发布/订阅)的某些接口,它们都是阻塞版的,所以可以用来做消息队列。
简单的代码实例:
怎么解决秒杀超卖问题,下面是一个思路:
用上述思路去做的话,我们再用户点击秒杀的时候,只需要检测,kucun_count中是否能pop出数据,如果能pop出来则证明还有库存,且秒杀成功。而且pop是原子性的,即使很高的并发,
同时有很多用户访问,也是排队一个一个解决(并行转串行)。
这样的话,就解决了超卖的问题。
这是一个思路,具体的秒杀程序应该还有很多细节需要完善,但是核心问题已经解决了哈。
希望能够帮到需要的朋友。