当前位置: 首页 > article >正文

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

文章目录

  • 前言
  • 查找Redis大key
  • 使用Scan命令优化
  • 总结

前言

最近电脑性能告急,所有磁盘变红无空间,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 是一个很好的替代方案,查询代码如下:

#!/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 来代替,所以优化后的代码如下:

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)

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

体系决定交易盈亏,规则决定交易生死,格局决定交易高度。真正的亏钱,源于贪婪,常常出现在看到别人盈利而担心自己赚不到这一波的时候~

如果一直谨小慎微并不会亏多少,而当人因为一些外部原因获取超额盈利却把它作为自身能力时,也就逐步拉开了亏损的大幕


http://www.kler.cn/a/440856.html

相关文章:

  • 在pycharm2024.3.1中配置anaconda3-2024-06环境
  • 005 Qt常用控件Qwidget_下
  • 【研究趋势】Nips2024 多模态论文热点分析
  • Anaconda更改虚拟环境安装路径
  • RPC远程服务调用详解和gRPC简介
  • 【合作原创】使用Termux搭建可以使用的生产力环境(七)
  • springmvc跳转不经过视图解析器,controller保存数据,controller层返回json数据,拦截器,全局异常处理,文件上传含本地和阿里oss
  • Fscan内网横向工具
  • Ansible Playbook 简介
  • 三维移动游戏
  • C++智能指针详解
  • 3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版
  • 05、SpringMVC全注解开发
  • 音频声音太小怎么调大?调大音频声音的几种方法
  • STM32-笔记1-点亮led灯
  • sqlilabs靶场二十一关二十五关攻略
  • app的测试范围以及web和app的测试区别
  • 搭建Tomcat(二)--反射的应用
  • 详细描述一下 Elasticsearch 更新和删除文档的过程。
  • 在VScode中对R语言进行环境配置