​ 在上一篇文章:Redis为什么变慢了?常见延迟问题定位与分析,主要分析了Redis常见的导致变慢的场景以及问题定位和分析,主要是由业务使用不合理和运维不当导致的。

​ 我们在了解了导致Redis变慢的原因之后,针对性地优化,就可以让Redis稳定发挥出更高性能。

​ 这篇文章我们就来总结一下,在使用Redis时的最佳实践方式,主要包含两个层面:业务层面、运维层面

​ 由于我之前写过很多UGC后端服务,在大量场景下用到了Redis,这个过程中也踩过很多坑,所以在使用过程中也总结了一套合理的使用方法。

​ 后来做基础架构,开发Codis、Redis相关的中间件,在这个阶段关注领域从使用层面下沉到Redis的开发和运维,更多聚焦在Redis的内部实现和运维过程中产生的各种问题,在这块也积累了一些经验。

​ 下面就针对这两块,分享一下我认为比较合理的Redis使用和运维方法,不一定最全面,也可能与你使用Redis的方法不同,但以下这些方法都是我在踩坑之后总结的实际经验,供你参考。

业务层面

​ 业务层面主要是开发人员需要关注,也就是开发人员在写业务代码时,如何合理地使用Redis。开发人员需要对Redis有基本的了解,才能在合适的业务场景使用Redis,从而避免业务层面导致的延迟问题。

​ 在开发过程中,业务层面的优化建议如下:

  • key的长度尽量要短,在数据量非常大时,过长的key名会占用更多的内存
  • 一定避免存储过大的bigkey,bigkey在分配内存和释放内存时耗时严重,会阻塞主线程
  • Redis 4.0以上建议开启lazy-free机制,释放bigkey时异步操作,不阻塞主线程
  • 建议设置过期时间,把Redis当做缓存使用,尤其在数量很大的时,不设置过期时间会导致内存的无限增长
  • 不使用复杂度过高的命令,例如SORTSINTERSINTERSTOREZUNIONSTOREZINTERSTORE,使用这些命令耗时较久,会阻塞主线程
  • 查询数据时,一次尽量获取较少的数据,在不确定容器元素个数的情况下,避免使用LRANGE key 0 -1ZRANGE key 0 -1这类操作,应该设置具体查询的元素个数,推荐一次查询100个以下元素
  • 写入数据时,一次尽量写入较少的数据,例如HSET key value1 value2 value3...,控制一次写入元素的数量,推荐在100以下,大数据量分多个批次写入
  • 批量操作数据时,用MGET/MSET替换GET/SETHMGET/MHSET替换HGET/HSET,减少请求来回的网络IO次数,降低延迟,对于没有批量操作的命令,推荐使用pipeline,一次性发送多个命令到服务端
  • 禁止使用KEYS命令,需要扫描实例时,建议使用SCAN,线上操作一定要控制扫描的频率,避免对Redis产生性能抖动
  • 避免某个时间点集中过期大量的key,集中过期时推荐增加一个随机时间,把过期时间打散,降低集中过期key时Redis的压力,避免阻塞主线程
  • 根据业务场景,选择合适的淘汰策略,通常随机过期要比LRU过期淘汰数据更快
  • 使用连接池访问Redis,并配置合理的连接池参数,避免短连接,TCP三次握手和四次挥手的耗时也很高
  • 只使用db0,不推荐使用多个db,使用多个db会增加Redis的负担,每次访问不同的db都需要执行SELECT命令,如果业务线不同,建议拆分多个实例,还能提高单个实例的性能
  • 读的请求量很大时,推荐使用读写分离,前提是可以容忍从节数据更新不及时的问题
  • 写请求量很大时,推荐使用集群,部署多个实例分摊写压力

运维层面

​ 运维层面主要是DBA需要关注的,目的是合理规划Redis的部署和保障Redis的稳定运行,主要优化如下:

  • 不同业务线部署不同的实例,各自独立,避免混用,推荐不同业务线使用不同的机器,根据业务重要程度划分不同的分组来部署,避免某一个业务线出现问题影响其他业务线
  • 保证机器有足够的CPU、内存、带宽、磁盘资源,防止负载过高影响Redis性能
  • 以master-slave集群方式部署实例,并分布在不同机器上,避免单点,slave必须设置为readonly
  • master和slave节点所在机器,各自独立,不要交叉部署实例,通常备份工作会在slave上做,做备份时会消耗机器资源,交叉部署会影响到master的性能
  • 推荐部署哨兵节点增加可用性,节点数量至少3个,并分布在不同机器上,实现故障自动故障转移
  • 提前做好容量规划,一台机器部署实例的内存上限,最好是机器内存的一半,主从全量同步时会占用最多额外一倍的内存空间,防止网络大面积故障引发所有master-slave的全量同步导致机器内存被吃光
  • 做好机器的CPU、内存、带宽、磁盘监控,在资源不足时及时报警处理,Redis使用Swap后性能急剧下降,网络带宽负载过高访问延迟明显增大,磁盘IO过高时开启AOF会拖慢Redis的性能
  • 设置最大连接数上限,防止过多的客户端连接导致服务负载过高
  • 单个实例的使用内存建议控制在10G以下,过大的实例会导致备份时间久、资源消耗多,主从全量同步数据时间阻塞时间更长
  • 设置合理的slowlog阈值,推荐10毫秒,并对其进行监控,产生过多的慢日志需要及时报警
  • 设置合理的复制缓冲区repl-backlog大小,适当调大repl-backlog可以降低主从全量复制的概率
  • 设置合理的slave节点client-output-buffer-limit大小,对于写入量很大的实例,适当调大可以避免主从复制中断问题
  • 备份时推荐在slave节点上做,不影响master性能
  • 不开启AOF或开启AOF配置为每秒刷盘,避免磁盘IO消耗降低Redis性能
  • 当实例设置了内存上限,需要调大内存上限时,先调整slave再调整master,否则会导致主从节点数据不一致
  • 对Redis增加监控,监控采集info信息时,使用长连接,频繁的短连接也会影响Redis性能
  • 线上扫描整个实例数时,记得设置休眠时间,避免扫描时QPS突增对Redis产生性能抖动
  • 做好Redis的运行时监控,尤其是expired_keysevicted_keyslatest_fork_usec指标,短时间内这些指标值突增可能会阻塞整个实例,引发性能问题

