Redis查询占用空间最大的10个key

文章目录

前言

最近电脑性能告急,所有磁盘变红无空间,C盘更是剩下0字节,内存90%+,CPU占用90%+,使用spacesniffer查询哪些文件可以删除,优先被我干掉的是休眠功能自动生成的 hiberfil.sys 文件,然后这个内存分页文件 pagefile.sys 我没动,本来我的内存就不够用,删除了情况会更糟糕,然后映入眼帘是的 dump.rdb 文件,这个redis的持久化文件怎么这么大,足足有6个G,不仅占用了我6个G的C盘,还占用了我6个G的内存,不会是上次测试存储的大数据没删除吧,赶紧去瞅瞅。

查找Redis大key

查找的思路很简单粗暴,利用redis的API,将所有的key的大小查找出来,然后从大到小排序,找出最大的10个key。

需要注意的是,我这是本地的测试环境,为了方便所以使用了 keys 这个令人闻风丧胆的命令来阻塞获取了所有的key,如果是在生产环境中可千万不要这么写,使用 scan 是一个很好的替代方案,查询代码如下:

py 复制代码
#!/usr/bin/python3.6
# -*- coding: utf-8 -*-
# 查询redis中占用空间最大的10个key

import redis

# game redis
redis_pool = redis.ConnectionPool(host='127.0.0.1', password='myword', port=6379)
redis_server = redis.Redis(connection_pool=redis_pool)

# 获取所有键
keys = redis_server.keys('*')

# 获取每个键的内存使用情况
key_sizes = []
for key in keys:
    size = redis_server.memory_usage(key)
    key_sizes.append((key, size))

# 按内存使用大小排序,取前10个
top_keys = sorted(key_sizes, key=lambda x: x[1], reverse=True)[:10]

# 输出结果
for key, size in top_keys:
    print(f"Key: {key}, Size: {size} bytes")
    #redis_server.delete(key)

果然不出所料,内存占用前几名的key都是之前我做测试时使用的超大key,赶紧使用 redis_server.delete(key) 函数删除掉,因为当时测试使用了统一的AAA前缀,为了提高后续查找效率,我把获取key的代码改成了 keys = redis_server.keys('AAA*'),这样查找前10个key速度就快很多了

使用Scan命令优化

前面提到 keys 命令不要在生产环境使用,如果要遍历key最好使用 scan 来代替,所以优化后的代码如下:

py 复制代码
import redis

# 连接 Redis
redis_pool = redis.ConnectionPool(host='127.0.0.1', password='myword', port=6379)
redis_server = redis.Redis(connection_pool=redis_pool)

# 存储键和它们的内存使用情况
key_sizes = []

# 使用 SCAN 命令遍历所有键
cursor = 0
while True:
    cursor, keys = redis_server.scan(cursor, count=1000)  # 每次扫描最多返回 1000 个键
    for key in keys:
        size = redis_server.memory_usage(key)
        key_sizes.append((key, size))

    # 如果游标返回为 0,说明遍历完所有键
    if cursor == 0:
        break

# 按内存使用大小排序,取前10个
top_keys = sorted(key_sizes, key=lambda x: x[1], reverse=True)[:10]

# 输出结果
for key, size in top_keys:
    print(f"Key: {key}, Size: {size} bytes")
    # 如果需要删除键,可以在这里调用 redis_server.delete(key)

总结

  • Windows电脑磁盘不足时,如果不使用休眠功能,可以把C盘根目录的 hiberfil.sys 文件删掉
  • 获取所有可以的命令是 keys,但这是个阻塞命令,不要轻易在生产环境下使用,必要时使用 scan 命令代替
  • 使用 redis_server.memory_usage(key) 命令可以获取key占用内存大小,删除key使用 redis_server.delete(key)

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==


体系决定交易盈亏,规则决定交易生死,格局决定交易高度。真正的亏钱,源于贪婪,常常出现在看到别人盈利而担心自己赚不到这一波的时候~
如果一直谨小慎微并不会亏多少,而当人因为一些外部原因获取超额盈利却把它作为自身能力时,也就逐步拉开了亏损的大幕

相关推荐
Warren9840 分钟前
datagrip新建oracle连接教程
数据库·windows·云原生·oracle·容器·kubernetes·django
摇滚侠1 小时前
Redis 零基础到进阶,Redis 主从复制,笔记55-62
数据库·redis·笔记
廋到被风吹走1 小时前
【数据库】【Redis】数据结构全景图:命令、场景与避坑指南
数据结构·数据库·redis
LinHenrY12271 小时前
初识C语言(文件操作)
c语言·windows·microsoft
卡尔特斯1 小时前
Mac Redis 快速安装与可视化(详细流程)
redis
凯子坚持 c2 小时前
Redis 数据库的服务器部署与 MCP 智能化交互深度实践指南
服务器·数据库·redis
‘胶己人’2 小时前
redis分布式锁
数据库·redis·分布式
隔壁阿布都2 小时前
Docker 安装 Redis
redis·docker·容器
不穿格子的程序员2 小时前
Redis篇5——Redis深度剖析:系统的“隐形杀手”——热Key与大Key问题
数据库·redis·缓存·热key·大key
Thexhy3 小时前
基础篇:Redis核心命令及用法
java·linux·redis