【Redis 神秘大陆】005 常见性能优化方式

news2024/11/25 12:25:45

五、Redis 性能优化

5.1 系统层面的优化

https://github.com/sohutv/cachecloud/blob/main/redis-ecs/script/cachecloud-init.sh

img

initConfig() {
  # 支持虚拟内存分配
  sysctl vm.overcommit_memory=1
  # 最大排队连接数设置为 511,一般默认是 128
  echo 511 >/proc/sys/net/core/somaxconn
  # 禁用透明大页,使用传统的小页进行管理,大页可能会导致性能下降或者不稳定
  echo never >/sys/kernel/mm/transparent_hugepage/enabled
  echo never >/sys/kernel/mm/transparent_hugepage/defrag
  # 内核将尽量减少对交换分区(内存数据存储到磁盘上)的使用,提高性能避免不必要的
  echo 0 >/proc/sys/vm/swappiness &
  # 关闭系统上的交换分区,并且输出重定向到文件
  nohup swapoff -a >swap.out 2>&1
  echo -e "\033[41;36m OK: initial config done. \033[0m"
}

5.2 客户端优化

5.2.1 维度化缓存

img

在电商系统中,一个商品可能包含多个维度的数据,如基础属性、图片列表、上下架状态、规格参数、商品介绍等。针对这种情况,可以采用维度化缓存方案进行优化,以减少更新成本和服务压力。

方案概述
  • 将商品数据按照不同维度进行拆分,并对每个维度进行缓存。
  • 对于商品变更,只更新变更的部分数据,而不是整个商品数据。
  • 对于频繁变更的维度,如上下架状态,通过维度化缓存可以减少服务压力。
实施方式
  • 接收MQ进行更新:根据不同维度的变更,通过消息队列(MQ)接收更新消息,对相应维度的缓存进行增量更新。

5.2.2 大 Value 优化

在缓存中存在大Value的情况下,特别是在使用Redis等内存数据库时,需要注意缓存的大小限制。针对大Value的缓存,可以考虑以下方案:

  • 使用多线程缓存:采用多线程实现的缓存(如Memcached)来缓存大Value,以提高并发读写能力。
  • 压缩Value:对Value进行压缩,减小存储空间。
  • 拆分Value:将大Value拆分为多个小Value,在客户端进行查询和聚合,以降低单个缓存项的大小。

5.2.3 热点缓存

对于访问频率非常高的热点缓存,直接从远程缓存系统中获取可能会导致系统负载过高、响应慢等问题。针对这种情况,可以考虑以下解决方案:

  • 增加从缓存:增加更多地从缓存节点,通过负载均衡机制读取从缓存系统的数据,以提高并发读取能力。

  • 本地缓存:在客户端所在的应用/代理层本地存储一份热点数据的副本,减少对远程缓存系统的访问,提高响应速度。

  • 定期更新策略:对于不那么频繁变化的数据,可以考虑在本地缓存一段时间后,定期从远程缓存系统更新数据,以保持数据的实时性。

5.2.4 迁移过程优化

Redis Cluster 模式下集群只对 Redis 的存活负责,不对数据负责。客户端提交请求后,如果这个 key 不归属于这个服务器,会返回 MOVE 命令,客户端需要自行跳转,增加网络一跳。

问题描述
迁移槽过程中网卡流量和CPU压力问题开发迁移工具,解决网卡流量和CPU压力问题,实现迁移过程中的性能平衡。 当监控程序发现分片流量过大或者key数量过多时,自动启动迁移工具,实现自动迁移。
对Redis分槽策略进行改造,使得事务及多key操作能够顺利执行改造Redis的分槽策略,使相关性的一组key可以使用统一的前缀,并保存到同一片中。 当key满足特定格式时,只针对其中内容计算hash值,保证事务以及多key操作的正常执行。

5.3 服务端优化

https://github.com/eishay/jvm-serializers/wiki

5.3.1 参数优化

降低主从延迟

