php redis auth 高并发,PHP+Redis高并发
初学Redis,于是便想写一个高并发的项目,最开始只能达到并发量1,后来增加并发,出现各种问题,我又采取各种办法来增大并发量,在慢慢增大并发量的过程中,我也在慢慢成长,在追求成功的过程中,越来越兴奋,成长的感觉,也是人生中最美妙的事情!
需求:一个抢课系统,使用Redis,course_1为课程的人数,user_1为哪些用户选择了课程,采用数组形式,由于ab压测,我不知道怎么传动态参数,于是我变用的随机数代替。
首先先来看代码:
$redis = my_redis();
if($redis->get('course_1') <= 0){
$this->apiReturn(303,'课程已被抢完');
}
$redis->decr('course_1');
$data = $redis->get('user_1');//获取key [value]
$data = json_decode($data,JSON_UNESCAPED_UNICODE);
array_push($data,mt_rand(1,100));
$data = json_encode($data);
$redis->getset('user_1',$data);
抢课人数结构
课程人数结构
第一次测试,总请求量100,同时并发量为1,课程人数100:
ab -n1000 -c50 http://127.0.0.1/lession_admin/public/index.php/api/test
-n一共多少次请求,-c瞬间的并发数
注意,localhost要改成127.0.0.1,不然会被积极拒绝(到底有多积极???)。
ab -n100 -c1 http://127.0.0.1/lession_admin/public/index.php/api/test
结果:课程数为0(正常)
[94,76,85,79,87...].length = 100(正常)
第二次测试,总请求量100,同时并发量为5,课程人数100:
结果:课程数为0(正常)
[94,76,85,79,87,32,64...].length = 95(异常)
我们发现少了5个人,那么会不会跟总请求量有关,于是我们改一下请求量
第三次测试,总请求量300,同时并发量为5,课程人数100:
结果:课程数为0(正常)
[94,76,85,79,87,32,64...].length = 89(异常)
很惊讶,每秒钟同时5的并发量,功能就已经产生异常了,这就得考虑代码问题了。
我们看到,每秒钟5个人访问,就出了问题,那么肯定是代码问题,我们看到,每次-1,这种思路不可取,非常容易出问题,于是我换一种思路,判断已经选课的人数,有没有超过总人数,如果超过了,就不能再选课,实验后发现,我这种做法是正确的,并且取得了很好的效果,Redis里的字符串(我刚开始因为看到可以自减,所以选择字符串结构,现在发现自己是错的),也改为了set结构,因为它有去重的功能:
$courseId = 1;
$id = I('id');
$id = (int)$id;
$redis = my_redis();
这里的if是重点,判断人数100,有没有小于抢的人数,如果小于,那么就返回失败,这里是精华,之前自减1,真的太多漏洞了。
if($redis->smembers('course_' . $courseId)[1] <= count($redis->smembers('user_' . $courseId))){
$this->apiReturn(303,'课程已被抢完',["num"=>count($redis->smembers('user_1'))]);
}
$result = $redis->sismember('user_' . $courseId, $id);
if ($result) {
$this->apiReturn(304,'您不能重复抢课');
}
$result_Add = $redis->sadd('user_' . $courseId, $id);
if ($result_Add) {
$this->apiReturn(200,'抢课成功');
}
$this->apiReturn(305,'抢课失败');
课程信息
线程,一秒请求十万
随机变量1-500
http请求带参数
采用set结构,可以去重,在这个业务场景下,比list好用
第四次测试得出:
10000并发数据正常,也是100条数据,并没重复。
50000并发数据异常,超出3条数据,并没重复。
100000并发数据异常,超出1条数据,并没重复。
从并发量5异常,到并发量一万正常,就几行代码解决了这个问题,代码真的是很奇妙的东西。
搭建分布式:
redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
检测
redis-trib.rb check 127.0.0.1:6379
如果说第二次启动报错的话,
错误信息为:
[ERR] Node 127.0.0.1:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
下面我开始用分布式锁,来解决并发的问题。
php redis auth 高并发,PHP+Redis高并发相关推荐
- java redis使用卡死_jedispool连redis高并发卡死的问题
java端在使用jedispool 连接redis的时候,在高并发的时候经常死锁,或报连接异常,JedisConnectionException,或者getResource 异常等各种问题 在使用je ...
- 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- redis高并发数据错乱_redis总结:1T以上海量数据+10万以上QPS高并发+99.99%高可用...
来源:https://blog.csdn.net/qq_34246646/article/details/104402510 redis作用 topic:高并发.亿级流量.高性能.海量数据的场景,电商 ...
- 高并发解决方案——Redis(一)
简介 Redis作为重要的缓存数据库在高并发的解决方案中起着重要作用.为了系统的学习Redis,也为了秋招(美团比较关注Redis 的掌握),计划编写该系列博客,也是为了整理知识点. 本篇主要介绍了R ...
- 高并发技巧-redis和本地缓存使用技巧
在这篇文章中,我主要介绍的是分布式缓存和本地缓存的使用技巧,包括缓存种类介绍,各种的使用场景,以及如何使用,最后再给出实战案例. 众所周知,缓存最主要的目的就是加速访问,缓解数据库压力.最常用的缓存就 ...
- redis高可用,保证高并发
目录 redis如何通过读写分离来承载读请求QPS超过10万+ redis replication以及master持久化对主从架构的安全意义 redis主从复制原理.断点续传.无磁盘化复制.过期key ...
- 面试杂谈:(高并发)redis和cache的使用场景和区别
近期公司项目中涉及到了高并发情况的优化,一般来说针对高并发,雷打不动的两种方式就是.1.增加硬件配置:2.优化系统配置 硬件配置包含集群,读写分离,反向代理等等,因为我这边没有涉及到,所以具体内容咱们 ...
- Redis为什么是单线程、及高并发快的大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- 使用高并发利器redis—解决淘宝/微博的【热门搜索】和【最近搜索】的功能
推荐以下好文: 详解单体架构 微服务 微服务架构 微服务各个组件 分布式 集群 负载均衡 微服务springcloud环境下基于Netty搭建websocket集群实现服务器消息推送----netty ...
最新文章
- python 正则表达式 截取特定字符串之后的全部内容
- 记《浪潮之巅》-第一版-12.短暂的春秋--与机会失之交臂的公司之一太阳公司(sun microsystems)...
- 同一个IP不同端口号使用session失效
- AlexNet原文解读+colab上运行caffe+caffe神经网络可视化(没有完成)
- No identifier specified for entity没有为实体指定标识符
- JS判断UA动态加载CSS的方法
- 你必须知道的C#的25个基础概念(附演示)
- docker php镜像推荐,Docker 常用镜像整理
- 编码器-解码器网络:神经翻译模型详解
- 微软ODBC服务器驱动,Microsoft ODBC 桌面数据库驱动程序
- ABB机器人指令列表分类详解
- modelica用inertia连接FlangeWithBearing时报组件不匹配连接错误:incompatible components in connect statement
- LA4487 Exclusive-OR (加权并查集)
- Floyd最短路径算法
- MybatisPlusException: Your property named “xxx“ cannot find the corresponding database column name!
- 现代处理器的设计思想
- iOS刘海机型UI适配(X、Xs、Xs Max、Xr)
- 职场潜规则之——言及莫论领导是非
- 【数字工厂】通信设备制造业“数字工厂”解决方案浅析
- python深度学习入门-与学习相关的技巧
热门文章
- windows无法访问_注册CourseMaker之后无法登录,显示“网络无法访问……”,怎么办?...
- hpux 11.11 连接HDS 存储,采用HDLM管理带来的麻烦,需重启。
- html响应式布局平移,jQuery图片内部缩放和平移插件jquery.zoom.js
- Java Annotation(注解)使用教程
- Spring AOP之通知类别执行顺序
- 基于JAVA+SpringMVC+Mybatis+MYSQL的账单管理系统
- Go程序的一生是怎样的?
- 虚拟主机是设置在httpd-vhosts.conf还是vhosts.conf还是httpd.conf
- BZOJ3230 相似子串 【后缀数组】
- python3多进程爬虫(第二卷)