相信你要处理高并发问题,肯定会想到使用redis缓存数据库。
因为它可以在一定程度上解决网站一瞬间的并发量,不会出现卡死的情况,因为他是使用了内存的,如果你使用普通的数据库的话,增加服务器的压力,效率低下不说,更有可能高并发的时候导致坏表了,也有可能直接导致服务器假死。也就是卡着了,一点反应都没有。
这可是致命的问题啊。
但是使用了redis处理高并发数据时又会发现一个问题,比如:你商城里面的一件秒杀商品只有一件库存了,但是有两个人同时点击了进去,也就是说,这件只有一件的数量的商品要发货两件,但是你的库存没有这么多了啊,这就出现了超卖的情况,那可就得不偿失了啊。
这样的话,不仅仅会导致公司亏本,更展现出了一个系统的bug。这可怎么办呢?
其实这样的话,我们可以给redis上一个并发锁。
可以利用Redis的setnx的命令来处理高并发。
SETNX key value
将 key 的值设为 value ,当且仅当 key 不存在。
若给定的 key 已经存在,则 SETNX 不做任何动作。
设置成功,返回 1 。
设置失败,返回 0 。
下面是使用示例
也就是说如果键是存在的话,是不可能会被创建成功的,也不可以被覆盖。只有那个键被删除了才可能重新创建。
那这样的机制的话,我们就可以用setnx来进行redis锁了,当一个人点击了之后就用生成一个键。
然后再有人要点击的话,也会使用setnx生成,但是发现键已经存在了,无法修改和生成。也就是代表着当前商品已经有人在操作了,给出提示给用户即可。
但是避免一个用户只是点了抢购但是却没有后面的操作,直接导致这个商品失效了,一直在内存之中,这样也是不好的。
所以我们可以给redis的键设置一个有效时间。就像是你买票时一样,有30分钟的付款时间,超过了也就没有了。
也就是会把那个键给删除了,重新释放出去,供用户来进行购买。
给setnx生成键可以用expire来进行设置有效时间。
语法是 expire key time
Expire 命令用于设置 key 的过期时间,key 过期后将不再可用。单位以秒计。
返回值:
设置成功返回 1 。当 key 不存在或者不能为 key 设置过期时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的过期时间)返回 0 。
使用示例:
总结:redis是把数据保存在内存之中的,所以效率非常的快,更是大大地降低了服务器的压力,避免了服务器因此而宕机的风险。能够处理高并发,也能够与数据库中的数据同步。redis对于开发者来说确实是一个利器。