摘要:聚焦Redis的性能分析,思考Redis 可以通过哪些机制来提高性能,当性能瓶颈发生的时候,我们又能做出哪些优化策略,最终确保业务系统的稳定运行。

本文分享自华为云社区《分析内部运行机制,教你解决Redis性能问题》,作者: 华为云社区精选。

Redis是一种键值数据库,有着时延低、性能好、数据结构丰富的特点,常用作缓存、排行榜、计数器、 消息队列等,是电商秒杀、聊天系统等业务场景中的“熟客”。

作为一个“缓存中间商”,Redis的性能问题至关重要,一旦发生操作延迟问题,很容易引起连锁反应。所以本文聚焦Redis的性能分析,从Redis的基本概念出发,了解Redis是什么,它的运行机制,思考Redis可以通过哪些机制来提高性能,当性能瓶颈发生的时候,我们又能做出哪些优化策略,最终确保业务系统的稳定运行。

读懂Redis:缓存神器原来是这样工作的

一个网站总有大量的数据是用户共享的,如果每个用户都去数据库查询,效率就太低了。所以有了新的解决方案:将用户共享数据缓存到服务器的内存中。

举个例子,应用程序们从MySQL查询到的数据,会到Redis这里登记,后面再需要用的时候,就先查找Redis的缓存,无需返回到MySQL查找。一套流程下来,为MySQL减轻了不小的负担,网络服务的性能显著提升。

Redis堪称数据库届的万金油,哪里需要往哪里搬,这也得益于它有着丰富的数据结构,以及强大的读写性能。

以数据结构为例,Redis和其他结构化存储的重要区别便是,它不仅支持字符串,还支持不同类型的抽象数据结构,如列表、映射、集、排序集、HyperLogLogs、位图、流和空间索引等。那么Redis是如何做到如此“万能”的,它支持的这些数据结构又是如何从底层实现呢?《三次给你聊清楚Redis》之Redis是个啥 就从非关系型数据库谈起,详细聊了聊这个问题,就像最简单的字符串,Redis并未沿袭传统c语言的惯例,而是单独构建了一种简单的动态字符串抽象类型,并充分利用SDS实现。

当然,如果你想进一步了解Redis系统的设计理念,比如它通过什么机制将数据缓存到内存中,开发大系统必备技术之Redis技术学习与研究或许会给你一些启发,作者谈到了Redis的历史、流行度、设计思想,并通过支持Redis的Java客户端Jedis ,用详尽的代码案例一步步演示了它支持的数据类型使用方法,它的事务特性、集群等等,更为具象地了解Redis的特点。

当我们对Redis的基本原理了然于胸后,再针对业务场景进行优化时,也能更合理地使用各种Redis命令。

Redis性能:祸福相依的内部运行机制

Redis的最大特点是使用内存来存储数据,当内存超过物理内存的限制后,内存数据会和磁盘产生频繁的交换,最终导致Redis性能急剧下降。所以在生产环境中我们通过配置参数maxmemoey来限制使用的内存大小。 在有趣的Redis:缓存被我写满了,该怎么办? 中,作者详细解释了2个常见的缓存淘汰算法LRU算法和LFU算法,如何删除那些没用的数据。

另一方面,Redis为了把内存中的数据持久到磁盘上,也提供了完善的持久化机制,主要包括2种:

  • RDB:产生一个数据快照文件
  • AOF:实时追加命令的日志文件

但是如果配置不合理,持久化会占用过多内存从而影响性能。举个例子,如果AOF的刷盘时机设置为每次写入都刷盘,由于每次写命令都需要写入文件并刷到磁盘中才会返回,当写入量很大时,会增加磁盘IO的负担,大大降低Redis的写入性能。Redis 持久化是如何做的?一文聊聊 RDB和AOF对比分析 谈到了这两种持久化机制对Redis性能的影响,建议大家针对不同的业务场景选择合适的持久化方式。

在讨论Redis性能问题的时候,不得不提的一点是它的单线程结构,这里的单线程指的是执行命令 ,比如一条命令从客户端到达服务端不会立刻被执行,而是会进入一个队列中等待,每次只会有一条指令被选中执行。【Redis破障之路】:Redis单线程架构 详细分析了单线程模型的Redis为什么性能如此之高,能达到每秒万级别的处理能力,简单透露两点:纯内存访问、I/O多路复用技术,具体可以阅读文章。而Redis的单线程架构,也意味着网络问题会对它的性能产生一定的影响。

