Redis的BigKey

文章目录

    • 1. 常见面试题
    • 2. MoreKey案例
    • 2. BigKey
    • 2. BigKey生产调优

1. 常见面试题

  • 海量数据里查询某一个固定前缀的key?
  • 你如何生产上限制key * /flushdb /flushall等危险命令以防止误删误用?
  • Memory Usage命令你用过吗?
  • 多大算BigKey?你如何发现?如何删除?如何处理?
  • BigKey你做过调优吗?惰性释放lazyfree你了解过吗?
  • Morekey问题,生产上redis数据库有1000W条记录,你如何遍历?key*可以吗?

2. MoreKey案例

Morekey问题,生产上redis数据库有1000W条记录,你如何遍历?key*可以吗?

  • 大批量往redis中出入测试数据

这里使用linux脚本往redis中出入100万条数据

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

然后使用管道--pipe命令插入100w大批量数据

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

由于我的redis是部署在docker中的,我直接用java程序向redis中写了100万条数据(速度会很慢)。

public class JedisTest {public static void main(String[] args) {//1.或的Connection,通过ip和断开Jedis jedis=new Jedis("127.0.0.1",6379);//2.指定访问redis的密码(我的redis没有设置密码)//jedis.auth("111111");//3.测试连接是否成功System.out.println(jedis.ping());//4.操作redisfor(int i=0;i<100*10000;i++){jedis.set("k"+i,"v"+i);}}
}

100万条数据插入完毕
在这里插入图片描述

下面使用keys *查询一下所有数据
在这里插入图片描述
我们可以发现查询时间达到了恐怖的19s,这就是key *的致命弊端,在实际环境中不要用。由于这个指令没有offset、limit参数,是一次性吐出所有满足条件的key,由于redis是单线程的,其所有操作都是原子的,而keys *算法是遍历算法,复杂度是O(N),如果实例中有千万级以上的key,这个指令就导致redis服务卡顿,所有读写Redis的其它指令都会阻塞,可能会引起缓存雪崩甚至数据库宕机。

生产上如何限制keys * /flushdb /flushall等危险命令使用?

通过配置设置禁用这些命令,redis.conf在SECURITY这一项中

rename-command keys ""
rename-command flushdb ""
rename-command flushall ""

在这里插入图片描述
要想避免使用key*,同时又想遍历数据,此时就可以使用Scan命令。该命令用于迭代数据库中的键,还衍生出了sscan(迭代集合的键),hscan(迭代哈希键)和zscan(迭代有序集合)

scan cursor [match pattern] [Count count]
  • cursor:游标
  • pattern:匹配的模式
  • count:指定从数据集里返回多少元素,默认为10

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

scan返回一个包含两个元素的数组,第一个元素是用于下一次scan操作的新游标位置,第二个元素是一个数组,这个数组中包含了所有被迭代的元素,如果新游标返回0,则说明本次迭代结束
在这里插入图片描述
在这里插入图片描述

scan的遍历顺序非常特别,他不是从第一维度数组的0位一直遍历到末尾,而是采用了高位进位加法来遍历。之所以使用这种特殊的方法遍历,是考虑哈希槽的扩容和缩容时避免槽位的遍历重复和遗漏。解释

2. BigKey

多大算BigKey?你如何发现?如何删除?如何处理?

其实bigkey大的不是key本身,而是它对应的value

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

bigkey会造成下面这些危害:

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

大key产生通常不是人为的,如下面两个案例:

  • 社交类:哥哥粉丝列表逐步递增
  • 报表类:某个报表,月日年经年累月的积累

如何发现大key,有两个命令可以使用,首先是redis-cli --bigkeys然后是Memory usage

#注意如果想查询10kb的所有key,这个命令就没什么用了
redis-cli --bigkeys

在这里插入图片描述

加上-i 0.1s这个参数,scan指令就会每隔100条scan就会休眠0.1s,ops(每s运算次数)就不会剧烈抖动,但是扫描时间会增加

# memory usage key [simples count]
Memory usage

该命令会给出一个key和它的值在RAM中占用的字节数,返回的结果是key的值以及为管理该key分配的内存总字节数。

在这里插入图片描述
如何删除bigkey,参考前面说到的阿里规范,我们使用使用hscan、sscan、zscan方式渐进删除。

  • String类型的bigkey删除:一般使用del,如果过于庞大使用unlink异步删除
  • Hash类型bigkey删除:使用hscan每次获取少量的field-value,再使用hdel删除每个field(一步一步掏空,最后删除)

在这里插入图片描述

