Redis BigKey

news2024/11/25 18:58:41

Redis BigKey

  • 一 面试题引入
  • 二 MoreKey案例
    • 2.1 大批量往redis里面插入2000W测试数据key
      • 2.1.1 Linux Bash下执行,插入100W
      • 2.1.2 通过redis提供的管道 --pipe命令插入100W大批量数据
    • 2.2 key *
    • 2.3 生产上如何限制keys*/flushdb/flushall等危险命令以防止误删误用?
    • 2.4 不用keys * 不满卡顿,那该用什么?
      • 2.4.1 scan命令
      • 2.4.2 scan命令用于迭代数据库中的数据库键
  • 三 BigKey
    • 3.1 多大算Big
    • 3.2 bigkey的危害
    • 3.3 如何产生
    • 3.4 如何发现
    • 3.5 如何删除
  • 四 BigKey生产调优

一 面试题引入

  • 阿里广告平台,海量数据里查询某一固定前缀的key。
  • 小红书,你如何在生产上限制keys * / flushdb / flushall等危险命令以防止误删误用?
  • 美团:MEMORY USAGE 命令你用过吗?
  • BigKey 问题,多大算big,如何发现,如何删除,如何处理?
  • BigKey 你做过调优吗?惰性释放lazyfree了解过吗?
  • Morekey问题,生产上redis数据库有1000W记录,该如何遍历?key*可以吗?

二 MoreKey案例

2.1 大批量往redis里面插入2000W测试数据key

2.1.1 Linux Bash下执行,插入100W

for((i=1;i<=100*10000;i++)); do echo "set K$i V$i" >> /tmp/redisTest.txt ; done; 

2.1.2 通过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.2 key *

key * 这个指令有致命的弊端,在实际环境中最好不要使用

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

2.3 生产上如何限制keys*/flushdb/flushall等危险命令以防止误删误用?

通过配置设置禁用这些命令,redis.conf在SECURITY这一项中:在这里插入图片描述

2.4 不用keys * 不满卡顿,那该用什么?

2.4.1 scan命令

类似mysql limit ,但不完全相同。
Redis SCAN命令及其相关命令 SSCAN,HSCAN,ZSCAN命令都是用于增量遍历集合中的元素。

  • SCAN:用于迭代当前数据库中的数据库键
  • SSCAN:用于迭代集合键中的元素
  • HSCAN:用于迭代哈希键中的键值对
  • ZSCAN:用于迭代有序集合中的元素(包括元素成员和元素分值)

2.4.2 scan命令用于迭代数据库中的数据库键

redis SCAN 命令基本语法如下:

SCAN cousor [MATCH pattern] [COUNT count]
  • cursor:游标
  • pattern:匹配的模式
  • count:指定从数据集里返回多少元素,默认值是10

在这里插入图片描述

基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历,不保证每次执行都返回某个给定数量的元素,支持模糊查询。一次返回的数量不可控,只能是大概率符合count参数。

  • SCAN命令是一个基于游标的迭代器,每次被调用之后,都会想用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为SCAN命令的游标参数,以此来延续之前的迭代过程。
  • SCAN返回一个包含两个元素的数组
    • 第一个元素:用于进行下一次迭代的新游标
    • 第二个元素:是一个数组,这个数组中包含了所有被迭代的元素。如果新游标返回零表示迭代已结束。

SCAN的遍历顺序:
非常特别,它不是从第一维数组的第零位一直遍历到末尾,而是采用了高位进位加法来遍历,之所以使用这样特殊的方式进行遍历,是考虑到字典的扩容和缩容时避免槽位的遍历重复和遗漏。

三 BigKey

3.1 多大算Big

  • 阿里云Redis开发规范:

拒绝bigkey(防止网卡流量,慢查询)
string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。
非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,而且该操作不会出现在慢查询中(latency可查))。

  • string和二级结构
    • string是value,最大512MB 但是大于10KB就是bigkey。
    • list/hash/set和zset,个数超过5000就是bigkey 在这里插入图片描述

3.2 bigkey的危害

  • 内存不均,集群迁移困难
  • 超时删除,大key删除作梗
  • 网络流量阻塞

3.3 如何产生

  • 社交类:典型案例粉丝逐步递增
  • 汇总统计:某个报表,月日年的积累