repl-disable-tcp-nodelay :

  • [ 默认 ] 关闭状态:主节点产生的命令数据无论大小都会及时发送给从节点,减小主从之间的延迟,但增加网络带宽消耗。适用于网络环境良好的场景,如同机架或同机房部署
  • 开启状态:主节点会合并较小的TCP数据包以节省带宽,但会增加主从之间的延迟。适用于网络环境复杂或带宽紧张的场景,如跨机房部署
主从复制参数优化
参数名称参数描述默认值建议值
repl-backlog-size设置主节点上复制积压缓冲区的大小,用于存储最近的写命令数据。增大该值可以减少数据丢失的风险,但会增加内存占用。1MB根据系统内存大小,建议设置为系统内存的 1% 至 10%。
repl-timeout设置主节点等待从节点响应的超时时间。增加该值可以减少因网络延迟导致的复制失败,但会延长故障检测和恢复的时间。60秒根据网络延迟情况,建议设置为网络延迟的两倍以上。
client-output-buffer-limit slave设置主节点在复制期间向从节点发送数据的缓冲区大小限制。增大该值可以缓解数据传输的瓶颈,但会增加内存占用。256MB / 64MB根据网络带宽和从节点数量,建议设置为适当大小,不超过系统可用内存的 20%。
repl-diskless-sync启用或禁用无盘复制功能,即主节点生成的RDB文件不保存到硬盘而是直接通过网络发送给从节点。启用无盘复制可以减少磁盘IO开销。关闭根据硬盘性能和网络带宽,可以根据实际情况启用或禁用。
min-slaves-to-write设置当从节点数量达到指定值时,主节点才会执行写命令。可以保证从节点足够健康,避免因从节点数量不足而导致数据丢失。0根据从节点数量和可用性需求,建议设置为 1 或更高。
min-slaves-max-lag设置从节点的复制延迟阈值,即从节点与主节点之间的延迟超过该值时,主节点将停止接收写命令。可以保证从节点的数据及时同步,减少复制延迟。10秒根据系统的复制延迟情况,建议设置为适当的阈值。
slave-serve-stale-data设置从节点在复制期间是否继续响应读命令。如果设置为yes,则从节点会继续响应读命令,即使数据可能过期或不一致。如果设置为no,则从节点只会返回同步中的信息。yes根据应用场景的需求,建议设置为 yes 或 no。

5.3.2 架构优化

复制风暴

img

复制风暴是指在Redis中,大量从节点同时对同一主节点或者对同一台机器的多个主节点发起全量复制的过程。这种情况会给主节点或者机器带来大量的开销,包括CPU、内存和带宽消耗。为了规避复制风暴,可以采取以下几个解决方案:

  • 单主节点复制风暴:

  • 问题:

  • 单主节点复制风暴通常发生在主节点挂载多个从节点的场景。当主节点重启后,从节点会发起全量复制流程,主节点为每个从节点创建RDB快照。如果在创建完毕之前有多个从节点同时尝试与主节点进行全量同步,主节点会为它们创建多个快照,导致网络带宽消耗严重,延迟增大,甚至导致主从连接断开。

  • 解决方案:

  • 包括减少主节点挂载从节点的数量,采用树状复制结构,加入中间层从节点用来保护主节点。树状结构可以将网络开销交给位于中间层的从节点,降低了顶层主节点的压力,但也增加了运维的复杂性。

  • 多主节点复制风暴:

  • 问题:

  • 多主节点复制风暴发生在多个主节点同时向相同的从节点发起全量复制的情况。这可能导致从节点同时接收多份不同数据源的数据,造成数据的不一致性。

  • 解决方案:

  • 包括避免在同一台机器上部署多个主节点,或者采用合适的复制策略确保从节点只接收来自一个主节点的数据。

5.4 其他优化

5.4.1 提升缓存命中率

缓存场景分析:

  • 缓存适合读多写少的场景,否则命中率低,意义不大。
  • 业务需求决定了对时效性的要求,直接影响缓存过期时间和更新策略。
  • 时效性要求越低,越适合缓存。
  • 相同key和请求次数下,缓存时间越长,命中率越高。
  • 大多数互联网应用场景都适合使用缓存。