  • list类型:使用ltrim渐进式删除,直到全部删除完毕,思路和hash一样

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

2. BigKey生产调优

BigKey你做过调优吗?惰性释放lazyfree你了解过吗?

redis.conf配置文件的LAZY FREEING部分可以对lazyfree进行配置,Redis有两个原语来删除键。一种称为del,是对象的阻塞删除,这意味着服务器停止处理新的命令,以便以同步方式回收与对象关联的所有内存,如果删除的键与一个小对象关联,则执行del命令所需的时间非常短,可与大多数其他命令相媲美。Redis还提供了非阻塞原语,例如UNLINK 以及FLUSHALL和FLUSHDB ASYNC选项,以便在后台回收内存,这些命令在恒定的时间内执行,另一个线程将尽可能快地释放后台中的对象。

lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del yes
replica-lazy-flush nolazyfree-lazy-user-del yes
lazyfree-lazy-user-flush no

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

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

相关文章

双流机场到天府机场ADS-B数据导入MATLAB

MATLAB导入数据 导入的数据Excel部分截图&#xff1a; 一些处理 % 导入外部轨迹数据并转成标准形式 clear;clc; %% 导入&预处理 [NUM,TXT,RAW]xlsread(2021年10月31日CTU-TFU); time_cell RAW(3:end,1); %拉取时间数据&#xff08;cell&#xff09; time_char char(t…

php基础学习之错误处理(其二)

在实际应用中&#xff0c;开发者当然不希望把自己开发的程序的错误暴露给用户&#xff0c;一方面会动摇客户对己方的信心&#xff0c;另一方面容易被攻击者抓住漏洞实施攻击&#xff0c;同时开发者本身需要及时收集错误&#xff0c;因此需要合理的设置错误显示与记录错误日志 一…

最新开源!用C++编写的3D gaussian splatting

大家好&#xff0c;小柠檬给大家推荐一个用C编写的3D gaussian splatting的免费开源实现&#xff0c;专注于可移植、精益和快速。 OpenSplat采用相机姿势稀疏点&#xff0c;并计算一个场景文件&#xff08;.ply&#xff09;&#xff0c;稍后可以导入该文件以在其他软件中查看、…

在VMware中安装CentOS 7并配置Docker

VMware安装CentOS 7 一、介绍 该文章介绍如何使用启动U盘在虚拟机里面安装系统&#xff0c;虚拟机版本为VMware Workstation 16 pro&#xff0c;Linux版本为CentOS Linux release 7.9.2009 (Core)。 二、安装 1、创建虚拟机 点击创建新的虚拟机 选择典型就可以了&#xf…

利用圆锥渐变属性 conic-gradient() 实现仪表盘进度条效果

实现仪表盘初步思路 利用 css 中 圆锥渐变属性 绘制出中心向四周发散的图形。添加遮挡物&#xff0c;与背景色一致&#xff0c;遮盖掉中心内容&#xff0c;达到环形效果。 实现步骤 圆形仪表盘背景 绘制黑色圆形背景 <div class"circle"> </div> &l…

Java进阶-集合(3)与泛型

这次介绍集合中的Iterator迭代器&#xff0c;以及泛型。简单来说&#xff0c;泛型对集合的元素类型进行了限制&#xff0c;使用泛型可以在编译时检查类型安全&#xff0c;提高代码的重用率。内容如下 一、Iterator迭代器 1、概念 Iterator迭代器是一个接口&#xff0c;作用…

基于RISC-V架构的通信DSP的设计以及在5G RedCap基带中的应用(五)-基于RISC-V的RedCap DSP在5G基带中的应用

4 基于RISC-V的RedCap DSP在5G基带中的应用 4.1 基带处理器的关键任务和性能需求 基带处理器是移动通信设备中的关键部件&#xff0c;负责处理无线信号&#xff0c;包括信号的接收、发送和处理。在5G通信系统中&#xff0c;基带处理器的关键任务和性能需求包括以下几个方面&a…

吉瑞苍穹外卖如何拓展?已经经过不同公司多轮面试。项目中会问到哪些问题?以及问题如何解决?

别催了&#xff0c;别催了&#xff0c;先收藏吧。 作者大大正在加班加点完成。 文章会尽快发布&#xff0c;关注收藏&#xff0c;尽请期待。 叠一波甲&#xff1a; 文档也参考了其他作者大大的资料&#xff0c;都会给出相应的标注。 本文档仅供交流学习&#xff0c;不牟利贩…

GEE:基于Landsat5/7/8/9数据提取一个点的NDVI时间序列(1986-2024)

作者:CSDN @ _养乐多_ 本文将介绍,基于Landsat5/7/8/9数据提取一个点的NDVI时间序列,时间序列数据可以是1986-2024年所有可用数据,也可以是月度合成、年度合成或者指定间隔合成的时间序列。 结果如下图所示, 文章目录 一、代码框架二、代码链接三、完整代码一、代码框架…

K8s Pod资源管理组件

目录 Pod基础概念 在Kubrenetes集群中Pod有如下两种使用方式 pause容器使得Pod中的所有容器可以共享两种资源 网络 存储 总结 kubernetes中的pause容器主要为每个容器提供功能 Kubernetes设计这样的Pod概念和特殊组成结构的用意 通常把Pod分为以下几类 自主式Pod 控…

【Unity】如何在Unity 中创建带有缩放效果的滚动视图(具有吸附效果的实现与优化)?

效果预览&#xff1a; 目录 效果预览&#xff1a; 一、引言&#xff1a; 二、问题描述 三、解决方案&#xff1a; 三、优化&#xff1a; 四、结论 一、引言&#xff1a; 在Unity开发中&#xff0c;经常需要实现滚动视图&#xff08;ScrollView&#xff09;中的内容吸附到…

Nginx 常用的基础配置(前端相关方面)

Nginx是一款高性能的Web服务器和反向代理服务器&#xff0c;广泛应用于互联网领域。作为一名前端同学&#xff0c;了解并掌握Nginx的配置是非常有必要的。 安装Nginx sudo apt-get update sudo apt-get install nginx查看Nginx版本 nginx -v启动、停止、重启Nginx服务 sudo …