3.4 如何发现

  • redis-cli --bigkeys

    • 好处:给出每种数据结构Top 1 bigkey,同时给出每种数据类型的键值个数 + 平均大小
    • 不足:想查询大于10KB的所有key,–bigkeys参数就无能为力了。需要用到memory usage来计算每个键值的字节数
      在这里插入图片描述
      在这里插入图片描述
  • MOMROY USAGE :给出一个key和它的值在RAM中所占用的字节数(计算每个键值的字节数)。

3.5 如何删除

非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除。

  • string:一般用del,如果过于庞大使用unlink

  • hash:使用hscan每次获取少量field-value,再使用hdel删除每个field在这里插入图片描述

  • list:使用ltrim渐进式逐步删除,直到全部删除完成。

    Ltrim对一个列表进行修剪(trim),就是说,让列表只保留指定区域内的元素,不在指定区间之内的元素都将被删除。下标0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
    语法:LTRIM key_NAME START STOP
    在这里插入图片描述

  • set:使用sscan每次获取部分元素,再使用srem命令删除每个元素在这里插入图片描述

  • zset:使用zscan每次获取部分元素,再使用ZREMRANGEBYRANK命令删除每个元素在这里插入图片描述

四 BigKey生产调优

在redis.conf配置文件LAZY FREEING相关说明:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

我们在操作自动化测如何实现用例设计实例

在编写用例之间&#xff0c;笔者再次强调几点编写自动化测试用例的原则&#xff1a; 1、一个脚本是一个完整的场景&#xff0c;从用户登陆操作到用户退出系统关闭浏览器。 2、一个脚本脚本只验证一个功能点&#xff0c;不要试图用户登陆系统后把所有的功能都进行验证再退出系统…

【结构体-位段】

位段 在结构体中&#xff0c;以位为单位的成员&#xff0c;咱们称之为位段(位域)。 struct packed_data{unsigned int a:2;unsigned int b:6;unsigned int c:4;unsigned int d:4;unsigned int i; } data;注意&#xff1a;不能对位段成员取地址。 #include<stdio.h>str…

5.名词复数、动词规则、代词、形容词、副词(不包含不规则)

目录 一、 名词、动词、代词、形容词、副词五种的规则变化。 &#xff08;1&#xff09;名词。 &#xff08;1.1&#xff09;名词复数变化。 &#xff08;1.2&#xff09;名词所有格。 &#xff08;2&#xff09; 动词变化规则。 &#xff08;3&#xff09;代词。 &…

C语言-double和float在内存中的存储方式

本文主要介绍double和float数据类型在C语言中的存储方式 文章目录 double和float存储方式介绍如何存储&#xff1f; double和float存储方式介绍 从存储结构和算法上来讲&#xff0c;double和float是一样的&#xff0c;不一样的地方仅仅是float是32位的&#xff0c;double是64位…

【CAN卡通信的下位机-STM32cubeIDE-hal库+STMF1xx和STMF4xx+数据发送和接收+轮询接收方式+基础样例(1)】

【CAN卡通信的下位机-STM32cubeIDE-hal库数据发送和接收轮询接收方式基础样例1】 1、概述2、实验环境3、自我总结与提升(1)道理学习了一堆&#xff0c;如何使用STM32进行can的收发的话&#xff0c;配置还是挺简单。(2)自己实现了can的收发后&#xff0c;要反过来&#xff0c;补…

shell编程——Here Document免交互与Expect(免交互,高效率)

shell编程——Here Document免交互与Expect&#xff08;免交互&#xff0c;高效率&#xff09; 一、Here Document免交互概述二、Here Document常规用法1、免交互方式实现对行数地统计2、通过read/tee命令接受输入并打印3、通过passwd给用户设置密码4、支持变量替换5、整体赋值…

K8S基础操作之命令篇

目录 第一章.陈述式资源管理 1.1陈述式资源管理方法 1.2.基本命令查看信息 1.3.K8S管理操作分为2大类 1.4.数据网络端口访问流程 第二章.基本信息查看 2.1.命令格式 2.2.命令 2.3.项目的生命周期 第三章.service 3.1.概述 3.2.service 的 type 类型 3.3 headless …

神级指标DMI魔改免费公开!在宽基指数上也可以收获40倍收益,每年都在创新高!

一、写在前头 今天,我们要讲的DMI实际上是一组指标,它由表示多空方向的PDI、MDI以及表示趋势强度的ADX、ADXR共四条线组成。在正式开讲之前,我们先聊几句近期的行情。 上周我们根据量化策略提示了一些板块的机会,其中有一些已经开始有所表现。比如今天涨幅前十的板块中,…

