千家信息网

redis中怎么防止抢购商品超卖

发表于:2024-12-04 作者:千家信息网编辑
千家信息网最后更新 2024年12月04日,本篇文章为大家展示了redis中怎么防止抢购商品超卖,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用redis的list进行测试思路是设置一个redis列表
千家信息网最后更新 2024年12月04日redis中怎么防止抢购商品超卖

本篇文章为大家展示了redis中怎么防止抢购商品超卖,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

  • 使用redis的list进行测试

    思路是设置一个redis列表List,假设有十个商品,每次请求先判断List的长度,小于十就能抢到商品,将用户信息存放到List中。代码如下

 //进行抢购    protected function way_list(){$num = $this->redis->lLen();if($this->redis->lLen()>=self::AMOUNTLIMIT){$this->writeLog("抢购失败".$num);return;}else{$this->redis->rPush($num);$this->writeLog("抢购成功".$num);}}

结果:失败!

可以很明显数量不对顺序也不对。

分析了下原因,在代码执行时,多用户并发请求时,第一个用户判断List长度符合条件还未进行List写入时,第二个用户也通过了List长度判断。所以就导致执行失败。

这就没有利用到redis的原子性

所以进行了改良

  • 使用redis 的incrby。incrby将制定key 的值增加指定的增量,并返回增量后的值。是一个原子性操作。所谓的原子性操作就是执行该方法后要嘛成功要嘛失败。

思路就是设置一个键值对存放被抢购数量,每次一个用户进来就将该值加一进行判断,如果小于抢购的商品数量则抢购成功,否则失败。代码如下

 protected function way_string(){//判断是否有初始化        if(!$this->redis->exists(self::sold_name)){$this->redis->setnx(self::sold_name,0);}if($this->redis->incrby(self::sold_name,1) > self::AMOUNTLIMIT){$this->writeLog('失败');}else{$this->writeLog('成功');}}

结果

压力测试了几次都没有出现问题

通过apache自带的ab压力测试,进行五百次连接请求,并发三百次,没有出现超卖行为。

总结:会出现超卖主要是由于用户在请求的时候,代码在执行是有先后,会导致执行结果不符合预期。而采用redis的原子性就能避免。

上述内容就是redis中怎么防止抢购商品超卖,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

用户 商品 成功 代码 原子 就是 数量 结果 长度 测试 不对 内容 压力 增量 思路 技能 知识 明显 简明 简明扼要 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 金华比奇网络技术蒋鹏 宝德服务器管理ip连接 安宁软件开发网上价格 网络安全大学的排名 明日之后服务器崩溃图片 福建航天金税安全接入服务器地址 淘课件软件开发 论文在万方数据库查不到怎么办 服务器后面叹号灯亮了 数据库oracle学习培训费用 数据库开发与维护的基本过程 哪个数据库能下载专刊全文 网络安全关闭端口 临沂顺橙网络技术有限公司 数据库模糊查找字符串 国家网络安全中心四川分中心 古典小说阅读软件开发 服务器绑定微信公众号 虹口区营销软件开发价格查询 软件开发iso27000 朔州市网络安全宣传周主题活动 数据库检索号用英语怎么说 江西超频服务器代理价格 按键精灵读取云服务器数据 基因型和基因表达量关联数据库 故宫博物院视频软件开发 网络安全体会感想100字 后端软件开发能做到多大年龄 网络技术研修感言 网络安全 可视化
0