实战:Redis高负载排查记录

简介: 实战:Redis高负载排查记录

背景

随着互联网业务的发展,面对逐渐增长的数据量和并发访问量,我们常常需要使用Redis等内存数据库来解决高并发请求问题。然而,在某些情况下,我们可能会遭遇Redis高负载的问题,这时就需要进行相应的排查和解决。

本文将介绍一个真实场景下的Redis高负载排查记录,希望对大家解决Redis高负载问题提供一些参考。

场景描述

我们所在的公司是一家互联网金融公司,业务量较大。为了应对高并发访问需求,我们使用了Redis来缓存热点数据。最近,我们发现Redis的负载持续较高,尤其是在业务高峰期,服务甚至出现了不可用的情况。于是,我们开展了一次排查。

排查过程

第一步:查看CPU使用率和QPS

我们首先登录Redis服务器,使用top命令查看CPU使用率和QPS(每秒查询数)。结果如下:

top - 16:14:45 up 5 days, 23:58,  2 users,  load average: 7.81, 8.15, 7.94
Tasks: 812 total,   2 running, 810 sleeping,   0 stopped,   0 zombie
Cpu(s): 67.4%us, 32.5%sy,  0.0%ni,  0.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  12333188k total, 10711452k used,  1621736k free,   232672k buffers
Swap:  4194300k total,     8352k used,  4185948k free,  5014384k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
17696 redis     20   0 12.9g 8.6g  6376 S 313.9 73.7   5402:01 redis-server
  216 root      20   0     0    0    0 S  1.6  0.0   2:08.58 kswapd0

可以看到,Redis的CPU使用率非常高,甚至达到了313.9%。

同时,我们在Redis服务器上运行redis-benchmark命令来查看QPS,结果为22000+:

redis-benchmark -t get -n 1000000
====== GET ======
  1000000 requests completed in 46.06 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

91.81% <= 1 milliseconds
99.87% <= 2 milliseconds
99.97% <= 3 milliseconds
99.98% <= 4 milliseconds
99.98% <= 5 milliseconds
99.98% <= 6 milliseconds
99.98% <= 7 milliseconds
99.98% <= 8 milliseconds
99.98% <= 9 milliseconds
100.00% <= 10 milliseconds
21696.22 requests per second

从这个结果来看,Redis的QPS较高。这两个指标都表明了Redis存在高负载的问题。

第二步:查看slowlog

在排查Redis高负载问题时,我们还可以通过查看slowlog(慢查询日志)来找到Redis主要耗时操作。我们可以使用redis-cli工具,输入“slowlog len”命令,来查看slowlog的长度。然后,再使用“slowlog get ”命令,来获取slowlog中的操作记录。

127.0.0.1:6379> slowlog len
(integer) 421
127.0.0.1:6379> slowlog get 1
1) 1) (integer) 327837
   2) (integer) 1656470561
   3) (integer) 60319
   4) 1) "get"
      2) "xxxxx"
   5) (integer) 50
   6) 1) (integer) 1656470511
       2) "+0.000053727"

可以看到,slowlog长度为421。我们获取到slowlog中排名第一的操作记录,发现其使用了get命令,访问的key为“xxxxx”,并且耗时达到了50ms。

通过查看slowlog,我们可以了解到Redis耗时操作的详细信息,有助于快速定位问题。

第三步:查看内存使用情况

因为Redis是一种基于内存的数据库,所以我们还需要查看Redis的内存使用情况。可以使用redis-cli工具,输入“info memory”命令来查看内存使用信息。

127.0.0.1:6379> info memory
# Memory
used_memory:10778795232
used_memory_human:10.04G
used_memory_rss:10768829440
used_memory_rss_human:10.03G
used_memory_peak:10786089248
used_memory_peak_human:10.05G
used_memory_peak_perc:99.93%
used_memory_overhead:10777653400
used_memory_startup:791660
used_memory_dataset:11341832

可以看到,Redis的内存使用非常高,已经占用了10.04G的内存空间。这也是Redis出现高负载的重要原因之一。

第四步:查看Redis配置和性能参数

