最近项目一上线,就问题颇多,本地测试,ok,上线后,大用户量的时候,顶不住。用了一个礼拜的时间发现的问题,总结下来。

项目是netty4.0,reids2.8,nginx等框架。目前是4台proxy服务器,一台核心服务器,reids只部署在核心服务器上,各代理服务器共享redis数据。

当大量用户访问自己距离较近的proxy服务器时,proxy同时请求核心服务器,并发量到1w时,经常请求卡死,网页请求不回来,开始从netty的http处理并发下手,各种netty的官网,netty的优化,和配置,都修改了,还是没有起作用,后来屏蔽redis后,发现netty处理20w并发一点问题没有,问题确定在redis上。

然后,着手redis的优化,redis的池的优化,配置,没有作用,后台发现,本地访问redis并发1w,很快,但是,访问其他服务器的redis特别卡,发现原因,就在于,跨服务器访问redis,可能由于网络,跨服务器,导致的并发请求redis,回不来的问题,那么,最后,舍弃了proxy服务器远程调用核心服务器reids的方案,nginx改为所有心跳请求,跨过proxy服务器,直接走核心服务器,这样相当于本地访问redis,最后担心核心服务器并发能力,暂时,开启了2个服务,处理所有并发,reids问题得到解决。

总结:就是reids本身性能没有问题,处理并发能力ok,就是跨服务器远程访问其他服务器reids时,并发大了,网络延迟等,会出现取reids卡死。

更高效地提高redis client多线程操作的并发吞吐设计

Redis   2015-05-10 09:51:44 发布

您的评价:
     
0.0  
收藏     0收藏

Redis是一个非常高效的基于内存的NOSQL数据库,它提供非常高效的数据读写效能.在实际应用中往往是带宽和CLIENT库读写损耗过高导致无法更好地发挥出Redis更出色的能力.下面结合一些redis本身的特性和一些client操作上的改变来提高整个redis操作的效能.

上图是反映平常操作redis的情况,每个线程都独立的发起相应连接对redis的网络读写.虽然我们可以通过批操作的方式来把当前多个操作合并成一个,但这种方式只能针对当单线程,而多线程相互合并则设计上很少关注.从redis的协议来说其实并没有限制,只是在client库的设计一般没有考虑进去.

如果在多线程操作REDIS的同时如果能够合并网络操作,那意味着可以减少操作网络读写的情况把处理能力提升到最大化.这样Client总体的性能都会有所提升,而REDIS也因表层的网络读取减少而达到更好的利用率.

以上是设计图,原理并不复杂,其实就是把每个请求的操作放到一个队列中,后面开启一个线程来把前面的指令进行一个合并操操作.一个线程在高并发下可以无法更快速地合并起来,可以根据需要进行合理的操作线程应用.

这种设计的效果是否真的比较理想呢,以下是一个简单的测试

public void AnycSet(){CodeTimer.Time("beetle.redis asynset", () =>{Parallel.For(0, Count, x =>{ProtobufKey key = x.ToString();key.AsynSet(new User() { UserId = x, NickName = "sdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffffbeetlesdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffff" + x });});});}public void Set(){CodeTimer.Time("beetle.redis set", () =>{Parallel.For(0, Count, x =>{ProtobufKey key = x.ToString();key.Set(new User() { UserId = x, NickName = "sdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffffbeetlesdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffff" + x });});});}

测试结果如下

以上是10W次的操作测试结果,由于redis在本机所以交互非常可观.

虽然在多线程高并发下这样的设计可以把吞吐能力和效能有一个非常不错的效果,但其也存在缺陷因为每次操作都经过不同线程的调处理,如果并发线程不多操作密集度不高.那效果并不理想;因为网络操作密集度不高,可得到并合的数量不多,这方面的损耗有可能低于操作跨线程调度所带来的损耗.

转载于:https://www.cnblogs.com/panxuejun/p/6042591.html

