Tag Archives: redis

利用Redis开发预约系统

这次来讲讲redis的一些高级使用机制,redis就不在这里过于介绍了,不了解的可以google,可以wiki,也可以去redis官网看看。上面都有它的历史和使用说明。

Redis主要提供了集中类型:字符串,hash,list,有序/无序集合。每个类型都有不同的使用场景,例如字符串可以保存一些固定key的数据。比如用户基础数据等等。Redis是一个单进程单线程的内存数据库,对于并发来说,基本上不会出现重复的问题,同时它所处理的速度也是极快的。因此在门票预约或者发红包的时候,利用Redis这一特性,可以很好的解决并发所带来的问题,同时也提高了运行效率,处理速度。

对于门票预约来说,一般都会事先生成好所有的座位,这里的座位我们称之为ticket。Redis中List是提供了push和pop功能。第一步需要先把所有生成的ticket放入list中,用户在点击预约时,用lpop命令弹出一个。如果想退订或者失败回滚处理用rpush命令插入。另外,门票每个人只能预约一张,你可以创建一个hash表,用userid做为这个hash表的key,在每次获取订单的时候,你可以去这个hash表上查询,此userid时候已经存在,若不存在,可以将预约成功者的userid以及ticket、状态、时间。存储到这个hash表中。

在这套预约系统中,有一个问题,就是我创建了这个预约事件,那么我想调整人数时候就遇到难题了。增加人数还好说,通过差值,在list中rpush那些数量的ticket。而需要减少的时候,可就没办法了。除非你把这个预约事件全部取消并删除。

在并发测试的时候,没有遇到同时会分配到两个相同的ticket。而且redis的并发量,超出了我们的想象,若是只使用Mysql这类关系数据库,对服务器的压力可能会有所增加,同时,mysql因为行锁原因,可能会比Redis低一些。

通过我上面那么多的废话,你设计这套只需要4个:
1. ticketqueue:2 ticket队列表 后面的数字代表预约事件id。 list类型
2. orderedlist:2 成功预约列表。hash表类型
3. userlist 用户数据表,存储用户的联系方式。 hash表
4. eventlist 预约表。 这个存储每个预约的信息。 hash表

除了你用Redis之外,你还可以用mysql。这个Mysql只是用来存储最终的结果,就是当整个预约流程成功跑完获得ticket之后,将状态,预约信息,用户信息存在数据库中,便于后台的检索。