初学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高并发相关推荐

  1. java redis使用卡死_jedispool连redis高并发卡死的问题

    java端在使用jedispool 连接redis的时候,在高并发的时候经常死锁,或报连接异常,JedisConnectionException,或者getResource 异常等各种问题 在使用je ...

  2. 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  3. Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  4. redis高并发数据错乱_redis总结:1T以上海量数据+10万以上QPS高并发+99.99%高可用...

    来源:https://blog.csdn.net/qq_34246646/article/details/104402510 redis作用 topic:高并发.亿级流量.高性能.海量数据的场景,电商 ...

  5. 高并发解决方案——Redis(一)

    简介 Redis作为重要的缓存数据库在高并发的解决方案中起着重要作用.为了系统的学习Redis,也为了秋招(美团比较关注Redis 的掌握),计划编写该系列博客,也是为了整理知识点. 本篇主要介绍了R ...

  6. 高并发技巧-redis和本地缓存使用技巧

    在这篇文章中,我主要介绍的是分布式缓存和本地缓存的使用技巧,包括缓存种类介绍,各种的使用场景,以及如何使用,最后再给出实战案例. 众所周知,缓存最主要的目的就是加速访问,缓解数据库压力.最常用的缓存就 ...

  7. redis高可用,保证高并发

    目录 redis如何通过读写分离来承载读请求QPS超过10万+ redis replication以及master持久化对主从架构的安全意义 redis主从复制原理.断点续传.无磁盘化复制.过期key ...

  8. 面试杂谈:(高并发)redis和cache的使用场景和区别

    近期公司项目中涉及到了高并发情况的优化,一般来说针对高并发,雷打不动的两种方式就是.1.增加硬件配置:2.优化系统配置 硬件配置包含集群,读写分离,反向代理等等,因为我这边没有涉及到,所以具体内容咱们 ...

  9. Redis为什么是单线程、及高并发快的大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  10. 使用高并发利器redis—解决淘宝/微博的【热门搜索】和【最近搜索】的功能

    推荐以下好文: 详解单体架构 微服务 微服务架构 微服务各个组件 分布式 集群 负载均衡 微服务springcloud环境下基于Netty搭建websocket集群实现服务器消息推送----netty ...

最新文章

  1. python 正则表达式 截取特定字符串之后的全部内容
  2. 记《浪潮之巅》-第一版-12.短暂的春秋--与机会失之交臂的公司之一太阳公司(sun microsystems)...
  3. 同一个IP不同端口号使用session失效
  4. AlexNet原文解读+colab上运行caffe+caffe神经网络可视化(没有完成)
  5. No identifier specified for entity没有为实体指定标识符
  6. JS判断UA动态加载CSS的方法
  7. 你必须知道的C#的25个基础概念(附演示)
  8. docker php镜像推荐,Docker 常用镜像整理
  9. 编码器-解码器网络:神经翻译模型详解
  10. 微软ODBC服务器驱动,Microsoft ODBC 桌面数据库驱动程序
  11. ABB机器人指令列表分类详解
  12. modelica用inertia连接FlangeWithBearing时报组件不匹配连接错误:incompatible components in connect statement
  13. LA4487 Exclusive-OR (加权并查集)
  14. Floyd最短路径算法
  15. MybatisPlusException: Your property named “xxx“ cannot find the corresponding database column name!
  16. 现代处理器的设计思想
  17. iOS刘海机型UI适配(X、Xs、Xs Max、Xr)
  18. 职场潜规则之——言及莫论领导是非
  19. 【数字工厂】通信设备制造业“数字工厂”解决方案浅析
  20. python深度学习入门-与学习相关的技巧

热门文章

  1. windows无法访问_注册CourseMaker之后无法登录,显示“网络无法访问……”,怎么办?...
  2. hpux 11.11 连接HDS 存储,采用HDLM管理带来的麻烦,需重启。
  3. html响应式布局平移,jQuery图片内部缩放和平移插件jquery.zoom.js
  4. Java Annotation(注解)使用教程
  5. Spring AOP之通知类别执行顺序
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的账单管理系统
  7. Go程序的一生是怎样的?
  8. 虚拟主机是设置在httpd-vhosts.conf还是vhosts.conf还是httpd.conf
  9. BZOJ3230 相似子串 【后缀数组】
  10. python3多进程爬虫(第二卷)