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)

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


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

相关推荐
xiaoshuaishuai86 小时前
C# 接入 OpenClaw
windows·visualstudio·c#
风吹迎面入袖凉7 小时前
【Redis】Redisson的可重入锁原理
java·redis
无限进步_12 小时前
【C++】只出现一次的数字 II:位运算的三种解法深度解析
数据结构·c++·ide·windows·git·算法·leetcode
何陋轩13 小时前
消息队列Kafka与RabbitMQ深度解析:把分布式消息核心讲透,吊打面试官
redis·后端
0xDevNull13 小时前
Windows系统使用nvm实现多版本切换Node.js详细教程
windows·node.js
无限进步_13 小时前
【C++】多重继承中的虚表布局分析:D类对象为何有两个虚表?
开发语言·c++·ide·windows·git·算法·visual studio
学Linux的语莫14 小时前
Hyper-V的安装使用
linux·windows·ubuntu·hyper-v
PD我是你的真爱粉15 小时前
Redis 数据类型与底层实现:从 SDS、Quicklist 到 ZSet 跳表彻底讲透
数据结构·redis
xiaoshuaishuai815 小时前
C# 方言识别
开发语言·windows·c#
XDHCOM15 小时前
Redis节点故障自动恢复机制详解,如何快速抢救故障节点,确保数据不丢失?
java·数据库·redis