总结

​ 以上就是我在使用Redis和开发Redis相关中间件时,总结出来Redis推荐的实践方法,以上提出的这些方面,都或多或少在实际使用中遇到过。

Redis最佳实践:业务层面和运维层面优化相关推荐

  1. Redis最佳实践:7个维度+43条使用规范,带你彻底玩转Redis | 附实践清单

    阅读本文大约需要 16 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊 Redis 的最佳实践. 你的项目或许已经使用 Redis 很长时间了,但在使用过程中,你可能还会或多或少地遇到以下 ...

  2. 缓存之王 | Redis最佳实践开发规范FAQ

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 本文是来自阿里云2021版最新Redis最佳实践指南.文档可以在云栖社区下载. Redis–从问题 ...

  3. Redis 最佳实践 1

    JedisPool 使用的最佳实践(阿里云上现成的,其实就是对Apache-commons-pool2这个库的理解,网上找的七七八八的都是说的GenericObjectPool的配置导致的一些time ...

  4. Redis最佳实践指南

    如果你是一位后端工程师,面试时八成会被问到 Redis,特别是那些大型互联网公司,不仅要求面试者能简单使用 Redis,还要深入理解其底层实现原理,具备解决常见问题的能力.可以说,熟练使用 Redis ...

  5. 【Redis最佳实践】使用DCS Redis实现排行榜功能

    本节基于华为云DCS Redis实践所编写,用于指导您在以下场景使用DCS Redis实现排行榜功能. 目录 场景介绍 代码示例 实践指导 运行结果 华为云DCS Redis介绍 场景介绍 在网页和A ...

  6. 4.Redis最佳实践

    Redis的键值设计: (1)优雅的key设计 : 遵循基本格式 : [业务名称] : [数据名] : [id] 长度不超过44字节 不包含特殊字符 例如我们的登录业务 , 保存用户信息 , 其key ...

  7. 小程序商城Mall,打造最佳SpringCloudAlibaba最佳实践

    背景 由于一路一来看过很多的技术体系,也见证一些技术体系停止维护,想用自己觉得比较好的一套技术体系来做一个分布式微服务系统,包括开发层面,中间件层面和运维层面的技术,作为自己希望的一个技术团队里的技术 ...

  8. PAI和Hologres的个性化推荐最佳实践

    简介:常见的个性化推荐系统包括日志收集,数据加工,召回,排序,离在线效果评估等诸多环节,对于中小客户存在技术门槛高,搭建周期长等问题.计算平台基于 PAI,Hologres,MaxCompute,Da ...

  9. Tita 推进企业绩效管理变革的最佳实践

    企业绩效变革是当前很多企业,特别是一些千人级以上的大企业所面临的巨大难题.随着疫情的反复.外部市场竞争的挑战,越来越多的企业开始寻求绩效变革,从而解决当前企业面临的增长乏力.或创新突破.人员稳定等方面 ...

最新文章

  1. oracle 尖括号_Oracle常用函数整理
  2. ( function(){…} )()和( function (){…} () )是两种立即执行函数
  3. java 协程框架_GitHub - yaozhang0105/dactor: Dactor是基于Java的轻量级同步异步统一处理框架,基于协程思想构建...
  4. ajax点击更改div,jquery ajax双击div可直接修改div中的内容
  5. 实时滚动图表绘制方法: LightningChart教程 + 源码下载
  6. TensorFlow学习笔记(1):variable与get_variable, name_scope()和variable_scope()
  7. ssl1763-观光旅游【最小环,Floyd,dijkstra】
  8. 一种单独适配于NER的数据增强方法:DAGA
  9. Android连接相机WiFi,安卓手机使用佳能相机机身wifi传输拍摄的操作
  10. linux之添加python环境变量
  11. 仿souhu页面设计
  12. java实现身份证归属地查询
  13. 8类网线利弊_超6类7类8类网线进来挨打 6类线全面测评 网速和传输速率测试
  14. Python——OCR识别
  15. 推荐一款STM32F030K6T6兼容替换灵动MM32F031K6T6
  16. pythonshell窗口是什么_使用IDLE的Python shell窗口实例详解
  17. linux 查看裸设备与lv,LINUX 如何查看裸设备
  18. 冻结pexcel 代码 -- 这次看看能坚持多久
  19. 联通光猫后面串接路由器的问题
  20. CentOS 开机启动详解

热门文章

  1. EL:谁说N素含量高就不固氮了(本研究反而“多多益善”)
  2. Cell综述:动植物界的微生物群和宿主营养
  3. ggplot2笔记9:绘图需要的数据整理技术
  4. R语言使用caret包对GBM模型参数调优(自定义调优的评估指标,例如ROC指标):抽取预测标签及类概率、抽样ROC的指标并绘制密度图
  5. R语言ggplot2可视化配置多个子图中的相同分组使用相同的填充色实战
  6. Python代码发现链表中的环并输出环中的第一个元素
  7. 词移距离 Word Mover‘s Distance
  8. oracle12c dml语句缓存,Oracle --DML、DDL、DCL
  9. 学习笔记:数据分析和处理(ML计算模型前的预处理)——持续更新
  10. 基因组关联分析中的交互作用研究