Redis学习——高级篇②

Redis学习——高级篇②

    • = = = = = = = = = = Redis7高级之BigKey(二) = = = = = = = = = =
        • 1.MoreKey案例
        • 2.BigKey案例
          • 2.1 多大算 BigKey以及它的危害
          • 2.2 如何产生、发现、删除
        • 3. bigKey生产调优

在这里插入图片描述

在这里插入图片描述

= = = = = = = = = = Redis7高级之BigKey(二) = = = = = = = = = =

在这里插入图片描述

1.MoreKey案例

来个小问题 打底:Morekey问题,生产上redis数据库有1000W记录,你如何遍历? key *可以吗?

来启用一下!

matthew@matthew-virtual-machine:~/redis-7.2.4/myredis$ redis-server redis6379.conf
matthew@matthew-virtual-machine:~/redis-7.2.4/myredis$ redis-cli -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> keys *
1) "k3"
2) "zset1"
3) "set1"
4) "list"
5) "hset2"
6) "set2"
7) "hset1"
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> DBSIZE
(integer) 0
  • 往redis里面插入大量测试数据key

    • 生成100W条redis批量设置kv的语句保存在redisTest.txt
for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;
# 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中
matthew@matthew-virtual-machine:~/redis-7.2.4/myredis$ for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;matthew@matthew-virtual-machine:~/redis-7.2.4/myredis$     # 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中
matthew@matthew-virtual-machine:~/redis-7.2.4/myredis$ more /tmp/redisTest.txt
set k1 v1
set k2 v2
set k3 v3
set k4 v4
set k5 v5
...
  • 通过redis管道的--pipe命令插入100W大批量数据
cat /tmp/redisTest.txt | redis-cli -h 127.0.0.1 -p 6379 -a 123456 --pipe

在这里插入图片描述

通过redis-cli登录查看是否成功

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

  • keys * / flushall / flushdb 危险命令

    • keys * / flushall / flushdb 严禁 在线上使用

    • 在这里插入图片描述

    • keys * / flushall / flushdb 会造成阻塞,会导致Redis其他的读写都被延后甚至是超时报错,可能会引起缓存雪崩甚至数据库宕机

    • 在这里插入图片描述

    • 通过配置禁用危险命令

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

scan 命令代替 keys *,避免卡顿
一句话,类似mysql的 limit的但不完全相同

  • 语法

SCAN cursor [MATCH pattern] [COUNT count]

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

  • 特点

    • cursor -游标。
    • pattern -匹配的模式。
    • count -指定从数据集里返回多少元素,默认值为10
    • SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。
    • SCAN 返回一个包含两个元素的数组
      • 第一个元素是用于进行下一次迭代的新游标
      • 第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回零表示迭代已结束。
    • SCAN的遍历顺序,非常特别,它不是从第一维数组的第0位一直遍历到末尾,而是采用了高位进位加法来遍历。之所以使用这样特殊的方式进行遍历,是考虑到字典的扩容和缩容时避免槽位的遍历重复和遗漏。
  • 使用

    在这里插入图片描述

在这里插入图片描述

2.BigKey案例
2.1 多大算 BigKey以及它的危害

参考 《阿里云Redis开发规范》

在这里插入图片描述

  • string 是value,最大512MB但是 >= 10KB 就是bigkey
  • list、hash、set和zset,个数超过5000就是bigkey
  • 在这里插入图片描述

危害

  1. 内存不均,集群迁移困难
  2. 超时删除,大key导致阻塞
  3. 网络流量阻塞
2.2 如何产生、发现、删除

产生

在这里插入图片描述

发现

  • redis-cli --bigkeys

    • redis-cli -h 127.0.0.1 -p 6379 -a 111111 --bigkeys//每隔 100 条 scan 指令就会休眠 0.1s,ops 就不会剧烈抬升,但是扫描的时间会变长redis-cli -h 127.0.0.1 -p 7001-bigkeys -i 0.1
      

      在这里插入图片描述

    • 好处

      • 给出每种数据结构Top 1 bigkey,同时给出每种数据类型的键值个数+平均大小
    • 不足

      • 想查询大于10kb的所有key,--bigkeys参数就无能为力了,需要用到memory usage来计算每个键值的字节数
  • memory usage

    • 计算每个键值的字节数
    • MEMORY USAGE命令给出一个key和它的值在RAM中所占用的字节数。返回的结果是key的值以及为管理该key分配的内存总字节数。对于嵌套数据类型,可以使用选项SAMPLES ,其中count 表示抽样的元素个数,默认值为5。当需要抽样所有元素时,使用SAMPLES 0
      在这里插入图片描述

