Redis中BigKey的分析与优化

Redis中BigKey的分析与优化

Redis以其出色的性能和易用性,在互联网技术栈中占据了重要的地位。
但是,高效的工具使用不当也会成为性能瓶颈。在Redis中,BigKey是常见的性能杀手之一,它们会消耗过多的内存,导致网络拥塞,
甚至引起Redis服务的延迟。因此,合理地处理和预防BigKey的生成,是每个使用Redis的开发者都应该掌握的技能。

&nbsp

BigKey的定义与识别

1、 BigKey的定义
Redis中的BigKey通常指的是那些包含大量元素的复合数据类型,如一个列表包含数百万个元素,或一个字符串的大小超过512MB。
这些BigKey会在执行操作时消耗大量的CPU和内存资源,影响Redis的响应时间。

2、 BigKey的识别方法
手动识别BigKey可以使用如下Redis命令:

redis-cli --bigkeys

自动化识别可以使用脚本来周期性地检测,如下Python脚本示例:

import redis# 连接到Redis服务器
r = redis.StrictRedis(host='localhost', port=6379, decode_responses=True)def find_big_keys(redis_conn, threshold):cursor = '0'big_keys = []while cursor != 0:cursor, keys = redis_conn.scan(cursor=cursor, count=1000)  # 分批迭代keysfor key in keys:size = redis_conn.memory_usage(key)if size > threshold:big_keys.append((key, size))return big_keys# 打印出所有大于1MB的key
for key, size in find_big_keys(r, 1024 * 1024):print(f"BigKey: {key}, Size: {size}")# 还可以使用异步任务,将得到的key放到指定的地方进行存储,方便后面分析处理

这里使用SCAN命令而非KEYS命令,因为SCAN命令是基于游标的迭代器,可以分批次迭代keys,减少对内存的冲击。

这个脚本分批迭代所有的keys,并且仅在发现超过指定大小的key时才会将其信息打印出来或者进行其他操作。
通过设置count参数,你可以根据你的Redis服务器的具体情况来调整每批次处理的keys数量,以达到在不影响Redis性能的前提下完成BigKeys的检测。此外,这个脚本应该在Redis的负载较低时运行,以最小化其对生产环境的影响。

BigKey的产生原因

1、 不合理的数据设计
一个典型的例子是将用户的所有行为数据存放在一个大的List中,而不是分拆成多个小List按时间或者事件类型存储。

2、 业务逻辑变化
随着业务发展,原本预计不会存储大量数据的Key,可能因为用户量的增长或业务逻辑的变化变成了BigKey。

3、 缺失的监控预警
没有及时地监控和预警系统的话,一旦数据量异常增长,就可能产生BigKey,而未能及时发现。

BigKey带来了什么样的问题

1、 性能问题
由于Redis的单线程模型,BigKey的操作可能会阻塞其他命令的执行,造成明显的延迟。

2、 资源消耗
BigKey占用大量内存,可能会导致内存溢出或者其他数据的驱逐。

3、 数据管理问题
BigKey会给数据迁移工作带来挑战,特别是在使用Redis集群时。

BigKey的处理方案

1、 切割大key
可以将一个大的Hash表切割成多个小Hash表,每个Hash表存储一部分数据。

2、 删除或过期
可以对BigKey进行渐进式删除,避免一次性删除造成服务的长时间阻塞。

redis-cli --eval del_big_key.lua , bigkey_name

3、 使用合适的命令
使用Scan系列命令进行数据处理,避免一次性操作大量数据。

redis-cli scan 0 match * count 1000
如何有效避免BigKey产生的策略

1、 合理的数据模型设计
根据业务需求选择合理的数据类型,例如使用小Hash代替大String。
Redis为Hash类型的字段使用了特殊的编码方式,如ziplist或hashtable,这些编码方式可以在保持较小内存占用的同时存储相对较小的值。
当Hash中的元素数量和单个元素的大小达到一定阈值时,Redis会自动从ziplist转换为hashtable,这种优化能够有效利用内存。

 

2、 强化监控预警机制
利用Redis自带的监控工具或第三方监控工具,如 Prometheus + Grafana,及时发现异常。

 

3、 定期的性能评估与优化
定期进行性能评估,及时对数据模型进行调整。

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记和面经,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的阿里大佬写的刷题笔记,让我offer拿到手软

总结

BigKey问题在Redis的使用中是一个不能忽视的问题。通过合理的数据模型设计,强化监控预警机制,以及定期的性能评估,
可以有效地避免BigKey的产生,保持Redis的高性能。我们需要不断地学习和应对新的技术挑战,提升系统的稳定性和可用性。

推荐几个学习 Redis 教程文章

  • 01、Redis 基础教程
  • 02、Redis6.0 系列教程
  • 03、Redis 实战教程

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑说编程

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

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

相关文章

【每日一题】最大交换

文章目录 Tag题目来源解题思路方法一:暴力法方法二:贪心 写在最后 Tag 【暴力法】【贪心法】【数组】【2024-01-22】 题目来源 670. 最大交换 解题思路 本题的数据规模比较小,暴力法也可以通过。以下将会介绍暴力法和本题最优法。 方法一…

14027.ptp 控制流

文章目录 1 ptp 控制流1.1 控制流分层 1 ptp 控制流 1.1 控制流分层 大体分为4层:1 ptp4l层: 获取配置文件、创建时钟、poll监控文件描述符。2 clock时钟层:提供提供clock_poll、clock_create、clock_sync 等3 port 端口层:port…

后端MySQL常用命令

