Redis高级篇之bigKey理论介绍以及优化

news2024/11/6 15:37:39

文章目录

  • 0 前言
  • 1.MoreKey案例
  • 2.BigKey案例
    • 2.1多大算BigKey
    • 2.1.1 string和二级结构
    • 2.2 Bigkey危害、产生与发现
      • 2.2.1 bigkey的危害
      • 2.2.2 如何产生
      • 2.2.3 如何发现
  • 2.2.4 大key如何删除
  • 3.BigKey生产调优
    • 3.1 redis.conf配置文件 LAZY FREEING相关说明
  • 结语

0 前言

  bigKey是面试经常问到的问题,而且在实际工作中也会经常出现big问题亟待解决。所以本文将详细描述bigkey的优化过程,以及系统学习redis big可以优化的详细教程。在大厂面试中经常遇到的面试题,本文总结如下:
  1. 阿里广告平台,海量数据里查询某一个固定前缀的key。
  2.小红书,你如何生产上限制 keys* /flushdb/flushall等危险命令以防止阻塞或误删数据?
  3.美团,memory usage命令你用过吗?
  4.BigKey问题,多大算big?你如何发现?如何删除?如何处理?
  5.BigKey你做过调优吗?惰性释放lazyfree了解过吗?
  6.morekey问题,生产上redis数据库有1000W记录,你如何遍历数据? keys *可以吗?

1.MoreKey案例

  1.大批量往redis里面插入2000W测试数据key。
  Linux Bash下面执行,插入100W数据。​ 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中。

for((i=1;i<=100*10000;i++)); do echo “set ksi v$i” >> /tmp/redisTest.txt ;done;

  ​ 通过redis提供的管道-pipe命令插入100W大批量数据。

	cat /tmp/redisTest.txt | /opt/redis-7.0.0/src/redis-cli -h 127.0.0.1 -p 6379-a 111111 --pipe

  2.某快递巨头真实生产案例新闻
  keys * 这个指令有致命的弊端,在实际环境中最好不要使用。

这个指令没有offset、limit 参数,是要一次性吐出所有满足条件的key,由于redis,是单线程的,其所有操作都是原子的,而keys算法是遍历算法,复杂度是O(n),如果实例中有千万级以上的 key,这个指令就会导致Redis服务卡顿,所有读写Redis 的其它的指令都会被延后甚至会超时报错,可能会引起缓存雪崩甚至数据库宕机。

生产上限制 keys * /flushdb/flushall等危险命令以防止误删误用?通过配置设置禁用这些命令,redis.conf在SECURITY这一项中。
  不用keys *避免卡顿,那该用什么呢?
  ;Scan命令登场

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

2.BigKey案例

2.1多大算BigKey

  通常我们说的BigKey,不是在值的Key很大,而是指的Key对应的value很大。具体可以参考阿里开发手册《阿里云Redis开发规范》。
在这里插入图片描述