【python笔记】可变对象和不可变对象

前言 在python中&#xff0c;一切事物皆是对象&#xff0c;变量是对象在内存中的存储和地址的抽象。类型也是属于对象的&#xff0c;而不是变量。变量和对象是分离的&#xff0c;对象是内存中储存数据的实体&#xff0c;变量则是指向对象的指针。 “”(赋值号)是将右侧对象的内…

网络编程与netty

目录 NIO 网络编程Buffer&#xff08;缓冲区&#xff09;Channel&#xff08;通道&#xff09;Selector&#xff08;选择器&#xff09;SelectionKey 零拷贝原生NIO存在的问题 线程模型传统阻塞 I/O 服务模型Reactor 模式单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程…

RabbitMQ养成记 (3.MQ的简单工作模式 和 Pub/sub 订阅模式)

上一篇是一个简单的helloworld。 我们直接发直接收 这种是最简单的。 下面我们再来接触更加复杂一点&#xff1a; 简单工作模式 work queues 工作队列模式&#xff1a; 这里注意 这里的消息 对两个消费者 c1 c2来说是竞争关系 而不是等份分发关系&#xff0c; 就像两个线程…

[山海关crypto 训练营 day10]

日常鼓励自己&#xff1a;别抱怨努力的苦&#xff0c;那是你去看世界的路。 最近几天一直忙着项目的结项答辩&#xff0c;今天终于是搞完了&#xff0c;得到了老师们的一致好评&#xff0c;最近几天的努力也没白费&#xff01;现在可以愉快刷题了&#xff0c;先复现下LiteCtf的…

c++核心知识—文件操作

目录 一、文件操作 1、文本文件 2、二进制文件 一、文件操作 文件操作头文件&#xff1a;<fstream> 操作文件的三大流&#xff1a; 1、ofstream&#xff1a;写操作 2、ifstream&#xff1a;读操作 3、fstream&#xff1a;读写操作 1、文本文件 写文件 步骤&…

【数据结构】-学习链表所需要的预备知识

知识点收集于网络&#xff0c;我会加以总结&#xff0c;如果把预备知识学好了。那么后面的操作就不难了 用节或者结都可以&#xff0c;不要在意字的差别 目录 一、头指针与头结点的概念 二、链表带头结点和不带头节点的区别 三、八大链表类型&#xff1a; 四、链表节点为…

unity制作幽灵猎手射击游戏

文章目录 介绍人物向着鼠标点击的位置跑动、旋转lerp函数让摄像机平滑跟随敌人导航敌人攻击发射子弹攻击敌人玩家健康敌人健康分数显示刷怪笼游戏结束动画 介绍 玩家鼠标控制人物转向 玩家鼠标点击控制光线发射的终点 玩家受到伤害屏幕闪红 有三个怪物生成点 玩家射杀敌人获得分…

linux-项目部署软件安装

安装jdk 操作步骤&#xff1a; 1、使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux jdk-8u171-linux-x64.tar.gz 2、解压安装包&#xff0c;命令为tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local 3、配置环境变量&#xff0c;使用vim命令修改/etc/profile文…

【JavaWeb】-- Filter、Listener、Ajax、Vue

文章目录 Filter1.概述2.快速入门2.1 开发步骤2.2 代码演示 3.Filter执行流程4. Filter拦截路径配置5.过滤器链5.1 概述5.2 代码演示5.3 问题 Listener1.概述2. 分类3.代码演示 Ajax1.概述1.1作用1.2 同步和异步 2.快速入门2.1 服务端实现2.2 客户端实现2.3 测试 3.axios3.1 基…

“Shell“Awk命令

文章目录 一.Awk二.Awk按行输出文本三.Awk按字段输出文本四.通过管道&#xff0c;双引号调用shell命令五.总结&#xff1a; 一.Awk Awk的工作原理&#xff1a; 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&a…

康耐视智能相机IS2000与三菱PLC走MC协议通讯设置详细步骤及案例详解

1.IS2000(SLMP扫描界面)设置如下: 控制器类型:PLC型号 IP地址:PLC地址 主机端口:16进制下的PLC通讯端口 2、IS2000设备寻址界面设置如下: 六大控制块存放区域根据PLC设定,偏移量及设备数可更改。3.打开GX WORKS软件,选择新建工程,点击“确定”,界面如下: 4.点击“连…

初识redis【redis的安装使用与卸载】

一.redis的概念 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。在redis官网中对redis的描述是这样的&#…