命中率说明:

  • 命中:可以直接通过缓存获取到需要的数据。
  • 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其他的操作。原因可能是由于缓存中根本不存在,或者缓存已经过期。

通常来讲,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。

  • 缓存设计:

  • 缓存粒度越小,命中率越高。单个对象缓存只需在该对象数据发生变化时更新或移除。

  • 缓存集合时,任何对象数据变化都需要更新或移除缓存。

  • 缓存容量和基础设施:

  • 缓存容量有限,易引起失效和淘汰(常采用LRU算法)。

  • 缓存技术选型需考虑容量规划和扩展性,分布式缓存易扩展。

  • 其他因素:

  • 缓存节点故障时需避免缓存失效,可采用一致性Hash算法或节点冗余实现高可用。

  • 注意事项:

  • 即便缓存时间较短,也能有效利用缓存的收益,特别是在高并发情况下。

缓存命中率的查看
127.0.0.1:6379> INFO
...
# Keyspace
db0:keys=1000,expires=1000,avg_ttl=86400
db1:keys=2000,expires=2000,avg_ttl=3600
...
keyspace_hits:1000000  总的命中次数
keyspace_misses:50000  总的miss次数
...

在redis中可以运行info命令查看redis服务的状态信息,

其中 keyspace_hits为总的命中次数,keyspace_misses为总的miss次数

命中率 =keyspace_hits/(keyspace_hits+keyspace_misses)。

命中率的优化方式
  • 应用尽可能通过缓存获取数据,避免缓存失效。

  • 需要在业务需求、缓存粒度、缓存策略、技术选型等方面进行权衡。

  • 聚焦于高频访问、时效性要求不高的热点业务。

  • 提高命中率的方法:

  • 缓存预加载(预热)。

  • 增加存储容量。

  • 调整缓存粒度。

  • 更新缓存。

5.4.2 避免阻塞

https://redis.io/docs/management/optimization/latency/