删除bigkey

  • 参考 《阿里云Redis开发规范》

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

  • 普通命令

    • String

      • 一般用del,过于庞大 unlink
    • hash

      • 使用hscan每次获取少量field-value,再使用hdel删除每个field

      • 语法
        在这里插入图片描述

      • 阿里手册

        在这里插入图片描述
        先用hdel把hash的field降下来,再用del

    • list

      • 使用 ltrim 渐进式逐步删除,直到全部删除

      • 命令
        在这里插入图片描述
        在这里插入图片描述

      • 阿里手册

        在这里插入图片描述

    • set

      • 使用sscan 每次获取部分元素,再使用 srem 命令删除每个元素

      • 命令
        在这里插入图片描述

      • 阿里手册

        在这里插入图片描述

    • zset

      • 使用zscan每次获取部分元素,再使用ZREMRANGEBYRANK 命令删除每个元素

      • 命令

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

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

在这里插入图片描述

3. bigKey生产调优
  • 阻塞和非阻塞删除命令

在这里插入图片描述
Redis有两个原语来删除键。

  • 一种称为 DEL,是对象的阻塞删除
  • 这意味着服务器停止处理新命令,以便以同步方式回收与对象关联的所有内存。如果删除的键与一个小对象相关联, 则执行DEL命令所需的时间非常短,可与大多数其他命令相媲美
  • Redis中的O(1)或O( l o g N log_N logN)命令。但是,如果键与包含数百万个元素的聚合值相关联,则服务器可能会阻塞很长时间(甚至几秒钟)才能完成操作。

以上也是为什么删大key困难的原因

  • Redis 还提供了非阻塞删除原语
  • 例如UNLINK (非阻塞DEL)以及FLUSHALLFLUSHDB命令的ASYNC选项,以便在后台回收内存。这些命令在恒定时间内执行。另一个线程将尽可能快地逐步释放后台中的对象。
  • FLUSHALLFLUSHDBDELUNLINKASYNC选项是用户控制的。这取决于应用程序的设计,以了解何时使用其中一个是个好主意。然而,作为其他操作的副作用,Redis 服务器有时不得不删除键或刷新整个数据库。具体而言,Redis 在以下场景中独立于用户调用删除对象:
    在这里插入图片描述

在上述所有情况下,默认情况是以阻塞的方式删除对象,就像调用DEL一样。但是,您可以使用以下配置指令专门配置每种情况,以便以非阻塞的方式释放内存,就像调用UNLINK一样。

  • 优化配置

    在这里插入图片描述

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

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

相关文章

【高效开发工具系列】Java读取Html

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux系统安装Nginx

一、Nginx的简介 Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;是由伊戈尔赛索耶夫为俄罗斯访问量第二站点开发的&#xff0c;因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。 Nginx是一…

C# RichTextBox常用属性、方法学习1

1 字体 Font font1 new Font("宋体", 18); richTextBox1.Font font1; Font font2 new Font("宋体", 10, FontStyle.Underline); richTextBox1.SelectionFont font2; 定义字体&#xff0c;可以带2个参数&#…

LeetCode---122双周赛

题目列表 3010. 将数组分成最小总代价的子数组 I 3011. 判断一个数组是否可以变为有序 3012. 通过操作使数组长度最小 3013. 将数组分成最小总代价的子数组 II 一、将数组分成最小总代价的子数组I 这道题纯纯阅读理解题&#xff0c;关键在于理解题意。注意&#xff1a;第一…

总体方差与样本方差的区别是什么?

总体方差和样本方差是统计学中两个重要概念&#xff0c;它们在定义和计算上有所不同&#xff0c;主要区别体现在数据集的性质和计算公式的分母上&#xff1a; 1. 总体方差&#xff08;Population Variance&#xff09;&#xff1a; 定义&#xff1a; 总体方差是指将一个完整数…

嵌入式——窗口看门狗(WWDG)补充

目录 一、独立看门狗与窗口看门狗 1.功能描述 2.两者区别 二、WWDG功能描述 1.窗口看门狗时钟 2.计数器时钟 3. 计数器 4.窗口值 三、WWDG超时时间 一、独立看门狗与窗口看门狗 1.功能描述 STM32有两个看门狗&#xff1a;一个是独立看门狗&#xff08;IWDG&#xff0…

在知乎上如何写科技文章?

当在知乎上撰写关于科技趋势的文章时&#xff0c;有几个关键的写作技巧和建议可以帮助你获得更好的传播效果&#xff1a; 选题关注热点&#xff1a; 在选择科技趋势时&#xff0c;关注当前的热点话题是很重要的。了解最新的技术、行业动向&#xff0c;选择用户普遍关心和讨论的…

数据结构三:线性表之单链表(带头结点单向)的设计与实现

线性表的链式存储结构正是所谓的单链表&#xff0c;何谓单链表&#xff1f;通过地址将每一个数据元素串起来&#xff0c;进行使用&#xff0c;这可以弥补顺序表在进行任意位置的插入和删除需要进行大量的数据元素移动的缺点&#xff0c;只需要修改指针的指向即可&#xff1b;单…

网络编程套接字(2)

