面试题

海量数据里查询某一固定前缀的key

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

MEMORY USAGE 命令用过吗?

BigKey问题,多大算big?如何发现?如何删除?如何处理?

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

MoreKey问题,生产上Redis数据库有1000万条记录,如何遍历?

MoreKey案例

大批量往Redis中插入100万条测试数据

# 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中
for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;

试试keys * 遍历查询花费多少秒?试试就逝世,足足花费了二十几秒!

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

通过redis.conf配置文件设置禁用

不用keys * 应该用什么?SCAN

详情见官方文档:Redis SCAN 命令 递增地遍历key空间

SCAN cursor [MATCH pattern] [COUNT count]
  • cursor - 游标。

  • pattern - 匹配的模式。

  • count - 指定从数据集里返回多少元素,默认值为 10 。

什么是 Redis 增量遍历?SCAN 命令是一个基于游标的遍历器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次遍历时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的遍历过程。

SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次遍历的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被遍历的元素。当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的遍历,而当服务器向用户返回值为 0 的游标时, 表示遍历已结束。

SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

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

虽然 SCAN 命令不保证每次遍历所返回的元素数量, 但我们可以使用 COUNT 选项, 对命令的行为进行一定程度上的调整。 COUNT 选项的作用就是让用户告知遍历命令, 在每次遍历中应该从数据集里返回多少元素。虽然这个选项只是对增量式遍历命令的一种提示, 但是在大多数情况下, 这种提示都是有效的。

SCAN 返回一个包含两个元素的数组:

第一个元素是用于进行下一次迭代的新游标, 第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回零表示迭代已结束。

SCAN的遍历顺序

BigKey案例

多大算big

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

string和二级结构

string是value,最大512MB,但是 ≥ 10KB 就是BigKey

list、hash、set、zset,个数超过5000就是BigKey(by the way,它们都可以存储超过40亿个元素)

危害

  1. 内存不均,集群迁移困难

  2. 大key导致超时删除

  3. 网络流量阻塞

如何产生

社交类:王心凌粉丝列表,典型案例粉丝逐步递增

汇总统计:某个报表,年月日经年累月的积累

如何发现

redis-cli --bigkeys

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

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

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

MEMORY USAGE key MEMORY USAGE key [SAMPLES count]

详情见官网:Redis MEMORY USAGE 命令 估计key的内存使用情况

MEMORY USAGE 命令给出一个 key 和它的值在 RAM 中所占用的字节数。

返回的结果是 key 的值以及为管理该 key 分配的内存总字节数。

对于嵌套数据类型,可以使用选项 SAMPLES,其中 count 表示抽样的元素个数,默认值为 5 。当需要抽样所有元素时,使用 SAMPLES 0

如何删除

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

String

一般用del,过于庞大用unlink;

hash

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

命令:

阿里手册:

list

命令

阿里手册:

set

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

命令

阿里手册

zset

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

命令

阿里手册

BigKey生产调优

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

阻塞和非阻塞删除命令

优化配置

 

