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)

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


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

相关推荐
小码ssim15 分钟前
docker搭建Redis集群及哨兵(windows10环境,OSS Cluster)
数据库·redis·缓存
SUDO-12 小时前
Redis集合运算的应用场景
数据库·redis·缓存
紫火桑葚3 小时前
windows openssl编译x64版libssl.lib,编译x64版本libcurl.lib,支持https,vs2015编译器
windows·网络协议·https·静态库·openssl·libcurl
dot.Net安全矩阵4 小时前
.NET 技术 | 调用系统API创建Windows服务
windows·安全·web安全·矩阵·.net·.netcore
阳阳大魔王6 小时前
批处理命令的语法与功能
windows·笔记·命令模式·批处理
Sunmanit6 小时前
异步将用户信息存入 Redis 缓存
java·数据库·redis·缓存
Steven_Mmm6 小时前
高并发-缓存预热
redis·缓存
席万里9 小时前
分布式锁【Redis场景分布式锁篇】
数据库·redis·分布式