redis中怎么防止抢购商品超卖
发表于:2025-02-13 作者:千家信息网编辑
千家信息网最后更新 2025年02月13日,本篇文章为大家展示了redis中怎么防止抢购商品超卖,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用redis的list进行测试思路是设置一个redis列表
千家信息网最后更新 2025年02月13日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安全错误
数据库的锁怎样保障安全
综合网络技术服务软件
往事不堪回首网络安全不失守
数据库字段查询命令
福州定制软件开发解决方案
网络技术模拟作业程序
网络安全问题分析案例
服务器管理技巧大全
网络安全人员值守
邮政软件开发中心笔试
数据库运行安全
软件开发工程师工作性质
我的世界永远开放的服务器
mysql数据库代码格式
网络安全国际案例
家用服务器价格一般多少钱
网络安全 党委负责
泰州纬立网络技术价目表
混合软件开发前景
rust腐蚀服务器ip
微服务数据库命名规范
乐至软件开发文档
连接远程服务器命令
水声通信网络技术现状
幼儿园网络安全进校园图片
云时代竟抢服务器
mimic数据库教学
数据库装在虚拟机还是物理机
光遇渠道服务器有几个
微服务数据库命名规范
手机方舟生存进化有什么服务器