UDP数据报套接字编程 API介绍 DatagramSocket DatagramSocket是UDP的Socket,用于发送和接收数据报. 操作系统中有一类文件,就叫做socket文件(普通文件/目录文件:在硬盘上的) socket文件:抽象的表示了网卡这样的硬件设备 DatagramSocket就是对socket文件进行读写,也就是借助网…

对于gzip的了解

gzip基本操作原理&#xff1a;通过消除文件中的冗余信息&#xff0c;使用哈夫曼编码等算法&#xff0c;将文件体积压缩到最小。这种数据压缩方式在网络传输中发挥了巨大作用&#xff0c;减小了传输数据的大小&#xff0c;从而提高了网页加载速度。 静态资源 Vue Vue CLl修改v…

WordPress如何使用SQL实现一键关闭/开启评论功能(已有评论)

WordPress本人就自带评论功能&#xff0c;不过由于种种原因&#xff0c;有些站长不想开启评论功能&#xff0c;那么应该怎么实现一键关闭评论功能或开启评论功能呢&#xff1f;或者针对已有评论功能的文章进行一键关闭或开启评论功能应该怎么操作&#xff1f; 如果你使用的Wor…

【.NET Core】深入理解C#中的特殊字符

【.NET Core】深入理解C#中的特殊字符 文章目录 【.NET Core】深入理解C#中的特殊字符一、概述二、$-- 字符串内插2.1 内插字符串的结构2.2 内插原始字符串字面量2.3 特殊字符2.4 内插字符串编译 三、-- 逐字字符串标识符四、“”“--原始字符串文本 一、概述 特殊字符是预定义…

【网易】资深Java开发工程师/专家(采购系统方向)

全职 | 杭州市 | 2024-01-26 更新 职位描述 负责企业信息化采购系统研发。重点关注系统并发性能、可靠性等方面&#xff0c;解决系统技术难点&#xff0c;参与架构持续升级。关注互联网和企业信息化热点技术的发展方向&#xff0c;能够提出、评估并应用新技术。参与系统需求分…

OpenGL/C++_学习笔记(四)空间概念与摄像头

汇总页 上一篇: OpenGL/C_学习笔记&#xff08;三&#xff09; 绘制第一个图形 OpenGL/C_学习笔记&#xff08;四&#xff09;空间概念与摄像头 空间概念与摄像头前置科技树: 线性代数空间概念流程简述各空间相关概念详述 空间概念与摄像头 前置科技树: 线性代数 矩阵/向量定…

嵌入式产品的开发流程

嵌入式产品的开发流程主要涉及硬件和软件两个方面&#xff0c;通常包括以下主要阶段和角色&#xff1a; 嵌入式产品开发流程 1. 需求分析阶段&#xff1a; 角色&#xff1a; 产品经理、系统工程师 任务&#xff1a; 确定产品的功能和性能需求&#xff0c;明确硬件和软件的基…

RPC教程 5.支持HTTP协议

1.HTTP的CONNECT方法 Web 开发中&#xff0c;我们经常使用 HTTP 协议中的 HEAD、GET、POST 等方式发送请求&#xff0c;等待响应。但 RPC 的消息格式与标准的 HTTP 协议并不兼容&#xff0c;在这种情况下&#xff0c;就需要一个协议的转换过程。HTTP 协议的 CONNECT 方法提供了…

在Java中,IO主要分为两种:同步阻塞IO(BIO)和NIO(New IO,也称为Non-blocking IO)。

IO&#xff08;Input/Output&#xff09;是指输入和输出&#xff0c;是程序与外部世界或者程序与程序之间进行数据交换的一种方式。在Java中&#xff0c;IO主要分为两种&#xff1a;同步阻塞IO&#xff08;BIO&#xff09;和NIO&#xff08;New IO&#xff0c;也称为Non-blocki…

51单片机-4G模块

51单片机-4G模块 4G控制LED #include "reg52.h" #include "intrins.h" #include <string.h>#define SIZE 12 sfr AUXR 0x8E; sbit D5 P3^7; char cmd[SIZE];void UartInit(void) //9600bps11.0592MHz {AUXR 0x01;SCON 0x50; //配置串口工作方…

MybatisPlus二级映射和关联对象ResultMap

文章目录 一、业务背景1. 数据库表结构2. 需求 二、使用映射直接得到指定结构三、其他文件1. Mapper2. Service3. Controller 四、概念理解一级映射二级映射聚合 五、标签使用1. \<collection\> 标签2. \<association\> 标签 在我们的教程中&#xff0c;我们设计了…

flask框架制作前端网页作为GUI

一、语法和原理 &#xff08;一&#xff09;、文件目录结构 需要注意的问题&#xff1a;启动文件命名必须是app.py。 一个典型的Flask应用通常包含以下几个基本文件和文件夹&#xff1a; app.py&#xff1a;应用的入口文件&#xff0c;包含了应用的初始化和配置。 requirem…