redis中怎么防止抢购商品超卖
发表于:2024-12-03 作者:千家信息网编辑
千家信息网最后更新 2024年12月03日,本篇文章为大家展示了redis中怎么防止抢购商品超卖,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用redis的list进行测试思路是设置一个redis列表
千家信息网最后更新 2024年12月03日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安全错误
数据库的锁怎样保障安全
方舟自己的服务器
服务器散热方式有哪些
淮南市哪里招聘网络技术员
软件开发类项目的组织结构
pg数据库退出当前循环
大话西游2此账号不能连接服务器
盗取app服务器端数据库
软件开发工具两个核心功能
阿里云云服务器云数据库贵吗
山东省网络技术大赛
移动服务器哪个好玩
北京软件开发的招聘
网络安全ppt图文
新疆网络安全宣传片
银行网络安全人员笔试资料
暗黑2重制版服务器恢复时间
西门子服务器怎么开机箱
张益珲软件开发
人脸识别服务器比对
当前网络技术发展
left join 数据库
软件开发开票就得交税吗
高要网络安全进社区
无锡进口软件开发诚信经营
湖北特种网络技术服务标准
网络安全防线突破
sql数据库导出报错
量子特攻会在哪个服务器
服务器处于高限制状态
改数据库表字段会锁表吗