在排查Redis高负载问题时,我们还需要查看Redis的配置和性能参数,以确定是否存在不合理的设置。可以使用redis-cli工具,输入“config get ”命令来获取相应的配置信息。

127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"

在这个示例中,我们获取到了Redis的maxmemory配置项,其值为0,表示Redis没有设置最大内存限制。这也是导致Redis高负载的一个原因。

第五步:查看客户端请求情况

除了上述排查方法,我们还可以通过查看客户端请求情况,了解Redis的负载情况。可以使用redis-cli工具,输入“client list”命令来查看连接到当前Redis实例的客户端信息。

127.0.0.1:6379> client list
id=1 addr=127.0.0.1:55572 fd=4 name= age=109 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=ping
id=2 addr=127.0.0.1:55574 fd=5 name= age=108 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=ping
id=3 addr=127.0.0.1:55576 fd=6 name= age=107 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=ping

通过查看客户端列表信息,我们可以知道有多少个客户端连接到了该Redis实例,以及每个客户端的状态信息。

解决方案

在排查Redis高负载问题后,我们需要采取一些解决方案来解决这个问题。以下是一些可能的解决方案:

方案一:增加Redis实例

由于Redis是一种基于内存的数据库,因此我们可以通过增加Redis实例的方式,来缓解Redis高负载问题。通常情况下,我们可以使用Redis集群或者主从复制等技术,来实现Redis数据的分片和负载均衡。

方案二:设置最大内存限制

为了避免Redis占用过多的内存资源,我们可以设置Redis的最大内存限制。一旦Redis的内存使用超过了限制,就会自动清理掉一些不再使用的数据。

方案三:优化Redis性能参数

我们还可以通过修改Redis的性能参数,来提高Redis的性能和吞吐量。例如,我们可以调整Redis的最大客户端数量、缓存失效时间、持久化策略等参数。

总结

本文介绍了一个真实场景下的Redis高负载排查记录,从CPU使用率、QPS、slowlog、内存使用情况、配置和性能参数、客户端请求情况等多个方面来查找Redis高负载问题。最后,我们也给出了一些可能的解决方案,以供大家参考。

在实际工作中,排查和解决Redis高负载问题是一项非常重要的任务。只有深入理解Redis的架构和原理,才能更好地应对这些问题,提高业务系统的性能和可靠性。

目录
相关文章
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
2130 0
分布式爬虫框架Scrapy-Redis实战指南
|
存储 NoSQL 前端开发
Redis专题-实战篇一-基于Session和Redis实现登录业务
本项目基于SpringBoot实现黑马点评系统,涵盖Session与Redis两种登录方案。通过验证码登录、用户信息存储、拦截器校验等流程,解决集群环境下Session不共享问题,采用Redis替代Session实现数据共享与自动续期,提升系统可扩展性与安全性。
683 3
Redis专题-实战篇一-基于Session和Redis实现登录业务
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
491 1
Redis专题-实战篇二-商户查询缓存
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
791 42
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
1737 79
|
机器学习/深度学习 存储 NoSQL
基于 Flink + Redis 的实时特征工程实战:电商场景动态分桶计数实现
本文介绍了基于 Flink 与 Redis 构建的电商场景下实时特征工程解决方案,重点实现动态分桶计数等复杂特征计算。通过流处理引擎 Flink 实时加工用户行为数据,结合 Redis 高性能存储,满足推荐系统毫秒级特征更新需求。技术架构涵盖状态管理、窗口计算、Redis 数据模型设计及特征服务集成,有效提升模型预测效果与系统吞吐能力。
1518 10
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
3918 7
|
存储 缓存 NoSQL
Redis实战之入门进阶到精通
Redis 是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis 提供了 5 种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis 的数据结构致力于帮助用户解决问题,而不会像其他数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化(persistence)和客户端分片(client-side sharding)等特性,用户可以很方便地将 Redis 扩展成一个能够包含数百 GB 数据、每秒处理上百万次请求的系统。
Redis实战之入门进阶到精通
|
存储 NoSQL Java
当Java遇到Redis:Jedis实战入门
Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序。本文将概要介绍Redis的特性和语法,并以实例代码的形式介绍如何通过Jedis在java语言环境下控制Redis,帮助各位读者快速入门。
2113 0