另外,当业务规模扩大,单个Redis服务无法承载的时候,我们常常会用分布式架构来提高Redis的性能,Redis主从复制以及哨兵的原理解读 和 Redis Sentinel 源码:Redis的高可用模型分析 都讨论了主从模式下的关键功能:哨兵,通过对其源码的理解,详细说明了哨兵的代码实现方式,并学会使用哨兵功能解决主节点的写能力、存储能力限制等等。

除此之外,诸如数据结构的复杂度、网络带宽、操作系统以及硬件本身都会对Redis的性能产生影响,它的性能问题几乎涵盖了 CPU、内存、网络、磁盘的方方面面,再此不一一赘述。

综上,我们分析了影响Redis性能的一些关键内部机制,比如它的缓存淘汰算法;它的持久化会占用过多内存从而影响性能;它的单线程架构等。通过了解Redis的这些内部实现原理,也能进一步帮助大家排查它的性能问题。

Redis调优:宕机怎么办?收下这几颗灵丹妙药

下面,我们将给出一些应对Redis性能问题的解决方案。

以常见的缓存问题为例,通常情况下,Redis缓存层由于某种原因宕机后,所有的请求会涌向存储层,短时间内的高并发请求可能会导致存储层挂机,称之为“Redis雪崩”。Redis缓存异常应对方案分析 有针对性的总结了Redis发生缓存穿透、雪崩、击穿情况时,能够有效应对的解决方案,比如不要给访问频繁的热点数据设置过期时间,从而解决Redis实例没有起到缓存层作用的问题。

大key也是影响Redis性能的关键因素,如果一个 key 写入的 value 非常大,那么 Redis 在分配内存时就会比较耗时。同样的,当删除这个 key 时,释放内存也会比较耗时,这种类型的 key 我们一般称之为 大key。 在 分布式缓存数据库Redis大KEY问题定位及优化建议 中,作者就针对数据库报错OOM来一步步分析大key的问题,先是查看Redis集群内存监控指标,确认内存异常分片,然后通过在线&离线工具分析,结果显示大key导致数据大小分布不均。对此作者给出了两个方案:短期是删除查询到的key,长期是对大key进行拆分。

另一个经常被诟病性能问题的是fork, fork是开源Redis的一个重要依赖,当 Redis 开启了后台 RDB 和 AOF rewrite 后,在执行时,它们都需要主进程创建出一个子进程进行数据的持久化,fork就是创建子进程的系统调用函数。

在华为云GaussDB(for Redis)服务团队支撑某客户业务上云的过程中 ,就发现了由fork引发的时延抖动问题,文章一场由fork引发的超时,让我们重新探讨了Redis的抖动问题 还原了当时的场景,探究了fork对性能的影响,包括业务抖动、内存率利用率降低和实例容量受限。比如,在电商大促、热点事件等业务高峰时发生上述fork,会导致Redis阻塞,进而对业务造成雪崩的影响。

团队通过修改日志、系统性排查整改代码中的 fork调用,最后在新版本GaussDB(for Redis)中解决了该问题,并清零了内部的fork使用,与原生Redis相比,彻底解决了fork的性能隐患。

其实,考虑到业务场景越来越复杂,原生Redis出现性能瓶颈难以避免。这时候,最简单粗暴的解决方法就是使用商业版本的Redis,一劳永逸解决可能存在的性能问题。

在 GaussDB(for Redis)与原生Redis集群的性能对比 中,就比较了华为云自研Redis和原生Redis集群在X86架构下的性能测试报告,结果表明GaussDB(for Redis)在性能、抗写和存储成本上的优势明显。

从相识到相惜:Redis与计算存储分离四部曲 进一步从技术角度拆解分析了GaussDB(for Redis)如何在存算分离的架构下,实现强一致、秒扩容、超可用、低成本。以强一致为例,Redis遇到流量压力进行主从切换时很容易发生数据不同步问题,GaussDB ( for Redis)就在存储层(DFV层)去进行强一致的数据同步,而非计算层,这样就避免了任何中间态下的数据的不一致,再也不用担心宕机导致数据丢失。更多的技术细节揭秘,也可以阅读这组专题高斯Redis揭秘系列文章,更全面的认识GaussDB ( for Redis)。

Redis的性能问题,涉及到的技术细节很多,本专题只是列出了一些较为典型的问题,希望读者能够通过上述提及的技术文章,对它有更深入的认识,学会从底层运行机制去思考Redis的性能调优。

