返回顶部
首页 > 资讯 > 数据库 >redis在高并发下的性能讲解
  • 635
分享到

redis在高并发下的性能讲解

2024-04-02 19:04:59 635人浏览 薄情痞子
摘要

这篇文章主要介绍“Redis在高并发下的性能讲解”,在日常操作中,相信很多人在redis在高并发下的性能讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis在高并发下

这篇文章主要介绍“Redis高并发下的性能讲解”,在日常操作中,相信很多人在redis在高并发下的性能讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis在高并发下的性能讲解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

前言:

最近上手了一个项目,我负责该项目的架构设计与实现。本来公司做了很多给公司以外的人使用的api,但是在外人使用的时候,接口的链接是怎样就给别人怎么样,没有加密也没有做并发控制,接口程序所在的机器在哪,给别人的IP就在哪,而且没有平台进行管理。因此我清楚地知道,这些接口的价值很难被发现(哪个接口别人用的比较多,哪个接口别人用的比较少)。

仅仅针对”监控“的这一需求,我们引入了redis作为中间层,首先我们完善了用户使用接口的注册流程,通过用户信息和地址,hash出一个key,这个key是对应着一个地址的,把这个(key - 地址)对存在了redis里面。其次是Nginx,nginx在我们的项目里面的流程大概是这样:

1、用户注册之后获取到他的key,通过包含了key的跟原本的url完全不同的url来访问

2、nginx捕获到用户特殊的key,然后程序根据这个key从redis中取出目标地址,再由nginx代替用户访问真正的地址,继而返回。

(这个过程好处是很多的)

(1)、隐藏了真实的地址,程序可以在上游服务器之外的地方干预用户的访问,提高安全性,干预过程可以很复杂

(2)、获取用户的信息,并将其存回redis,上游服务器通过定时程序将存在redis中的日志持久化进oracle并删除,然后进一步分析和可视化

问题来了

这个项目还处于测试阶段,资源是一台window server 服务器,和Centos6.5服务器,测试阶段10秒内大概有10万的并发量,刚部署上去的一两天还是没有问题的,接下来却出现了redis连接不上的情况。查看进程访问,会出现下面的情况。(window server 下)

redis在高并发下的性能讲解

出现很多FiN_WaiT_2的tcp链接。