阻塞原因描述定位方法
fork阻塞在RDB和AOF重写时,主线程调用fork操作产生共享内存的子进程,如果fork操作耗时过长,会导致主线程阻塞。执行info stats命令获取latest_fork_usec指标,检查fork操作耗时是否过长。 根据系统内存和硬盘性能优化配置。
AOF刷盘阻塞当开启AOF持久化功能时,后台线程每秒进行一次AOF文件的fsync操作。如果硬盘压力大导致fsync操作等待,主线程会阻塞直到后台线程完成fsync操作。观察Redis日志,查看是否出现"Asynchronous AOF fsync is taking too long"警告。 检查info persistence统计中的aof_delayed_fsync指标。
HugePage写操作阻塞子进程在执行重写期间利用Linux写时复制技术降低内存开销,但如果开启了Transparent HugePages,每次写操作会导致复制内存页单位由4K变为2MB,可能导致写操作耗时过长。观察Redis日志和慢查询日志,检查是否有写操作耗时过长的情况。考虑关闭Transparent HugePages或调整操作系统配置。
CPU竞争进程竞争:当其他进程过度消耗CPU时,影响Redis吞吐量。 绑定CPU:当父子进程绑定在同一个CPU上时,会导致CPU竞争,影响Redis稳定性 [taskset -c <CPU列表> <进程PID]。使用topsar等命令查看CPU消耗情况,排查是否有其他进程消耗过多CPU。 考虑取消对Redis进程的CPU绑定。
内存交换内存交换会导致Redis性能急剧下降,因为Redis保证高性能的前提是所有数据在内存中。使用`cat /proc/[pid]/smaps
网络问题连接拒绝:网络闪断、Redis连接拒绝、连接溢出等原因导致客户端无法连接Redis。 网络延迟:物理拓扑和带宽占用情况导致客户端与Redis之间的通信延迟。网卡软中断:网卡队列只能使用一个CPU,导致无法充分利用多核CPU。观察Redis日志和客户端日志,检查连接拒绝情况。 使用Redis自带的网络延迟测试工具检查延迟情况。使用top命令观察软中断情况。

5.4.3 内存优化

  • Redis实际内存消耗主要包括:键值对象、缓冲区内存、内存碎片。

  • 通过调整maxmemory控制Redis最大可用内存。当内存使用超出时, 根据maxmemory-policy控制内存回收策略。

  • 内存优化的思路包括:

  • 精简键值对大小,键值字面量精简,使用高效二进制序列化工具。 、

  • 数据优先使用整数,比字符串类型更节省空间。

  • 优化字符串使用,避免预分配造成的内存浪费。


当你发现这些内容对你有帮助时,为了支持我的工作,不妨给一个免费的⭐Star,这将是对我最大的鼓励!感谢你的陪伴与支持!一起在技术的路上共同成长吧!点击链接:GitHub | Gitee

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费SSL证书和付费SSL证书的区别和申请

免费SSL证书和付费SSL证书的区别点还是比较多的。对来说免费证书适用的环境会单一一些&#xff0c;一般使用免费证书的环境都是个人门户网站或者是小微企业的门户官网&#xff08;无隐私信息&#xff09;。受免费证书安全等级以及安全性的限制影响&#xff0c;如果是为了自身网…

RISC-V微架构验证

对于RISC-V处理器因其灵活性和可扩展性而受到广泛关注&#xff0c;但如果没有高效验证策略&#xff0c;错误的设计实现可能会影响RISC-V的继续推广。 在RISC-V出现之前&#xff0c;对于大多数半导体公司来说&#xff0c;处理器验证几乎成为一门屠龙之技。专业知识被浓缩到少数几…

C语言基础入门案例(3)

目录 第一题&#xff1a;一维数组的最大值和最小值求解 第二题&#xff1a;求一维数组中的第二大的数 第三题&#xff1a;计算5个整数的平均值 第四题&#xff1a;查找整数在数组中的索引位置 第五题&#xff1a;统计字符串中数字字符的个数 第一题&#xff1a;一维数组的…

vue的就地更新与v-for的key属性

vue的就地更新 Vue中的就地更新到底是怎么回事&#xff0c;为什么会存在就地更新的现象&#xff1f; 注意下面的例子&#xff0c;使用v-for指令时&#xff0c;没有绑定key值&#xff0c;才有就地更新的现象&#xff0c;因为Vue默认按照就地更新的策略来更新v-for渲染的元素列表…

【echarts】使用 ECharts 绘制3D饼图

使用 ECharts 绘制3D饼图 在数据可视化中&#xff0c;饼图是表达数据占比信息的常见方式。ECharts 作为一个强大的数据可视化库&#xff0c;除了标准的二维饼图&#xff0c;也支持更加生动的三维饼图绘制。本文将指导你如何使用 ECharts 来创建一个3D饼图&#xff0c;提升你的…

“手撕“数组一些简单的习题

目录 1.数组转字符串 2.数组拷贝 3.求数组中元素的平均值 4.查找数组中指定元素(顺序查找) 5.查找数组中指定元素(二分查找) 6.数组排序(冒泡排序) 7.数组逆序 1.数组转字符串 先让我们看看为什么要转字符串&#xff1a; int[] arr {1,2,3,4,5,6}; System.out.printl…

性能测试 Jmeter 非 GUI 模式 -CLI 命令详解

我们在使用Jmeter做性能测试的时候&#xff0c;大部分同学用的是图形化界面进行脚本编写和执行性能测试的。但是其实真正在公司执行性能测试的时候&#xff0c;我们基本上不会用图形化界面去执行测试&#xff0c;这是因为工具渲染这些图形本身会让Jmeter结果存在很多不稳定的因…

Midjourney指南 - 生成高分辨率图片(内容已更新至V5)

Midjourney 首先为每个作业生成一个低分辨率图片网格(2x2)。你可以在选择其中任一图片&#xff0c;使用 Midjourney upscaler 来增加尺寸并添加更多细节。有多种可用于放大图像的放大模型。 每个图像网格下方的按钮用于放大所选图像。U1 U2 U3 U4 注&#xff1a;upscaler 以下…

12.MySQL应用架构演变

MySQL应用架构演变 1.总览 单机单库主从架构分库分表云数据库 2.单机单库 介绍 一个简单的小型网站或者应用背后的架构可以非常简单&#xff0c;数据存储只需要一个MySQL Instance就能满足数据读取和写入需求&#xff08;这里忽略掉了数据备份的实例&#xff09;&#xff…

【ElasticSearch】安装(bug篇)

以下解决办法参考自网友们的分享 1. JDK绑定问题 但其实这样也没有问题&#xff0c;因为内嵌的jdk版本与当前的es版本是适配的 但是&#xff0c;如果内嵌的jdk与当前es不适配&#xff0c;那就要修改配置文件 / 添加环境变量&#xff0c;让es启动的时候能扫描到我们本地的jdk …

(十二)C++自制植物大战僵尸游戏多用户存档实现(一)

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs 游戏存档 游戏存档允许玩家保存游戏进度&#xff0c;以便在之后的时间继续游戏。通过存档&#xff0c;玩家可以暂停游戏并在需要时重新开始&#xff0c;而不必从头开始或重新完成已经完成的任务。游戏通常提供多个…

RabbitMQ交换机的类型

交换机类型 可以看到&#xff0c;在订阅模型中&#xff0c;多了一个exchange角色&#xff0c;而且过程略有变化&#xff1a; Publisher&#xff1a;生产者&#xff0c;不再发送消息到队列中&#xff0c;而是发给交换机 Exchange&#xff1a;交换机&#xff0c;一方面&#xff…

基于Spring Boot的校园招聘系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

盲盒商城小程序(有米就出)

一款前端采用uniapp&#xff0c;后端采用Django框架开发的小程序&#xff0c;包含后台管理&#xff0c;如有人需要可联系演示功能&#xff08;个人开发&#xff0c;可商用/学习&#xff09;。 部分截图如下&#xff1a;

RabbitMQ进阶学习

在之前的练习作业中&#xff0c;我们改造了余额支付功能&#xff0c;在支付成功后利用RabbitMQ通知交易服务&#xff0c;更新业务订单状态为已支付。 但是大家思考一下&#xff0c;如果这里MQ通知失败&#xff0c;支付服务中支付流水显示支付成功&#xff0c;而交易服务中的订…

【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机器学习(深度学习)判断网络入侵,网络攻击,流量异常【3】

之前用NSL-KDD数据集做入侵检测的项目是&#xff1a; 【1】https://qq742971636.blog.csdn.net/article/details/137082925 【2】https://qq742971636.blog.csdn.net/article/details/137170933 有人问我是不是可以改代码&#xff0c;我说可以。 训练 我将NSL_KDD_Final_1.i…

企业如何安全合规地访问海外网站

国际专线、SD-WAN线路与VPN翻墙的利弊与风险 在全球化背景下&#xff0c;中国的外贸企业以及海外公司分支机构、科研研发机构等&#xff0c;都需要频繁访问海外网站以开展正常业务。然而&#xff0c;企业访问海外网站的技术方式存在一定的合规风险。本文将概述三种访问海外网站…

解读科技智慧公厕改变生活的革命性创新之路

公共厕所&#xff0c;作为城市基础设施的一部分&#xff0c;一直以来都备受人们诟病。脏乱差、设施老旧、管理混乱&#xff0c;成为公共厕所长期存在的问题。然而&#xff0c;随着科技的不断进步&#xff0c;智慧公厕应运而生&#xff0c;为解决公厕难题&#xff0c;智慧公厕源…

分析ARP解析过程

1、实验环境 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连&#xff0c;如图7.17所示&#xff0c;路由器充当网关。 图7.17 实验案例一示意图 2、需求描述 查看 ARP 相关信息,熟悉在PC 和 Cisco 设备上的常用命令,设置主机A和主机B为同一个网段网关设置为路由接…

word文件的创建时间和修改时间可以更改吗?答案是肯定的 文件属性修改的方法

一&#xff0c;引言 在日常生活和工作中&#xff0c;我们经常需要处理各种Word文件。有时&#xff0c;由于某些原因&#xff0c;我们可能需要更改Word文件的创建时间和修改时间。虽然这听起来可能有些复杂&#xff0c;但实际上&#xff0c;通过一些简单的方法和工具&#xff0…