获得 redis key 大小

redis 用过一段时间后,发现一个KEY每天需更新值,但总是更新不全,故此为了定位问题,整理此脚本,辅助监控一下

写了两个脚本

  • 注意:需要提前从 https://github.com/wangganyu188/redis-py.git ,下载redis支持python的api包并安装
git clone  https://github.com/wangganyu188/redis-py.git
cd redis-py
python setup install

rediskeyinfo_monitor.py

#!/usr/bin/env python
#coding:utf8
#author: shantuwqk@163.com
#redis_key_info_monitor.py import redis
import time,os,sys COLOR_RED = "\033[31;49;1m %s \033[31;49;0m"
COLOR_GREED = "\033[32;49;1m %s \033[39;49;0m"
COLOR_YELLOW = "\033[33;49;1m %s \033[33;49;0m"
COLOR_BLUE = "\033[34;49;1m %s \033[34;49;0m"
COLOR_PINK = "\033[35;49;1m %s \033[35;49;0m" COLOR_GREENBLUE = "\033[36;49;1m %s \033[36;49;0m"
REDIS_HOST="192.168.1.100" #配置redis服务器ip地址
REDIS_PORT= 6379 #配置redis服务端口号 def getHumanSize(value):
gb = 1024 * 1024 * 1024.0
mb = 1024 * 1024.0
kb = 1024.0
if value >= gb:
return COLOR_RED % (str(round(value / gb, 2)) + " gb")
elif value >= mb:
return COLOR_YELLOW % (str(round(value / mb, 2)) + " mb")
elif value >= kb:
return COLOR_BLUE % (str(round(value / kb, 2)) + " kb")
else:
return COLOR_GREED % (str(value) + "b")
def get_KEY_size(key):
month = 3600 * 24 * 30
result = []
client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)
client.info()
count = 0
if len(client.keys(key)) == 0:
print "\033[31;1m keys: %s not exist \033[0m"%key
sys.exit()
else:
for key in client.keys(key):
try:
count += 1
nowtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
idleTime = client.object('idletime', key)
refcount = client.object('refcount', key)
length = client.debug_object(key)['serializedlength']
value = idleTime * refcount
message = "%s cktime: %s key: %s , idletime: %s,refcount: %s, length: %s , humSize: %s\n" % (count,nowtime,key, idleTime, refcount, length, getHumanSize(length))
with open('%s.log'%key,'a') as f:
f.write(message)
print "%s cktime: %s key: %s , idletime: %s,refcount: %s, length: %s , humSize: %s\n" % (count,nowtime,key, idleTime, refcount, length, getHumanSize(length))
except Exception:
pass
if __name__ == "__main__":
#while True:
# 此方法可以获取redis库中所有keys信息
get_KEY_size('*') get_KEY_size方法再扩展一下,获取的信息,后期可以对redis应用情况做分析,

** getrediskey_info.py**

主要功能是控制每一分钟去redis库查询一次 key的信息,主要是监控
#!/usr/bin/env python
#coding:utf8
#author:shantuwqk@163.com
#scriptname: get_redis_key_info.py import os,sys,time
from redis_key_info_monitor import get_KEY_size def help_prompt():
print """
This program prints files to the standard output.
Options include:
--version : Prints the version number
--help : Helpful tips
sample : python %s --keys <key>
"""%(__file__) if len(sys.argv) < 2:
print "\033[31;1mno argument\033[0m"
help_prompt()
sys.exit() if sys.argv[1].startswith('--'):
option = sys.argv[1][2:]
if option == 'version':
print 'Version 0.1'
elif option == 'help':
help_prompt()
elif option == "keys" and sys.argv[2] is not None:
nowtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print "\033[32;1m **********************%s get key %s *****************\033[0m" %(nowtime,sys.argv[1])
while True:
get_KEY_size(sys.argv[2])
time.sleep(60)
else:
help_prompt()
else:
help_prompt()

执行示例

python get_redis_key_info.py --keys abc

nagios 监控redis 脚本

  • 切记应用此脚前需要安装 支持python语言的 redis-py
