获得 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. Google -We’re Sorry....

    Author:KillerLegend From:http://www.cnblogs.com/killerlegend/p/3734840.html Date:2014.5.18 一大清早 一大早起 ...

  2. ace 读取excel

    insert into T_BirdSystemSku(ID,Sku) select ID,SKU from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel ...

  3. hadoop2—namenode—HA原理详解

    在hadoop1中NameNode存在一个单点故障问题,也就是说如果NameNode所在的机器发生故障,那么整个集群就将不可用(hadoop1中有个SecorndaryNameNode,但是它并不是N ...

  4. 远程连接数据库(通过pgAdmin)

    1.编辑/var/lib/pgsql/data/pg_hba.conf,增加语句  host all all 192.168.105.225/36 trust 让数据库接受网络 192.168.105 ...

  5. 《大话设计模式》ruby版代码:简单工厂模式

    之前有看过<ruby设计模式>,不过渐渐的都忘记了.现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下. # -*- encoding: utf-8 -*- #运 ...

  6. opengl基础学习专题 (三) 多边形绘制的几种样式

    题外话 聪明人之所以不会成功,是由于他们缺乏坚韧的毅力. ——艾萨克·牛顿(1643年1月4日—1727年3月31日)英国 也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向 ...

  7. 微信支付开发,再次签名,APP调用

    1.商户服务器生成支付订单,先调用[统一下单API]生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付. 再次生成签名的时候,按照接口: https://pay.weixin.q ...

  8. [原创]EnterpriseDB测试key申请方法

    各位有对EnterpriseDB感兴趣的朋友,可以通过邮件方式申请测试key: 发送邮件至:zws@focus-soft.com,官方收到邮件后会有专人与您联系,一般情况都会很快得到一个测试key. ...

  9. AppCan教你从零开始做开发

    经常收到类似这样的提问:新手开发APP,要怎么学?我有满屏幕的文档和视频,然而并没有什么卵用,因为我不知道该从哪看起……今天的主要内容是教大家,如何在AppCan移动平台创建应用,引擎插件选择.证书管 ...

  10. hdu 1872 稳定排序

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1872 稳定排序 Description 大家都知道,快速排序是不稳定的排序方法.如果对于数组中出现的任 ...