【Redis】BigKey问题的更多相关文章

  1. 如何快速排查发现redis的bigkey?4种方案一次性给到你!

    本篇文章将以redis的bigkey为主题进行技术展开,通过从认识redis的高性能,bigkey的危害.存在原因.4种解决方案,到模拟实战演练的介绍方式,来跟大家一起认识.探讨和学习redis. 先 ...

  2. Redis监控调研

    1 调研目的 主要的目的是想调研各大云平台有关Redis监控功能的实现,但是最后我发现各大云平台提供的监控功能都比较基础,比如我想看诸如访问频率较高的HotKey.占用内存较大的Bigkey等指标,它 ...

  3. 1.5万字总结 Redis 常见面试题&知识点

    以下内容来源于于我开源的 JavaGuide (Java学习&&面试指南,Github 130k star,370人共同参与爱完善), 万字总结,质量有保障! 这篇文章最早写于2019 ...

  4. redis的bigkey扫描脚本

    众所周知,redis里面的大key存在是非常危险的一件事情.因为最近的工作转移到中间件相关的工作,因此关注了一下bigkey的扫描方法.首先介绍一下阿里云提供的扫描脚本: 具体可见:https://y ...

  5. Redis(十二)flush误操作、Redis安全、处理bigkey和寻找热点key

    一.flushall/flushdb误操作的处理 假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000. 1.缓存与存储 被误操作flush后,根 ...

  6. Redis获得bigkey扫描脚本

    众所周知,redis里面的大key存在是非常危险的一件事情.因为最近的工作转移到中间件相关的工作,因此关注了一下bigkey的扫描方法.首先介绍一下阿里云提供的扫描脚本:具体可见:https://yq ...

  7. 第三节:Redis缓存雪崩、击穿、穿透、双写一致性、并发竞争、热点key重建优化、BigKey的优化 等解决方案

    一. 缓存雪崩 1. 含义 同一时刻,大量的缓存同时过期失效. 2. 产生原因和后果 (1). 原因:由于开发人员经验不足或失误,大量热点缓存设置了统一的过期时间. (2). 产生后果:恰逢秒杀高峰, ...

  8. redis集群讨论

    一.生产应用场景 二.存储架构演变 三.应用最佳实践 四.运维经验总结 第1.2节:介绍redis cluster在唯品会的生产应用场景,以及存储架构的演变.第3节:redis cluster的稳定性 ...

  9. 一份完整的阿里云 Redis 开发规范,值得收藏!

    来源:yq.aliyun.com/articles/531067 作者:付磊-起扬 本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通 ...

  10. 阿里云Redis开发规范

    转自: https://yq.aliyun.com/articles/531067 摘要: 本文介绍了在使用阿里云Redis的开发规范,从键值设计.命令使用.客户端使用.相关工具等方面进行说明,通过本 ...

随机推荐

  1. fastposter v2.8.0 发布 电商海报编辑器

    fastposter v2.8.0 发布 电商海报编辑器 fastposter海报生成器,电商海报编辑器,电商海报设计器,fast快速生成海报 海报制作 海报开发.二维码海报,图片海报,分享海报,二维 ...

  2. vue中v-for说明

    v-if vs v-show区别v-if:每次显示与否,都会执行销毁和重建,渲染开销较大v-show:始终会被渲染并保留在DOM中.只是简单地切换display属性.频繁切换的时候用v-if,较少切换 ...

  3. ༺$Musique Collection 1$༻

    ~~头图~~ 自取捏 <\(Landslide\)>-\(Oh\,Wonder\) I know it hurts sometimes but You'll get over it You ...

  4. 密码学—Vigenere破解Python程序

    文章目录 概要 预备知识点学习 整体流程 技术名词解释 技术细节 小结 代码 概要 破解Vigenere需要Kasiski测试法与重合指数法的理论基础 具体知识点细节看下面这两篇文章 预备知识点学习 ...

  5. uniapp 微信支付,小程序支付,支付宝支付问题汇总

    背景介绍 uni-app 可以转微信小程序或直接打包 APP ,支付模块使用统一方法 uni.requestPayment 但是不同平台参数不同容易出现混淆错乱. 相关网站 uni-app 统一支付: ...

  6. 手把手教你搭建mongodb分片集群

    本章用的自己的电脑win10 系统  因为工作上的环境也是win的  就没在虚拟机上玩  (ps: 其实上面环境都大同小异) 在MongoDB(版本 6.xx)中,分片是指将collection分散存 ...

  7. go 从入门到了解

    一,GO的安装与配置 官网:https://golang.org/dl/ 镜像:https://golang.google.cn/dl/ 1,GOPATH GOPATH在windows上的默认值:%U ...

  8. JSON转化工具的使用

    概述 JSON是一种轻量化的数据传输格式,在各种场景都有运用.比如在ajax中,服务端的数据一般通过JSON字符串的格式传输给前端,前端ajax引擎自动将JSON字符串转化为JS对象(需要将ajax的 ...

  9. 一个免费、时尚、强大的 Windows GitHub 客户端

    前言 今天大姚给大家分享一个.NET开源(MIT License).免费.时尚.功能强大的 Windows GitHub 客户端:FluentHub. 工具功能 多任务标签页. 上下文菜单扩展. 对问 ...

  10. WPF开发快速入门【0】前言与目录

    前言 WPF是一个生不逢时的技术,刚推出的时候由于是XP时代,WPF技术有两个不方便的地方: 1.由于操作系统没有自带Framework,需要另外安装,比较麻烦: 2.程序第一次启动时,由于要加载Fr ...