redis 数据库维护之 key 大小获取
获得 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 大小获取的更多相关文章
- 分析redis key大小的几种方法
当redis被用作缓存时,有时我们希望了解key的大小分布,或者想知道哪些key占的空间比较大.本文提供了几种方法. 一. bigKeys 这是redis-cli自带的一个命令.对整个redis进行扫 ...
- Redis 的大 Key 对持久化有什么影响?
作者:小林coding 图解计算机基础(操作系统.计算机网络.计算机组成.数据库等)网站:https://xiaolincoding.com 大家好,我是小林. 上周有位读者字节一二面时,被问到:Re ...
- 单点登录filter根据redis中的key判断是否退出
package com.ailk.biapp.ci.localization.cntv.filter; import java.io.IOException; import java.util.Has ...
- 如何解决Redis中的key过期问题
最近我们在Redis集群中发现了一个有趣的问题.在花费大量时间进行调试和测试后,通过更改key过期,我们可以将某些集群中的Redis内存使用量减少25%. Twitter内部运行着多个缓存服务.其中一 ...
- Redis实战 - 4.Key
Redis 键(key) Redis 键命令用于管理 redis 的键. DEL key 该命令用于在 key 存在时删除 key. 127.0.0.1:6379> set w3ckey red ...
- 高并发架构系列:Redis并发竞争key的解决方案详解
https://blog.csdn.net/ChenRui_yz/article/details/85096418 https://blog.csdn.net/ChenRui_yz/article/l ...
- redis 超时失效key 的监听触发使用
redis自2.8.0之后版本提供Keyspace Notifications功能,允许客户订阅Pub / Sub频道,以便以某种方式接收影响Redis数据集的事件. 可能收到的事件的例子如下: 所有 ...
- 分布式-技术专区-Redis并发竞争key的解决方案详解
Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争.这里的并发指的是多个redis的clie ...
- Redis系列之key操作命令与Redis中的事务详解(六)
序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查阅,更深入的挖掘redis潜力. 2.掌握redis中的事务,让你的数据完整性一致性拥有更优的保障. redis命 ...
随机推荐
- Google -We’re Sorry....
Author:KillerLegend From:http://www.cnblogs.com/killerlegend/p/3734840.html Date:2014.5.18 一大清早 一大早起 ...
- ace 读取excel
insert into T_BirdSystemSku(ID,Sku) select ID,SKU from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel ...
- hadoop2—namenode—HA原理详解
在hadoop1中NameNode存在一个单点故障问题,也就是说如果NameNode所在的机器发生故障,那么整个集群就将不可用(hadoop1中有个SecorndaryNameNode,但是它并不是N ...
- 远程连接数据库(通过pgAdmin)
1.编辑/var/lib/pgsql/data/pg_hba.conf,增加语句 host all all 192.168.105.225/36 trust 让数据库接受网络 192.168.105 ...
- 《大话设计模式》ruby版代码:简单工厂模式
之前有看过<ruby设计模式>,不过渐渐的都忘记了.现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下. # -*- encoding: utf-8 -*- #运 ...
- opengl基础学习专题 (三) 多边形绘制的几种样式
题外话 聪明人之所以不会成功,是由于他们缺乏坚韧的毅力. ——艾萨克·牛顿(1643年1月4日—1727年3月31日)英国 也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向 ...
- 微信支付开发,再次签名,APP调用
1.商户服务器生成支付订单,先调用[统一下单API]生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付. 再次生成签名的时候,按照接口: https://pay.weixin.q ...
- [原创]EnterpriseDB测试key申请方法
各位有对EnterpriseDB感兴趣的朋友,可以通过邮件方式申请测试key: 发送邮件至:zws@focus-soft.com,官方收到邮件后会有专人与您联系,一般情况都会很快得到一个测试key. ...
- AppCan教你从零开始做开发
经常收到类似这样的提问:新手开发APP,要怎么学?我有满屏幕的文档和视频,然而并没有什么卵用,因为我不知道该从哪看起……今天的主要内容是教大家,如何在AppCan移动平台创建应用,引擎插件选择.证书管 ...
- hdu 1872 稳定排序
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1872 稳定排序 Description 大家都知道,快速排序是不稳定的排序方法.如果对于数组中出现的任 ...