开发欺负我 Redis 的大 keys的问题,我一个DBA怎么解决?
❝开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3300人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7群均已爆满,开8群近400 9群 200+,开10群PolarDB专业学习群100+)
Redis最近在看大KEY的问题,想研究一下原理和解决的方案,在安装的过程中,发现现在的Redis和之前的5.0安装有一些区别。甚至越来越不认识Redis了,一些模块后续还的学习,今天主要针对大KEY的问题
在安装中官方建议为安装Redis要安装Python ?
之前5.0的时候我下载开源包很简单,下载编译,但现在登录官网后,我发现一个问题,安装开源的REDIS 文档上让我安装一堆依赖,包含python。
我研究了一下,第一个问题为什么要装Redis 还要装python。
1 Redis 本身并不需要python而需要python的是Redis自带测试套件中的/test里面的东西,里面有很多python写的CI test,同时做Cmake的时候,有一些模块构建部分依赖管理也是有glue code,所以建议在安装高版本的时候可以安装python 按照官网的文档来。
同时Redis中的 RedisJson , RedisSearch, Redis Tiemseries等模块都依赖python生成器构建系统,需要的版本避免和原有系统的版本冲突,所以需要安装指定的python版本。
sudo dnf install -y --nobest --skip-broken \
pkg-config \
wget \
gcc-toolset-13-gcc \
gcc-toolset-13-gcc-c++ \
git \
make \
openssl \
openssl-devel \
python3.11 \
python3.11-pip \
python3.11-devel \
unzip \
rsync \
clang \
curl \
libtool \
automake \
autoconf \
jq \
systemd-devel
```

所以要使用更新版本的redis的以及新功能的情况下是需要进行安装python和pip的。回到进行的问题,大key。
我们在安装好的Redis灌入一个大key
head -c 10485760 < /dev/zero | tr '\0''a' | redis-cli -x set bigstring
怎么找到大key,redis有一些命令和工具可以进行分析和处理,通过 redis-cli --bigkeys可以对当前的redis进行scan,给出当前系统中每种数据类型中最大的key的名字和大小统计。这里注意 --bigkeys 是采样扫描,并不是全量扫描,如果要找出更多的大keys 并进行排行可以通过脚本来进行。
[root@redis8 ~]# redis-cli --bigkeys
# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).
100.00% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Keys sampled: 1
-------- summary -------
Total key length in bytes is 9 (avg len 9.00)
Biggest string found "bigstring" has 10485760 bytes
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
0 lists with 0 items (00.00% of keys, avg size 0.00)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
1 strings with 10485760 bytes (100.00% of keys, avg size 10485760.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)
[root@redis8 ~]#
[root@redis8 ~]# sh big_keys.sh
开始扫描 Redis (127.0.0.1:6379) 大 Key ...
前 20 个大 key:
----------------------------------------------
12582928 bigstring
----------------------------------------------
单位:字节(可以除以 1048576 得到 MB)
[root@redis8 ~]# head -c 10485760 < /dev/zero | tr '\0' 'a' | redis-cli -x set bigstring
OK
[root@redis8 ~]# head -c 10485760 < /dev/zero | tr '\0' 'a' | redis-cli -x set bigstri1
OK
[root@redis8 ~]# head -c 10485760 < /dev/zero | tr '\0' 'a' | redis-cli -x set bigstr2
OK
[root@redis8 ~]# head -c 10485760 < /dev/zero | tr '\0' 'a' | redis-cli -x set bigst3
OK
[root@redis8 ~]# head -c 10485760 < /dev/zero | tr '\0' 'a' | redis-cli -x set bigs4
OK
[root@redis8 ~]# sh big_keys.sh
开始扫描 Redis (127.0.0.1:6379) 大 Key ...
前 20 个大 key:
----------------------------------------------
12582928 bigstring
12582928 bigstri1
12582928 bigstr2
12582928 bigst3
12582928 bigs4
----------------------------------------------
单位:字节(可以除以 1048576 得到 MB)
[root@redis8 ~]#
linux shell 脚本,可以在本地执行,在脚本后带上IP和端口号,如果redis有密码,则最后带上密码即可。
#!/bin/bash
# 用 redis-cli 扫描 redis,找出占用内存最大的 20 个 key
# 使用方法: ./find_bigkeys.sh [host] [port] [password]
REDIS_CLI="redis-cli"
HOST=${1:-127.0.0.1}
PORT=${2:-6379}
AUTH=$3
if [ -n "$AUTH" ]; then
AUTH_OPT="-a $AUTH"
else
AUTH_OPT=""
fi
echo"开始扫描 Redis ($HOST:$PORT) 大 Key ..."
cursor=0
tmpfile=$(mktemp)
while :
do
# SCAN 每次取 1000 个 key
result=$($REDIS_CLI -h $HOST -p $PORT$AUTH_OPT --raw SCAN $cursor COUNT 1000)
cursor=$(echo"$result" | head -1)
keys=$(echo"$result" | tail -n +2)
for k in$keys; do
size=$($REDIS_CLI -h $HOST -p $PORT$AUTH_OPT MEMORY USAGE "$k" 2>/dev/null)
if [ -n "$size" ]; then
echo -e "$size\t$k" >> $tmpfile
fi
done
# cursor 回到 0 就说明扫描结束
if [ "$cursor" == "0" ]; then
break
fi
done
echo"前 20 个大 key:"
echo"----------------------------------------------"
sort -nr $tmpfile | head -20 | awk '{printf "%-12s %-10s\n", $1, $2}'
echo"----------------------------------------------"
echo"单位:字节(可以除以 1048576 得到 MB)"
rm -f $tmpfile
这里大keys有什么风险和问题
1 通过访问大keys 如get ,hgetall 等会占用单线程,在访问中租塞其他的访问的请求。尤其在进行del命令删除的时候,会有卡顿的情况。
2 会造成内存碎片的问题,RDB/AOF文件也会变大,尤其在内存刷新的情况下,会耗时。
3 网络的传输压力也很大,会拖慢导致客户端超时等问题。
DBA 也会问为什么会产生大keys的问题,这里从开放的角度,大部分还是设计不合理
1 日志存储,将一次请求的LOG 都塞入到一个KEY中
2 一客户ID为数据存储的情况,有的客户数据量小,有的很大,大的产生了大KEY
3 省事进行数据缓存,比如把一个配置表都缓存到一个KEY 中
解决方案也很多
比如,写入数据按照时间分片,杜绝一直往一个KEY里面写,尤其日志信息。同时DBA也应该经常运行上面的脚本,来发现大KEYS并通知开发进行解决。且删除的时候用unlink的异步方式进行,二不要用del的方式来删除大keys.
微软动手了,联合OpenAI + Azure 云争夺AI服务市场
“当复杂的SQL不再需要特别的优化”,邪修研究PolarDB for PG 列式索引加速复杂SQL运行
“合体吧兄弟们!”——从浪浪山小妖怪看OceanBase国产芯片优化《OceanBase “重如尘埃”之歌》
未知黑客通过SQL SERVER 窃取企业SAP核心数据,影响企业运营
那个MySQL大事务比你稳定,主从延迟低,为什么? Look my eyes! 因为宋利兵宋老师
非“厂商广告”的PolarDB课程:用户共创的新式学习范本--7位同学获奖PolarDB学习之星
说我PG Freezing Boom 讲的一般的那个同学,专帖给你,看看这次可满意
这个 PostgreSQL 让我有资本找老板要 鸡腿 鸭腿 !!
OceanBase Hybrid search 能力测试,平换MySQL的好选择
HyBrid Search 实现价值落地,从真实企业的需求角度分析 !不只谈技术!
OceanBase 光速快递 OB Cloud “MySQL” 给我,Thanks a lot
从“小偷”开始,不会从“强盗”结束 -- IvorySQL 2025 PostgreSQL 生态大会
被骂后的文字--技术人不脱离思维困局,终局是个 “死” ? ! ......
个群2025上半年总结,OB、PolarDB, DBdoctor、爱可生、pigsty、osyun、工作岗位等
从MySQL不行了,到乙方DBA 给狗,狗都不干? 我干呀!
SQL SERVER 2025发布了, China幸亏有信创!
MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL
PostgreSQL 新版本就一定好--由培训现象让我做的实验
删除数据“八扇屏” 之 锦门英豪 --我去-BigData!
写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究》
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
MongoDB 相关文章
MongoDB “升级项目” 大型连续剧(4)-- 与开发和架构沟通与扫尾
MongoDB “升级项目” 大型连续剧(3)-- 自动校对代码与注意事项
MongoDB “升级项目” 大型连续剧(2)-- 到底谁是"der"
MongoDB “升级项目” 大型连续剧(1)-- 可“生”可不升
MongoDB 大俗大雅,上来问分片真三俗 -- 4 分什么分
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
免费PolarDB云原生课程,听课“争”礼品,重塑云上知识,提高专业能力
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火
PostgreSQL 无服务 Neon and Aurora 新技术下的新经济模式 (翻译)
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
MySQL相关文章