#!/usr/bin/env python
#coding:utf8
#version 0.2
#author: shantuwqk@163.com import sys
import argparse
import redis #SET NAGIOS EXIT STATUS CODE
ST_OK=0 #
ST_WR=1 #
ST_CR=2 #
ST_UK=3 # #INITIALIZE SYS ARGUMENTS PARSER
parser = argparse.ArgumentParser()
parser.add_argument('-H', '--host', help='Redis Server IP Address')
parser.add_argument('-p', '--port', type=int, default=6379, help='Redis Service Port default:6379')
parser.add_argument('-d', '--dbid', type=int, default=0, help='Redis Database ID Number default:0')
parser.add_argument('-w', '--warning', type=int, default=50, help='Threshold Warning Percent default:50')
parser.add_argument('-c', '--critical', type=int, default=80, help='Threshold Critical Percent default:80')
parser.add_argument('-v', '--verbose',action="count", help='Increase Output Verbosity Example:-v -vv')
args = parser.parse_args()
rHost = args.host
rPort = args.port
rWarn = float(args.warning)
rCrit = float(args.critical)
rDbid = args.dbid #SET REDIS CONNECTION
rConn = redis.Redis(host=rHost, port=rPort, socket_timeout=3)
if len(sys.argv) < 2:
print "\033[31;1m Invalid operation Please use help - h \033[0m"
else:
if rConn.ping(): # GET SOME VALUES OF SERVER STATUS
rConf = rConn.config_get()
rConfMaxmem = rConf['maxmemory']
rInfo = rConn.info()
rInfoCurrmem = rInfo['used_memory']
rInfoCurrconns = rInfo['connected_clients']
#rInfoDbkeys = rInfo['db%s'%(rDbid)]['keys']
rInfoMemusage = float("%.2f"%(float(rInfoCurrmem) / float(rConfMaxmem) * 100))
#print "#############rrrrrrrrrrrr",rConf,rInfoMemusage
#print "#########",rInfoMemusage,type(rInfoMemusage),rCrit,type(rCrit)
# CHECK OUTPUT IF VERBOSITY IS CALLED
if args.verbose == 2:
rOutput = rInfo.items()
elif args.verbose == 1:
rOutput = "SET MAX MEMORY IS %0.2f%%; CURRENT USED MEMORY IS %0.2f%%; CURRENT CONNECTIONS IS %d; %sKEYS IN DB%d"%(rConfMaxmem, rInfoCurrmem,rInfoCurrconns, rInfoDbkeys, rDbid)
else:
rOutput = "MEMORY USEAGE %0.2f%%; CURRENT CONNECTTONS IS: %d"%(rInfoMemusage, rInfoCurrconns) #DECIDE THE MEMORY USAGE STATUS
if rInfoMemusage >= rCrit:
print 'CRITICAL - %s'%rOutput
sys.exit(ST_CR)
elif rInfoMemusage >= rWarn:
print 'WARNING - %s'%(rOutput)
sys.exit(ST_WR)
else:
print 'OK - %s'%(rOutput)
sys.exit(ST_OK)
else:
print 'PROBLEM IN CONNECTING SERVER'
sys.exit(ST_UK)

执行示例

/usr/local/nagios/libexec/check_redis.py -H 192.168.1.10  -p 6379

redis 数据库维护之 key 大小获取的更多相关文章

  1. 分析redis key大小的几种方法

    当redis被用作缓存时,有时我们希望了解key的大小分布,或者想知道哪些key占的空间比较大.本文提供了几种方法. 一. bigKeys 这是redis-cli自带的一个命令.对整个redis进行扫 ...

  2. Redis 的大 Key 对持久化有什么影响?

    作者:小林coding 图解计算机基础(操作系统.计算机网络.计算机组成.数据库等)网站:https://xiaolincoding.com 大家好,我是小林. 上周有位读者字节一二面时,被问到:Re ...

  3. 单点登录filter根据redis中的key判断是否退出

    package com.ailk.biapp.ci.localization.cntv.filter; import java.io.IOException; import java.util.Has ...

  4. 如何解决Redis中的key过期问题

    最近我们在Redis集群中发现了一个有趣的问题.在花费大量时间进行调试和测试后,通过更改key过期,我们可以将某些集群中的Redis内存使用量减少25%. Twitter内部运行着多个缓存服务.其中一 ...

  5. Redis实战 - 4.Key

    Redis 键(key) Redis 键命令用于管理 redis 的键. DEL key 该命令用于在 key 存在时删除 key. 127.0.0.1:6379> set w3ckey red ...

  6. 高并发架构系列:Redis并发竞争key的解决方案详解

    https://blog.csdn.net/ChenRui_yz/article/details/85096418 https://blog.csdn.net/ChenRui_yz/article/l ...

  7. redis 超时失效key 的监听触发使用

    redis自2.8.0之后版本提供Keyspace Notifications功能,允许客户订阅Pub / Sub频道,以便以某种方式接收影响Redis数据集的事件. 可能收到的事件的例子如下: 所有 ...

  8. 分布式-技术专区-Redis并发竞争key的解决方案详解

    Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争.这里的并发指的是多个redis的clie ...

  9. Redis系列之key操作命令与Redis中的事务详解(六)

    序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查阅,更深入的挖掘redis潜力. 2.掌握redis中的事务,让你的数据完整性一致性拥有更优的保障. redis命 ...

随机推荐

  1. PHP错误处理

    错误的分类: 1.语法错误     2.运行时错误 3.逻辑错误 调试方法:1.注释法 2.输出法 error_reporting(E_ALL & ~E_NOTICE & ~E_WAR ...

  2. c#写入Mysql中文显示乱码 解决方法

    如题,mysql字符集utf8,c#写入中文后,全部显示成?,一个汉字对应一个?解决方法:在数据库连接字符串中增加字符集的说明,Charset=utf8,如 MySQLConnection con = ...

  3. IoC~高效的Autofac

    http://www.cnblogs.com/lori/archive/2012/09/05/2671724.html http://www.cnblogs.com/kissdodog/p/36114 ...

  4. async/await的实质理解

    async/await关键字能帮助开发者更容易地编写异步代码.但不少开发者对于这两个关键字的使用比较困惑,不知道该怎么使用.本文就async/await的实质作简单描述,以便大家能更清楚理解. 一.a ...

  5. c#反射机制学习和利用反射获取类型信息

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...

  6. 共享内存shared pool (6):追踪sql语句

    构建实验数据 --使用NC50用户查询(会话1) SQL> conn NC50/NC50 Connected. SQL> create table emp as select * from ...

  7. [转]Openwrt的Inittab

    转来一篇关于启动的文章,特意收藏.http://see.sl088.com/wiki/Inittab 文件位于/etc/inittab编辑方法vi /etc/inittab初始内容::sysinit: ...

  8. python datetime 时间日期处理小结

    python datetime 时间日期处理小结 转载请注明出处:http://hi.baidu.com/leejun_2005/blog/item/47f340f1a85b5cb3a50f5232. ...

  9. WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)

    无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...

  10. NOJ1066-堆排序

    堆排序 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 414            测试通过 : 220  比 ...