不是专业后端的,所有可能有些不太准确,都是自己平时在项目当中总结的,谢谢ฅฅ* 添加/insert 给指定字段添加数据 INSERT INTO 表名 字段名 VALUES 值 INSERT INTO ninth_student (id,name,sex,age,weight,birth) VALUES (0,亚亚,女,18,4…

为什么重写hashcode要一起重写equals方法

为什要重写hashcode? hashcode方法得到一个hash值其实是要起到一个比较作用,比较两个未知的东西是不是同一个东西,因为我们要求hashcode方法产生的hash值对于”同一个东西“得到的hash值是一样的。 那这种特性可以做到去重的效果&#xff0…

HBase学习五:运维排障之复制

官方文档-HBase复制,包含相关命令信息 0 名词解释 在HBase中,HLog(也称为WAL)用于记录所有对HBase表的修改操作,以便在系统故障时可以恢复数据。 Entry的含义 Entry在HLog上下文中通常指的是WAL中的一个记录项。每个Entry包含了一次或多次对HBase表的修改操作的信息,这…

通过 GScan 工具自动排查后门

一、简介 GScan 是一款为安全应急响应提供便利的工具,自动化监测系统中常见位置。 工具运行环境:CentOS (6、7) python (2.x、3.x) 工具检查项目: 1、主机信息获取 2、系统初始化 alias 检查 3、文件类安全扫描 3.1、系统重要文件完整行…

Express.js 中动态路由解码:path-to-regexp介绍

1. path-to-regexp:将路径转化为模式 path-to-regexp 是一个 Node.js 工具,用于将路径字符串转换为正则表达式。它在像 Express.js 这样的网络框架中广泛用于处理动态路由。 主要功能及代码示例: 将路径转换为正则表达式: 它将带…

linux shell脚本 条件语句

test 测试文本的表达式 是否成立 格式: test 条件表达式 格式: [ 条件表达式 ] ([] 内要空格 ,不然不生效) 如何测试? [ 操作符 文件或目录 ] echo $? 返回值是0 正确,返回值非0 …

Unity——FSM有限状态机

有限状态机就是有限个切换状态的条件,要制作有限状态机,有几个必要点:状态抽象类、FSMSystem类、FSMSystem实现类、FSM状态实现类。 每一个控制者都有一个状态机,每一个状态机都有其包含的状态,每一个状态都有能转换的…

运维之道—生产环境安装mysql

目录 1.前言 2.部署安装 2.1 下载mysql5.7版本的yum仓库 2.2 安装yum仓库 2.3 安装mysql-server 2.4 启动mysql-server 3. 生产配置 3.1 登录mysql 3.2 修改root账户密码 3.3 配置mysql

JFinal项目搭建

JFinal项目搭建 JFinal项目搭建 JFinal项目搭建 首先创建maven项目&#xff1a; 删掉报错的jsp页面&#xff1a; 在pom.xml中加入坐标&#xff1a; <dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal-undertow</artifactId>…

零基础学习【Mybatis Plus】这一篇就够了

学习目录 1. 快速入门1-1. 常用注解总结 1-2. 常用配置 2. 核心功能3. 扩展功能4. 插件功能 1. 快速入门 1-1. 常用注解 MybatisPlus中比较常用的几个注解如下&#xff1a; TableName: 用来指定表名Tableld: 用来指定表中的主键字段信息TableField: 用来指定表中的普通字段信…

基于openssl v3搭建ssl安全加固的c++ tcpserver

1 概述 tcp server和tcp client同时使用openssl库&#xff0c;可对通信双方流通的字节序列进行加解密&#xff0c;保障通信的安全。本文以c编写的tcp server和tcp client为例子&#xff0c;openssl的版本为v3。 2 安装openssl v3 2.1 安装 perl-IPC-Cmd openssl项目中的co…

AR 自回归模型

文章目录 总的代码ADF 检验(是否平稳)差分操作拟合AR 模型预测可视化总的代码 import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.ar_model import AutoReg from statsmodels.tsa.stattools import adfuller# 生成一个示例时间序…

在人工智能时代,如何利用AI达到行业领先地位?

人工智能很快将成为企业开展业务的一个必要环节。各企业都会具备AI战略&#xff0c;就像其具有社交媒体战略、品牌战略和人才战略等一样。 因此&#xff0c;如果企业希望在竞争中脱颖而出、获得优势&#xff0c;不能只是使用AI&#xff0c;而是要以AI为先导&#xff0c;创造行业…

pyqtgraph 设置线程阻塞

pyqtgraph 设置线程阻塞 如果想要在 PyQtGraph 应用程序中设置线程阻塞以模拟一个耗时长的任务&#xff0c;可以使用 time.sleep 或者其他会阻塞线程的操作。以下是一个简单的示例&#xff1a; import pyqtgraph as pg from PyQt5.QtCore import Qt, QThread, pyqtSignal imp…

基于springboot+vue的海滨体育馆管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

邮件服务支持Exchange协议,资产历史账号支持设置保留数量,JumpServer堡垒机v3.10.2 LTS版本发布

2024年1月22日&#xff0c;JumpServer开源堡垒机正式发布v3.10.2 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和维护&#xff0c;并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS版本&#xff0c;以获得更佳的使用体验。 在v3.10.2 LTS版本中&…

美赛world排版技巧

正在跳转 1、问&#xff1a;Word里边怎样设置每页不同的页眉&#xff1f;如何使不同的章节显示的页眉不同&#xff1f; 答&#xff1a;分节&#xff0c;每节可以设置不同的页眉。文件——页面设置——版式——页眉和页脚——首页不同 2、问&#xff1a;请问Word中怎样让每一…

04 经典的OSPF

思维导图的方式回顾OSPF 什么是OSPF?为什么需要OSPF? - 华为 (huawei.com) 1 ospf 领行学习思维导图 1.1 ospf 的工作过程 建立领据表同步数据库计算路由表1.2 ospf 的状态