文章目录
前言
最近电脑性能告急,所有磁盘变红无空间,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)
体系决定交易盈亏,规则决定交易生死,格局决定交易高度。真正的亏钱,源于贪婪,常常出现在看到别人盈利而担心自己赚不到这一波的时候~
如果一直谨小慎微并不会亏多少,而当人因为一些外部原因获取超额盈利却把它作为自身能力时,也就逐步拉开了亏损的大幕