2.1.1 string和二级结构

  1.string是value,最大512MB但是≥10KB就是bigkey。
  2.list、hash、set和zset,value个数超过5000就是bigkey。
  list:一个列表最多可以包含2^32-1个元素(4294967295,每个列表超过40亿个元素)。
  hash:Redis中每个hash可以存储2^32-1个键值对(40多亿)。
  set:集合中最大的成员数为2^32-1(4294967295,每个集合可存储40多亿个成员.。

2.2 Bigkey危害、产生与发现

2.2.1 bigkey的危害

  主要有危害有如下三点:
  1.内存不均,集群迁移困难。
  2.超时删除,大key删除作梗。
  3.网络流量阻塞。

2.2.2 如何产生

  • 社交类
    明星粉丝列表,典型案例粉丝逐步递增
  • 汇总统计
    某个报表,日月年

2.2.3 如何发现

  • redis-cli --bigkey
    好处
    见最下面总结 给出每种数据结构Top 1 bigkey。同时给出每种数据类型的键值个数+平均大小
    不足
    想查询大于10kb的所有key,–bigkeys参数就无能为力了,需要用到memory usage来计算每个键值的字节数
    redis-cli --bigkeys -a 111111 redis-cli -h 127.0.0.1 -p 6379 -a 111111 --bigkeys

加上 -i 参数,每隔100 条 scan指令就会休眠0.1s.ops就不会剧烈抬升,但是扫描的时间会变长 redis-cli -h
127.0.0.1 -p 7001 --bigkeys -i 0.1

  • memory usage 键
    英文官网:点击此处
    中文官网:点击此处
    计算每个键值的字节数

2.2.4 大key如何删除

  如何删除big请参考《阿里巴巴开发手册》。具体如下:
在这里插入图片描述
  1.String
  一般用del,如果过于庞大使用unlink key删除。
  2.hash
  使用hscan每次获取少量field-value,再使用hdel删除每个field。

  • 基本命令
HSCAN key cursor [MATCH pattern] [COUNT count]
  • 阿里手册
    在这里插入图片描述
     &#81953.list
  • 使用ltrim渐进式逐步删除,直到全部删除
  • 命令
      Redis Ltrim 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被剧除,下标0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。 你也可以使用负数术标,以-1表示列表的最后一个元素,-2 表示列表的倒数第二个元素,以此类推。
    语法
redis 127.0.0.1:6379> LTRIM KEY NAME START STOF
  • 阿里手册
    在这里插入图片描述
      4.set
      使用sscan每次获取部分元素,在使用srem命令删除每个元素。

  • 命令

  • 在这里插入图片描述

  • 阿里巴巴手册

在这里插入图片描述
  5.zset
  使用zscan每次获取部分元素,在使用zremrangebyrank命令删除每个元素.

  • 命令
    在这里插入图片描述
  • 阿里巴巴手册
    在这里插入图片描述

3.BigKey生产调优

3.1 redis.conf配置文件 LAZY FREEING相关说明

  • 阻塞和非阻塞命令

在这里插入图片描述
在这里插入图片描述

  • 优化配置
    在这里插入图片描述

结语

  Bigkey到此已经告一段落了,这部分对我们在开发中使用到Redis避免Bigkey的出现,以及出现了以后如何进行调优有很大的帮助,与此同时,在日常的面试中,如果遇到优化问题完全可以说你做过Redis调优,而不仅仅是JVM调优。这块也算忙完了!!!

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

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

相关文章

讲讲 kafka 维护消费状态跟踪的方法?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲 kafka 维护消费状态跟踪的方法&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 讲讲 kafka 维护消费状态跟踪的方法&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#x…

UE5.4 PCG Layered Biomes插件

B站学习链接 官方文档 一、PCGSpawn Preset&#xff1a;负责管理PCG要用到的植被资产有哪些 二、BiomesSettings&#xff1a;设置要使用的植被资产Layer、Spawn参数 1.高度Layer参数&#xff1a; 2.地形Layer&#xff1a;我这里用地形样条线绘制了一块地形Layer 绘制点和…

深度了解flink(七) JobManager(1) 组件启动流程分析

前言 JobManager是Flink的核心进程&#xff0c;主要负责Flink集群的启动和初始化&#xff0c;包含多个重要的组件(JboMaster&#xff0c;Dispatcher&#xff0c;WebEndpoint等)&#xff0c;本篇文章会基于源码分析JobManagr的启动流程&#xff0c;对其各个组件进行介绍&#x…

ChatGPT终于变成了智能搜索引擎

一、引言 今天即2024年11月1日&#xff0c;ChatGPT又给我们带来了惊喜。 继前一段时间新增加聊天搜索功能之后&#xff0c;ChatGPT又新增联网功能&#xff0c;可以像搜索引擎一样进行网页搜索&#xff0c;这样一个智能工具摇身一变成AI搜索了&#xff01; 有了AI搜索我们将可…

ZK范式系列之zkVM介绍(1)

1. 引言 zkVM&#xff08;Zero-Knowledge Virtual Machine&#xff0c;零知识虚拟机&#xff09;&#xff1a; 是一种功能强大的虚拟机&#xff0c;利用零知识证明 (zero-knowledge proof&#xff0c;ZKP) 来保证计算的完整性和隐私性。 零知识证明&#xff08;ZKP&#xff…

颠覆微服务管理:用Traefik+Docker轻松实现自动化流量控制

#作者&#xff1a; Power0fMoney 文章目录 第一部分&#xff1a;背景和现状1.1 微服务架构的兴起1.2 容器技术的普及1.3 运维的痛点 第二部分&#xff1a;详细解释Traefik各个功能模块2.1 动态服务发现2.2 内置的Lets Encrypt支持2.3 中间件支持2.4 负载均衡策略2.5 监控和可视…

BSV区块链为供应链管理带来效率革命

​​发表时间&#xff1a;2024年10月10日 供应链管理是众多行业的重中之重&#xff0c;它确保了商品能够从制造商处顺畅地传递到消费者手中。然而&#xff0c;传统的供应链管理面临着许多挑战&#xff0c;包括缺乏透明度、延误、欺诈和协调上的低效率等等。 BSV区块链技术的出…

Xcode 15.4 运行flutter项目,看不到报错信息详情?

Xcode升级后&#xff0c;遇到了奇怪的事情&#xff1a; 运行flutter项目&#xff0c;左侧栏显示有报错信息&#xff0c;但是点击并没有跳转出具体的error详情。【之前都会自己跳转出来的&#xff0c;升级后真的是无厘头】 方案&#xff1a; 点击左侧导航栏最右边的图标——>…

Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)