点击关注,第一时间了解华为云新鲜技术~

分析内部运行机制,教你解决Redis性能问题相关推荐

  1. ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析

    理解ActiveRecord::Concern: 参考:include和extend的区别: https://www.cnblogs.com/chentianwei/p/9408963.html 传统 ...

  2. Ray --内部运行机制、对象存储中对象的存储和容错

    本篇主要介绍了分布式框架 Ray 的内部运行机制,对象的存储过程和容错能力.内部运行机制主要分为Ray的连接,远程函数的定义和使用以及获取对象ID的运行机制.对象存储主要是对象放入的序列化和从对象调出 ...

  3. 浅谈SQL Server内部运行机制

    原文:浅谈SQL Server内部运行机制 对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL ...

  4. Vue.js 内部运行机制之总结 常见问题解答

    Vue.js 内部运行机制之总结 & 常见问题解答 总结 在本小册的第一节中,笔者对 Vue.js 内部运行机制做了一个全局的概览,当时通过下面这张图把 Vue.js 拆分成一个一个小模块来介 ...

  5. VC++的学习(基于VS2008)——windows程序内部运行机制

    昨天和今天都在学习windows程序的内部运行机制,再次学习这一章,我明显感到条理清晰了,原来这一章是讲我们所用的电脑,这样一个windows平台下程序运行的内部机制的.windows应用程序下最重要 ...

  6. vlc内部运行机制以及架构分析

    VLC架构剖析1. VideoLan简介1.1 videolan组成Videolan有以下两部分组成:VLC:一个最主要的部分,它可以播放各种类型的媒体文件和流 vlc架构剖析 1. VideoLan ...

  7. [转] webpack之plugin内部运行机制

    简介 webpack作为当前最为流行的模块打包工具,几乎所有的主流前端开发框架(React.Vue等)都会将其作为默认的模块加载和打包工具.通过简单的配置项,使用各种相关的loader和plugin, ...

  8. vlc内部运行机制以及架构分

    VLC架构剖析1. VideoLan简介1.1 videolan组成Videolan有以下两部分组成:VLC:一个最主要的部分,它可以播放各种类型的媒体文件和流 vlc架构剖析 1. VideoLan ...

  9. IIS 内部运行机制

    ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用. 绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices ...

最新文章

  1. UA MATH571A 多元线性回归II 变量选择
  2. 【初级】String str= ac,42,123,sd Fa,c df,4,acdf,5ewRRre ;1.把字符串按,进行分割
  3. 文件夹修改名字 matlab,matlab用 movefile更改文件夹内文件名字
  4. proxy connect abort处理方法_Java代理设计模式(Proxy)的几种具体实现
  5. wxpython使窗口重新显示出来_wxPython实现窗口在任务栏中闪烁
  6. python用xlrd怎么清洗数据_利用Python进行数据清洗
  7. HDU 6319(单调队列)
  8. hdu1251(trie树)
  9. 使用CImage类将RGB图像转化为灰度图像
  10. [转载] python中的且语句_简单探讨python中的语句和语法
  11. 字典树哇 AC自动机哇 = _ =
  12. AndroidStudio使用localMaven
  13. Matplot pyplot绘制单图,多子图不同样式详解
  14. go php 框架,go框架 - Go语言中文网 - Golang中文社区
  15. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect database name ‘dongdong_1
  16. 【递归入门】走迷宫(c++)
  17. Python的学习之旅第一站:基本语法
  18. 6n137光耦怎么测好坏_817A光耦怎么测好坏,光耦合器
  19. KSO-sql server获取当月天数
  20. 矩阵运算库 C语言 (Matrix_hub)

热门文章

  1. 开源硬件_如何参与开源硬件协会
  2. 前端:CSS/12/display属性,overflow属性,cursor光标类型,CSS定位,综合案例:今日闪价
  3. Struts Action 控制器
  4. es6 使用修饰器实现Mixin模式
  5. 视觉SLAM十四讲学习笔记-第四讲-李群与李代数基础和定义、指数和对数映射
  6. 运行Gazebo出现cmd /opt/ros/melodic/lib/gazebo_ros/gzserver类似错误
  7. extjs 点击下拉框三角形触发事件_省市县三级联动下拉框的具体实现
  8. java 执行 cd_java执行cd命令
  9. 手机端html返回顶部,vue实现移动端返回顶部
  10. 在Linux中切换用户的命令是set,Linux基础命令---切换用户su