概述

今天主要介绍怎么统计redis key类型数据大小分布。

原理:使用redis命令: scan、pipline、type 和 debug object 来得到 redis key 信息。


脚本

内容如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import getopt
import time
import sys
import redis
import os
reload(sys)
sys.setdefaultencoding('utf8') __Version__ = "1.8.1" '''
Function :
1. Show All Key type
2. Show Key size distrute
3. Show Key key counter
4. Show Key with no ttl counter
''' #LIST FORMAT
#0 1 2 3 4 5 6 7 8 9 10 11
#ALL <=64 <=128 <=256 <=512 <=1024 <=2048 <=3072 <=4096 <=5120 <=6044 >6044
string_size_counter_list = [0,0,0,0,0,0,0,0,0,0,0,0]
list_size_counter_list = [0,0,0,0,0,0,0,0,0,0,0,0]
hash_size_counter_list = [0,0,0,0,0,0,0,0,0,0,0,0]
set_size_counter_list = [0,0,0,0,0,0,0,0,0,0,0,0]
zset_size_counter_list = [0,0,0,0,0,0,0,0,0,0,0,0] def size_counter_do_count(keySizeCounterList,keySize,keyTtl):
keySizeCounterList[0] += 1 #// Add all global counter
if keyTtl < 0:
keySizeCounterList[1] += 1
if keySize <= 64:
keySizeCounterList[2] += 1
elif keySize <= 128:
keySizeCounterList[3] += 1
elif keySize <= 512:
keySizeCounterList[4] += 1
elif keySize <= 1024:
keySizeCounterList[5] += 1
elif keySize <= 2048:
keySizeCounterList[6] += 1
elif keySize <= 3072:
keySizeCounterList[7] += 1
elif keySize <= 4096:
keySizeCounterList[8] += 1
elif keySize <= 5120:
keySizeCounterList[9] += 1
elif keySize <= 6044:
keySizeCounterList[10] += 1
else:
keySizeCounterList[11] += 1
return keySizeCounterList def key_size_static(keyType,keySize,keyTtl):
global string_size_counter_list
global list_size_counter_list
global hash_size_counter_list
global set_size_counter_list
global zset_size_counter_list if keyType == "string":
string_size_counter_list = size_counter_do_count(string_size_counter_list,keySize,keyTtl)
elif keyType == "hash":
hash_size_counter_list = size_counter_do_count(hash_size_counter_list,keySize,keyTtl)
elif keyType == "list":
list_size_counter_list = size_counter_do_count(list_size_counter_list,keySize,keyTtl)
elif keyType == "set":
set_size_counter_list = size_counter_do_count(set_size_counter_list,keySize,keyTtl)
elif keyType == "zset":
zset_size_counter_list = size_counter_do_count(zset_size_counter_list,keySize,keyTtl)
else:
print "UNKONW KEY TYPE !!",keyType '''Redis SCAN command got keys '''
def get_key(rdbConn,start):
try:
keys_list = rdbConn.scan(start,count=20)
return keys_list
except Exception,e:
print e ''' Redis DEBUG OBJECT command got key info '''
def get_key_info(rdbConn,keyName):
try:
rpiple = rdbConn.pipeline()
rpiple.type(keyName)
rpiple.debug_object(keyName)
rpiple.ttl(keyName)
key_info_list = rpiple.execute()
return key_info_list
except Exception,e:
print "INFO : ",e def redis_key_static(key_info_list): keyType = key_info_list[0]
keySize = key_info_list[1]['serializedlength']
keyTtl = key_info_list[2]
key_size_static(keyType,keySize,keyTtl) '''Print Key distrubution '''
def show_static_info(host,port,start_time,end_time):
print u'''----------------------------------------------------------------------------------------------------------------------------------------------------
统计时间:[%s ~ %s]
Redis服务器[%s:%s]
数据类型和数据大小分布情况如下:
----------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------
|KEY TYPE | KEY COUNT | KEY No TTL | KEY 64(byte) | KEY 128 | Key 512 | Key 1024 | Key 2048 | Key 3072 | Key 4096 | Key 5120 | Key 6044 | Key large |
|%7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s |
|%7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s |
|%7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s |
|%7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s |
|%7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s | %7s |
----------------------------------------------------------------------------------------------------------------------------------------------------
''' % (start_time,end_time,host,port,'String',string_size_counter_list[0],string_size_counter_list[1],string_size_counter_list[2],string_size_counter_list[3],string_size_counter_list[4],string_size_counter_list[5],string_size_counter_list[6],string_size
_counter_list[7],string_size_counter_list[8],string_size_counter_list[9],string_size_counter_list[10],string_size_counter_list[11], 'LIST',list_size_counter_list[0],list_size_counter_list[1],list_size_counter_list[2],list_size_counter_list[3],list_size_counter_list[4],list_size_counter_list[5],list_size_counter_list[6],list_size_counter_list[7],l
ist_size_counter_list[8],list_size_counter_list[9],list_size_counter_list[10],list_size_counter_list[11], 'HASH',hash_size_counter_list[0],hash_size_counter_list[1],hash_size_counter_list[2],hash_size_counter_list[3],hash_size_counter_list[4],hash_size_counter_list[5],hash_size_counter_list[6],hash_size_counter_list[7],
hash_size_counter_list[8],hash_size_counter_list[9],hash_size_counter_list[10],hash_size_counter_list[11], 'SET',set_size_counter_list[0],set_size_counter_list[1],set_size_counter_list[2],set_size_counter_list[3],set_size_counter_list[4],set_size_counter_list[5],set_size_counter_list[6],set_size_counter_list[7],set_size_
counter_list[8],set_size_counter_list[9],set_size_counter_list[10],set_size_counter_list[11], 'ZSET',zset_size_counter_list[0],zset_size_counter_list[1],zset_size_counter_list[2],zset_size_counter_list[3],zset_size_counter_list[4],zset_size_counter_list[5],zset_size_counter_list[6],zset_size_counter_list[7],
zset_size_counter_list[8],zset_size_counter_list[9],zset_size_counter_list[10],zset_size_counter_list[11]) def usage():
print '''
This Scripts is used for statistic key distribution , Current is Version is Just show key type and key size Distrub! --INPUT :
-p,--password= Author pass
-P,--port= Redis Port ,Default is 6379
-h,--host= Redis Host ,Default is 127.0.0.1
-H,--help show Scritps Usages ! --EXAMPLE:
python redis_key_distribution.py -h 服务器IP -P 6379 --Sample:
----------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------
统计时间:[Sun Nov 3 17:17:09 2019 ~ Sun Nov 3 17:17:09 2019]
Redis服务器[localhost:6379]
数据类型和数据大小分布情况如下:
----------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------
|KEY TYPE | KEY COUNT | KEY No TTL | KEY 64(byte) | KEY 128 | Key 512 | Key 1024 | Key 2048 | Key 3072 | Key 4096 | Key 5120 | Key 6044 | Key large |
| String | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| LIST | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| HASH | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| SET | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| ZSET | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---------------------------------------------------------------------------------------------------------------------------------------------------- Above shows key type for goods-sort, as you can see most key type is : ZSET; for ZSET: there are 26489 keys size between 512 ~ 1024 byte ! '''
sys.exit() def parse_args(sys_argvs):
passwd = ''
host = '127.0.0.1'
port = 6379
try:
opts,args = getopt.getopt(sys_argvs,"HP:h:",["help","password=","port=","host="])
for op,value in opts:
if op in ("-p","--password"):
password = value
elif op in ("-h","--host"):
host = value
elif op in ("-P","--port"):
port = int(value)
elif op in ("-H","--help"):
usage()
except Exception,e:
print "Parse Args Error ,%s" % (e)
##//return {'passwd':passwd,'host':host,'port':port,'outputdir':outputdir}
return {'passwd':passwd,'host':host,'port':port} ''' Main Function '''
def main():
if len(sys.argv) < 2:
usage()
input_args = parse_args(sys.argv[1:]) host = input_args['host']
port = input_args['port']
start_time = time.ctime() rdbConn = redis.Redis(host=host,port=port)
init_keys = get_key(rdbConn,0) #keysFile = open(host.replace('.','_')+'_'+str(port)+'.redis','w')
keys_without_expire_time_handle = open(host.replace('.','_')+'_'+str(port)+'_without_expiretime.redis','w') while True :
for key in init_keys[1] :
key_info = get_key_info(rdbConn,key)
if key_info:
redis_key_static(key_info)
#keysFile.write('''"%s"\n''' % (key+','+key_info[0]+','+str(key_info[1]['serializedlength'])+','+str(key_info[2])))
if key_info[2] < 0:
keys_without_expire_time_handle.write(key_info[0]+','+key+'\n')
init_keys = get_key(rdbConn,init_keys[0])
if init_keys[0] == 0:
break end_time = time.ctime()
#keysFile.close()
keys_without_expire_time_handle.close()
show_static_info(host,port,start_time,end_time) if __name__ == "__main__":
print ''' Please Wait For Seconds .... '''
main()


