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

文章目录

  • [0 前言](#0 前言)
  • 1.MoreKey案例
  • 2.BigKey案例
    • 2.1多大算BigKey
    • [2.1.1 string和二级结构](#2.1.1 string和二级结构)
    • [2.2 Bigkey危害、产生与发现](#2.2 Bigkey危害、产生与发现)
      • [2.2.1 bigkey的危害](#2.2.1 bigkey的危害)
      • [2.2.2 如何产生](#2.2.2 如何产生)
      • [2.2.3 如何发现](#2.2.3 如何发现)
  • [2.2.4 大key如何删除](#2.2.4 大key如何删除)
  • 3.BigKey生产调优
    • [3.1 redis.conf配置文件 LAZY FREEING相关说明](#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大批量数据。

bash 复制代码
	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命令登场

bash 复制代码
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

2.2.4 大key如何删除

如何删除big请参考《阿里巴巴开发手册》。具体如下:

1.String

一般用del,如果过于庞大使用unlink key删除。

2.hash

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

  • 基本命令
bash 复制代码
HSCAN key cursor [MATCH pattern] [COUNT count]
  • 阿里手册

     &#81953.list
  • 使用ltrim渐进式逐步删除,直到全部删除
  • 命令
      Redis Ltrim 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被剧除,下标0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。 你也可以使用负数术标,以-1表示列表的最后一个元素,-2 表示列表的倒数第二个元素,以此类推。
    语法
bash 复制代码
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调优。这块也算忙完了!!!

相关推荐
松涛和鸣20 分钟前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa38 分钟前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k1 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦1 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL2 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·2 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德2 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫3 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i3 小时前
完全卸载MariaDB
数据库·mariadb
期待のcode3 小时前
Redis的主从复制与集群
运维·服务器·redis