通过要对redis中存在的KEY查询,挑出哪些KEY没有用到而又占用较大内存,通过命令行没有啥好办法。
一般常用的方法是./redis-cli keys "*" >key 将所有KEY倒到文件中,再对其编写脚本重定向到redis命令行中再倒出执行的结果出来。
比较麻烦费时费力,比如:要将以上key文件中记录的所有key倒出ttl为-1(永远保存),则需要在以上key文件中的每行前面加上ttl 再定向到redis-cli中出结果。
但如果要将所有key对应的占用的内存多少倒出来的话,命令行就不顶用了。于是呼,某强人就搞出以下脚本,可以将 redis中的所有KEY倒出来,依次倒出的有KEY类型、KEY存活期、KEY的容量大小(bit)。有了这几样参数,可以说redis的管理就明晰了许多,以下是py脚本。
import redis
import thread
import time
import struct
r = redis.StrictRedis(host='192.168.0.1', port=6379, db=0)
hashset = set()
hashzset = set()
hashstring = set()
hashhash = set()
hashlist = set()
keystar = r.keys("*")
for keys in keystar:
keyt = r.type(keys)
keysize = 0
if( keyt == "set" ):
tempset = r.smembers(keystar)
for oneset in tempset:
keysize += len(oneset)
elif(keyt == "zset" ):
tempzset = r.zrange(keys,0,-1)
num = 0
for oneset in tempzset:
keysize += len(oneset)
num+=1
keysize += num * 8
elif(keyt == "string"):
string = r.get(keys)
keysize += len(string)
elif(keyt == "list" ):
#here I add ptr num in it
num = r.llen(keys)
truenum = 0
for i in range(0, num - 1):
oneval = r.lindex(keys,i)
keysize += len(oneval)
truenum += 1
keysize += (truenum - 1) * 8
elif(keyt == "hash" ):
keysh = r.hkeys(keys)
for skey in keysh:
keysize += len(skey)
valsh = r.hvals(keys)
for sval in valsh:
keysize += len(sval)
extime = r.ttl(keys)
if(extime == None):
extime = -1
setsstra = '%-*s%-*s' % (100, keys, 5, keyt)
setsstrb = '%-*s%-*s' % (20, extime,10, keysize)
setsstr = setsstra + " " + setsstrb
#setsstr = keys +" "+keyt+" "+str(keysize)
if(keyt== "hash"):
hashhash.add(setsstr)
elif(keyt=="list"):
hashlist.add(setsstr)
elif(keyt=="set"):
hashset.add(setsstr)
elif(keyt=="zset"):
hashzset.add(setsstr)
elif(keyt=="string"):
hashstring.add(setsstr)
for s in hashhash:
print s
for s in hashlist:
print s
for s in hashzset:
print s
for s in hashset:
print s
for s in hashstring:
print s