实验测试

1、为Python安装Redis库

登陆https://github.com/andymccurdy/redis-py 后点击Download ZIP下载安装包。

解压并安装:

unzip redis-py-master.zip -d /usr/local 
cd /usr/local/redis-py-master/
python setup.py install

安装完成后,就可以引用redis库了。

2、执行结果:

python redis_key_distribution.py -h localhost -P 6379

分享一个Python脚本--统计redis key类型数据大小分布的更多相关文章

  1. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  2. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  3. 分享一个SQLSERVER脚本

    原文:分享一个SQLSERVER脚本 分享一个SQLSERVER脚本 很多时候我们都需要计算数据库中各个表的数据量很每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespac ...

  4. 如何手动写一个Python脚本自动爬取Bilibili小视频

    如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...

  5. 【下载】分享一个ida脚本,非常方便

    标 题: [下载]分享一个ida脚本,非常方便作 者: 梁萧时 间: 2013-09-05,13:32:14链 接: http://bbs.pediy.com/showthread.php?t=178 ...

  6. [置顶] Redis String类型数据常用的16条命令总结

    Redis String类型数据常用的16条命令总结 描述:String 类型是最简单的类型,一个Key对应一个Value,String类型是二进制安全的.Redis的String可以包含任何数据,比 ...

  7. 【Python脚本】Python创建删除文件-----------我的第一个Python脚本

    Python相对C++和Java来说,是解释性语言,非常适合来编写脚本. 很久之前就开始学习Python的语法了,今天写了第一个Python的脚本,来简化我的一些日常工作. 我平时学习的时候喜欢新建一 ...

  8. 写一个python脚本监控在linux中的进程

    在虚拟机中安装Linux中的CentOS7系统 https://baijiahao.baidu.com/s?id=1597320700700593557&wfr=spider&for= ...

  9. Python 统计代码的行数,Python脚本 统计代码

    # coding=utf-8 import os import time # 需要统计的文件夹或者文件,这是在windows下运行的,如果使用Linux系统可以使用 basedir = '/app/l ...

