以上是一个只说明流程的伪代码,其实整体的逻辑是很简单的,只要考虑到死锁时的情况,就比较好处理了。Redis作为分布式锁,因为其性能的优势,不会成为瓶颈,一般会产生瓶颈的是真正的业务处理内容,还是尽量缩小锁的范围来确保系统性能。
自动过期能有效提升开发效率Redis针对数据都可以设置过期时间,这个特点也是大家应用比较多的,过期的数据清理无需使用方去关注,所以开发效率也比较高,当然,性能也比较高。最常见的就是:短信验证码、具有时间性的商品展示等。无需像数据库还要去查时间进行对比。因为使用比较简单,就不赘述了。
分布式和持久化有效应对海量数据和高并发Redis初期的版本官方只是支持单机或者简单的主从,大多应用则都是自己去开发集群的中间件,但是随着应用越来越广泛,用户关于分布式的呼声越来越高,所以Redis 3.0版本时候官方加入了分布式的支持,主要是两个方面:
Redis服务器主从热备,确保系统稳定性
Redis分片应对海量数据和高并发
而且Redis虽然是一个内存缓存,数据存在内存,但是Redis支持多种方式将数据持久化,写入硬盘,所有,Redis数据的稳定性也是非常有保障的,结合Redis的集群方案,有的系统已经将Redis当做一种NoSql数据存储来适用。
示例:秒杀和Redis的结合秒杀是现在互联网系统中常见的营销模式,作为开发者,其实最不愿意这样的活动,因为非技术人员无法理解到其中的技术难度,导致在资源协调上总是有些偏差。秒杀其实经常会出现的问题包括:
并发太高导致程序阻塞。
库存无法有效控制,出现超卖的情况。
其实解决这些问题基本就两个方案:
数据尽量缓存,阻断用户和数据库的直接交互。
通过锁来控制避免超卖现象。
现在说明一下,如果现在做一个秒杀,那么,Redis应该如何结合进行使用?
提前预热数据,放入Redis
商品列表放入Redis List
商品的详情数据 Redis hash保存,设置过期时间
商品的库存数据Redis sorted set保存
用户的地址信息Redis set保存
订单产生扣库存通过Redis制造分布式锁,库存同步扣除
订单产生后发货的数据,产生Redis list,通过消息队列处理
秒杀结束后,再把Redis数据和数据库进行同步
以上是一个简略的秒杀系统和Redis结合的方案,当然实际可能还会引入http缓存,或者将消息对接用MQ代替等方案,也会出现业务遗漏的情况,这个只是希望能抛砖引玉。
下面关于Redis的文章您也可能喜欢,不妨参考下:
Ubuntu 14.04下Redis安装及简单测试
CentOS 7下Redis的安装与配置
Ubuntu 16.04环境中安装PHP7.0 Redis扩展
CentOS 7.0 安装Redis 3.2.1详细过程和使用常见问题