redisb并发访问慢出现的问题相关推荐

  1. Spring并发访问的线程安全性问题

    下面的记录对spring中并发的总结.理论分析参考Spring中Singleton模式的线程安全,建议先看 spring中的并发访问题: 我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下 ...

  2. python访问多个网站_Python多并发访问网站

    这篇文章主要介绍了Python实现多并发访问网站功能,结合具体实例形式分析了Python线程结合URL模块并发访问网站的相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python实现多并发访问网站 ...

  3. 两个线程同时访问一个变量_百战程序员:Java多线程对象及变量的并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

  4. Spring 是如何解决并发访问的线程安全性问题的

    springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧!和Struts一样,Spring的Controller默认是Singleton的, ...

  5. php-cgi和php-fpm,Windows环境下解决Nginx+php并发访问阻塞问题。

    php-cgi 是运行php, php-fpm是守护php-cgi进程 nginx配置目录运行php         location  ~ \.php$         {              ...

  6. 提高大数据量并发访问时效率

    最近在做windows服务方面的开发,主要用它来解决A服务和其他服务发送数据失败后,重新发送的问题. 为了提高大数据量并发访问时效率问题,要在多台服务器上安装服务并采用多线程,就像是超市的收银,利用多 ...

  7. iOS使用多线程提高数据并发访问 之七

    活跃性 活跃性是指好的事情最终会发生.例如,如果你代码的目标是确保你能够持续从数组中push和pop对象,问题是这个过程是否能够永远工作.使用锁带来的问题是锁会引起系统中所有线程一直等待 -- 换句话 ...

  8. 多线程中数据的并发访问与保护

    在多线程编程中,不可避免地要对一些共享的数据进行访问.由于线程之间对共享数据的访问是独立的,任何一个线程都可对共享数据进行访问和修改,且它们之间是异步并发进行的,特别是当需要对共享数据进行修改时,就会 ...

  9. php 使用redis锁限制并发访问类

    1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...

最新文章

  1. golang避免XSS攻击
  2. java 网络编程 聊天_Java——网络编程(实现基于命令行的多人聊天室)
  3. Bzoj2037: [Sdoi2008]Sue的小球
  4. UML类图的6大关系
  5. 计算机系统维护是学什么,《计算机系统维护》教学大纲.doc
  6. Python单元测试框架之unittest+requests+ddt+excel接口自动化测试
  7. windows vs编译环境 python_Python虚拟环境使用(Windows)
  8. 从源头入手,一分钟秒懂为什么要搞微服务架构?(转)
  9. efs文件解密软件_Pylocky勒索软件的受害者
  10. 深度探秘大数据新应用,2018 中国大数据技术大会(BDTC)强势来袭!
  11. 【Cocos2dx】资源目录,播放背景音乐,导入外部库
  12. 智伴机器人班尼_班尼机器人说明书
  13. 高新技术企业都需要准备哪些资料
  14. css摇杆,【宅家呗专题】Virtual Joystick虚拟摇杆插件教程
  15. OTFS学习记录3——MRC接收机
  16. 根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角
  17. Python快速读取超大文件
  18. 【第二届PHP全球开发者大会】惠新宸(鸟哥):PHP7性能之源
  19. UnityWebGL引用4399的Api
  20. HTML字体颜色对照表

热门文章

  1. 【Pytorch神经网络实战案例】20 基于Cora数据集实现图卷积神经网络论文分类
  2. 图像分类_04神经网络最优化过程:反向传播+代码实现
  3. 十二、PHP框架Laravel学习笔记——构造器的查询表达式
  4. LeetCode 1961. 检查字符串是否为数组前缀
  5. LeetCode 1257. 最小公共区域(最小公共祖先)
  6. LeetCode 261. 以图判树(全部连通+边数=V-1)
  7. LeetCode 252. 会议室(排序)
  8. 程序员面试金典 - 面试题 16.03. 交点(数学)
  9. LintCode 600. 包裹黑色像素点的最小矩形(BFS)
  10. unity python_Unity引擎内嵌python