随机推荐

  1. C# 从注册表判断指定ocx控件是否已注册 以及获取它的注册路径

    /// <summary> /// 注册控件 /// </summary> /// <returns></returns> public bool Re ...

  2. OCR5:预处理

    Tesseract4.X已经有了初步成效(见下面的对比), 但目前结果对于训练之外的数据, 仍会有很大的偏差.想要更好的 OCR 结果, README 中重点强调的一点是: 在交给 Tesseract ...

  3. Django之ORM多对多表创建方式,AJAX异步提交,分页器组件等

    MTV与MVC MTV模型: ​ M:模型层(models.py),负责业务对象和数据库关系的映射(ORM) ​ T:模板层(Template),负责如何把页面展示给用户(HTML) ​ V:视图层( ...

  4. Centos7部署LAMP平台之架构之路

    部署LAMP平台搭建 一.源码安装LAMP 1. 安装apache [root@localhost ~]# yum -y install gcc* apr-devel apr-util-devel p ...

  5. ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)

    1.漏洞概述 攻击者可利用此漏洞构造恶意的url,向服务器写入任意内容的文件,达到远程代码执行的目的 2.影响版本 ThinkCMF X1.6.0 ThinkCMF X2.1.0 ThinkCMF X ...

  6. Spring Boot 2.0 整合携程Apollo配置中心

    原文:https://www.jianshu.com/p/23d695af7e80 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够 ...

  7. 后台返回的base64的图片格式,前端如何转为普通的图片格式

    在上一篇的博客当中,写了前端如何将普通的图片格式转为base64的图片,今天开发的时候遇到了后台返回的图片格式是base64的,我这边需要把base64的图片格式转为普通的,搜了一下js的方法,感觉很 ...

  8. 锤子手机做appium自动化测试时,运行脚本总是弹出警告框的问题

    当运行脚本的时候,总是提示若干个如上提示框,必须点击同意才能进行下一步:解决方案: 在设置,全局高级设置,开发者选项中打开“总是允许USB安装应用”即可解决:

  9. js动画--一个小bug处理下

    对于上面的课程我们很好的处理了一个小bug,那么我们现在讲程序进行优化一下,前一节的程序中,我们处理处理的属性都是写死了的.为了我们能够很好的对某个属性进行操作的话.我们这样来设置. js文件 win ...

  10. GitHub使用方法与三步教程

    git下载地址:https://git-scm.com/downloads 下一步下一步就好了 在cmd输入 git --version 在桌面空白右键 Git Bash Here命令行 输入 git ...