(学习视频分享:redis视频教程

分析

一、redis是使用单线程处理连接的,意味着它绝对会出现下面二所说的情况。

二、很明显这是由于nginx和redis之间有很多没有释放的资源造成的,查看这个TCP的状态FIN_WAIT_2,解释一下:

Http应用中,存在一个问题,SERVER由于某种原因关闭连接,如KEEPALIVE的超时,这样,作为主动关闭的SERVER一方就会进入 FIN_WAIT2状态,但TCP/IP协议栈有个问题,FIN_WAIT2状态是没有超时的(不象TIME_WAIT状态),所以如果CLIENT不关闭,这个FIN_WAIT_2状态将保持到系统重新启动,越来越多的FIN_WAIT_2状态会致使内核crash。

好吧,大学没有好好念书,下面是http连接的状态变化

客户端状态迁移

CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSEDb.

服务器状态迁移

CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

有缺陷的客户端与持久连接

有一些客户端在处理持久连接(akakeepalives)时存在问题。当连接空闲下来服务器关闭连接时(基于KeepAliveTimeout指令),

客户端的程序编制使它不发送FIN和ACK回服务器。这样就意味着这个连接 将停留在FIN_WAIT_2状态直到以下之一发生:

客户端为同一个或者不同的站点打开新的连接,这样会使它在该个套接字上完全关闭以前的连接。

用户退出客户端程序,这样在一些(也许是大多数?)客户端上会使操作系统完全关闭连接。

FIN_WAIT_2超时,在那些具有FIN_WAIT_2状态超时设置的服务器上。

如果你够幸运,这样意味着那些有缺陷的客户端会完全关闭连接并释放你服务器的资源。

然而,有一些情况下套接字永远不会完全关闭,比如一个拨号客户端在关闭客户端程序之前从ISP断开。

此外,有的客户端有可能空置好几天不创建新连接,并且这样在好几天里保持着套接字的有效即使已经不再使用。这是浏览器或者操作系统的TCP实现的Bug。

  产生原因有:

1、长连接并且当连接一直处于IDLE状态导致SERVERCLOSE时,CLIENT编程缺陷,没有向SERVER 发出FIN和ACK包

2、APACHE1.1和APACHE1.2增加了linger_close()函数,前面的帖子有介绍,这个函数可能引起了这个问题(为什么我也不清楚)

  解决办法:

1。对FIN_WAIT_2状态增加超时机制,这个特性在协议里没有体现,但在一些OS中已经实现

如:linux、SOLARIS、FREEBSD、HP-UNIX、IRIX等

2。不要用linger_close()编译

3。用SO_LINGER代替,这个在某些系统中还能很好地处理

4。增加用于存储网络连接状态的内存mbuf,以防止内核crash

5。DISABLE KEEPALIVE

针对这种情况,我们做了几次讨论,有些结论,分别是:

1、设置nginx与redis的连接池,keepalive的时间,分别设为10秒,5秒,但是结果还是一样

2、不用keepalive,即不使用连接池,即每次用完就close()掉,你可以看到连接少了,但是不使用连接池,意味着10秒内要打开关闭10万次,开销太大

3、redis集群,在原本集群的体系上添加redis的集群,这或许能解决问题,但是10秒内10万实际上并不多,这样做了或许是取巧,并没有找到问题

4、设置redis的idle(空闲)时间限制,结果一样。

解决方案:

实际上不算解决方案,因为放弃了redis的内存机制,而是使用nginx本身的内存技术。网上关于redis的优化大部分不适用,这个问题有待分析解决。


到此,关于“redis在高并发下的性能讲解”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: redis在高并发下的性能讲解

本文链接: https://lsjlt.com/news/55209.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • redis在高并发下的性能讲解
    这篇文章主要介绍“redis在高并发下的性能讲解”,在日常操作中,相信很多人在redis在高并发下的性能讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis在高并发下...
    99+
    2024-04-02
  • Golang Sync包在高并发场景下的性能对比
    在高并发场景下,Golang Sync包的性能表现非常出色。Sync包提供了一些用于并发控制的原语,包括互斥锁(Mutex)、读写锁...
    99+
    2023-10-08
    Golang
  • Redis在高并发情况下可能会存在哪些问题
    本篇文章为大家展示了Redis在高并发情况下可能会存在哪些问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、缓存穿透:当用户请求参数为param=zsan 的时...
    99+
    2024-04-02
  • 高并发下Nginx性能怎么优化
    本篇内容介绍了“高并发下Nginx性能怎么优化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Nginx同Apache一样都是一种WEB服务器...
    99+
    2023-06-25
  • java高并发下解决AtomicLong性能瓶颈方案LongAdder
    目录一、 LongAdder简介二、LongAdder代码分析(1)LongAdder的结构(2)add方法实现(3)add方法中longAccumulate方法的实现三、总结一、 ...
    99+
    2022-12-21
    java高并发AtomicLong LongAdder java 高并发
  • redis高并发下数据一致性的优势有哪些
    在Redis高并发下,数据一致性的优势主要体现在以下几个方面:1. 高性能:Redis是基于内存的存储系统,读写速度非常快,可以支持...
    99+
    2023-09-11
    redis
  • 单例模式在高并发环境下的性能优化实践
    随着互联网的不断发展,高并发的应用场景越来越普遍。在这样的应用场景下,性能优化成为了一个重要的课题。而单例模式作为一种常见的设计模式,在高并发环境下也需要进行性能优化,以保证系统的稳定性和响应速度。单例模式是一种创建型的设计模式,它保证一个...
    99+
    2023-10-21
    性能优化 单例模式 高并发
  • Python日志和npm:如何在并发场景下提高性能?
    在现代应用程序中,日志记录是非常重要的。它可以帮助我们理解应用程序的运行情况,排除错误,并优化性能。在并发场景下,如何正确地记录日志并提高性能是一个非常重要的问题。在本文中,我们将讨论如何使用Python日志和npm来解决这个问题。 Py...
    99+
    2023-09-14
    日志 并发 npm
  • 总结高并发下Nginx性能如何优化
    目录特点优势安装和命令配置文件代理模式和配置反向代理正向代理(forward proxy) :反向代理(reverse proxy)︰透明代理∶动静分离日志管理日志格式日志切割高并发...
    99+
    2024-04-02
  • 如何在ASP IDE中提高并发性能?
    ASP (Active Server Pages) 是一种非常流行的Web开发技术,它可以使用多种编程语言编写,如VBScript、JavaScript、JScript等等。在Web应用程序中,提高并发性能是非常重要的,因为这可以确保应用程...
    99+
    2023-10-11
    ide path 并发
  • Redis解决高并发问题
    1 模拟商品抢购和并发的效果 这里模拟一个商品抢购的过程所带来的问题,以及解决问题的思路。 这里模拟的商品抢购过程是一个商品正常购买的过程,其中包含了两个主要的步骤:商品库存减少和商品购买记录的添加。...
    99+
    2023-09-21
    redis 数据库 mysql
  • redis怎么解决高并发
    redis 提供多种高并发解决方案:1. 集群分片数据,提升吞吐量和容错性;2. 复制确保数据可用性和提升读性能;3. 管道减少网络开销,提高吞吐量;4. 事务保证原子性,防止数据不一致...
    99+
    2024-06-03
    redis 并发请求
  • redis如何解决高并发
    redis 高效解决高并发问题,主要得益于以下机制:1)内存存储,极速读写;2)单线程事件循环,无锁竞争;3)多路复用 i/o,同时监听多个连接;4)优化数据结构,快速查找、插入和删除;...
    99+
    2024-06-12
    redis
  • Go语言API和NumPy:如何在并发环境下提高性能?
    在现代计算机中,处理大量数据和计算密集型任务已经成为了一个常见的需求。为了满足这些需求,现在有很多优秀的工具和框架,其中包括Go语言API和NumPy。这两个工具都提供了很好的性能和高效的并发处理能力。那么,在并发环境下如何使用这两个工具...
    99+
    2023-07-27
    api numpy 并发
  • Golang在高并发系统的性能优化实践
    在高并发系统中优化 go 语言性能的实践包括:管理 goroutine:限制数量、使用池、监控状态。锁的使用:根据需要使用读写锁、避免全局锁、细粒度锁。性能分析:使用 pprof、tra...
    99+
    2024-05-12
    golang 高并发 优化实践 并发访问
  • SpringBoot整合Redis实现高并发数据缓存的示例讲解
    目录什么是缓存为什么要用缓存Redis为什么这么快实现一个用户信息的缓存方式一:利用RedisTemplate实现 导入依赖添加配置添加redis工具类及配置类service层con...
    99+
    2023-03-13
    SpringBoot Redis高并发数据缓存 SpringBoot Redis缓存
  • redis能承受高并发访问吗
    是的,Redis可以承受高并发访问。Redis是一个高性能的内存数据库,其设计目标之一就是能够处理高并发的访问。Redis通过使用单...
    99+
    2023-08-24
    redis
  • Redis并发访问问题详细讲解
    目录前言什么场景需要控制并发访问并发访问的控制方法1、加入锁机制2、操作原子化小结前言 我们在使用Redis的过程中,难免会遇到并发访问及数据更新的问题。但很多场景对数据的并发修改是很敏感的,比如库存数据如果没有做好并发...
    99+
    2022-12-02
    Redis并发访问 Redis控制并发访问
  • Redis:高并发场景下的数据存储解决方案
    Redis:高并发场景下的数据存储解决方案随着互联网的迅速发展,高并发场景下的数据存储已成为各大企业关注的焦点。在面对海量请求和快速响应的需求时,传统的关系型数据库面临性能瓶颈。而Redis作为一种高性能的非关系型数据库,逐渐成为高并发场景...
    99+
    2023-11-07
    解决方案 数据存储 高并发
  • 浅谈Redis高并发缓存架构性能优化实战
    目录场景1: 中小型公司Redis缓存架构以及线上问题实战场景2: 大厂线上大规模商品缓存数据冷热分离实战场景3: 基于DCL机制解决热点缓存并发重建问题实战场景4: 突发性热点缓存...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作