本示例演示在vue+openlayers中实现轨迹动画,这里设置了小汽车开始,暂停,结束等的控制键,采用了线段步长位置获取坐标来定位点的方式来显示小车的动态。 效果图 专栏名称内容介绍Openlayers基础实战 (72篇)专栏提供73篇文章,为小白群体提供基础知识及示例演示,能解决基…

【深入浅出】深入浅出Bert(附面试题)

本文的目的是为了帮助大家面试Bert&#xff0c;会结合我的面试经历以及看法去讲解Bert&#xff0c;并非完整的技术细致讲解&#xff0c;介意请移步。 深入浅出】深入浅出Bert&#xff08;附面试题&#xff09; 网络结构Pre-TrainingFine-Tuning 输入编码词向量编码句子编码位置…

保存暄桐的这份清福清单 让福气慢慢积累

鸿福易享&#xff0c;清福难得。真正的清福&#xff0c;不是多么好的物质基础&#xff0c;而是来源于内心的平安喜乐。生活于纷繁的现代社会&#xff0c;想获得清净的福德实属不易&#xff0c;于是&#xff0c;便更需要我们为自己创造条件。暄桐送你一份清福清单&#xff0c;当…

Profinet、Ethernet/IP 工业以太网无线通信解决方案

在工业现场&#xff0c;我们常常会面临这样的困扰&#xff1a;两个PLC之间、PLC 跟远程IO之间或者PLC 跟伺服之间由于种种原因不方便布线&#xff0c;严重影响了通讯效率和生产进程。为了解决这一难题&#xff0c;三格电子设计了一款工业以太网无线网桥&#xff0c;这款无线网桥…

【Flask】四、flask连接并操作数据库

目录 前言 一、 安装必要的库 二、配置数据库连接 三、定义模型 四、操作数据库 1.添加用户 2.删除用户 3.更新用户信息 4查询所有用户 五、测试结果 前言 在Flask框架中&#xff0c;数据库的操作是一个核心功能&#xff0c;它允许开发者与后端数据库进行交互&#xf…

NGINX 交叉编译 arm32

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

如何在Linux下安装和配置Docker

文章目录 安装前的准备在Debian/Ubuntu上安装Docker添加Docker仓库安装Docker验证安装 在CentOS/RHEL上安装Docker安装必要的软件包设置Docker仓库安装Docker启动Docker服务 Docker的基本使用拉取一个镜像运行一个容器 配置Docker创建Docker目录使用非root用户运行Docker 结语 …

什么是感知器?

神经网络是松散地基于人脑结构的信号处理工具。它们通常与人工智能 (AI) 相关。我不喜欢“人工智能”这个词&#xff0c;因为它不且简单化。如果将“智能”定义为快速进行数值计算的能力&#xff0c;那么神经网络是人工智能。但在我看来&#xff0c;智能远不止于此——它是设计…

【js逆向学习】某多多anti_content逆向(补环境)

文章目录 声明逆向目标逆向分析逆向过程总结 声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的…

Centos系统新增网卡后获取不到网卡的IP地址解决方法

一、问题描述 当我们给Centos系统添加了新的网卡后,使用查看IP地址命令【ip addr】时,发现新网卡没有获取到对应的IP地址信息,如下图所示: 二、解决方法 有两种解决方法:一种是自动获取IP地址;另外一种是手动配置IP地址; 2.1、自动获取IP地址 #自动获取网卡的IP地址命…

ARB链挖矿DApp系统开发模式定制

在区块链生态中&#xff0c;挖矿作为一种获取加密资产的方式&#xff0c;越来越受到关注。ARB链凭借其高效的性能和灵活的智能合约系统&#xff0c;成为了开发挖矿DApp的理想平台。本文将探讨ARB链挖矿DApp的开发模式定制&#xff0c;包括架构设计、功能实现以及最佳实践。 ARB…

Redis-06 Redis高可用集群架构原理与搭建

前面章节搭建了Redis【主-从】架构和【主-从】 哨兵架构&#xff0c;已可满足部分企业场景应用&#xff0c;但都有其对应的弊端&#xff0c;本章节将讲解更优生产架构&#xff1a;Redis集群架构。不仅包含哨兵架构的自动选举功能&#xff0c;还能降低主从架构下主节点的单节点压…