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命 ...
随机推荐
- [FAQ]String(字串相連)與StringBuilder的差別、原理與優缺點?
原文位於 http://www.dotblogs.com.tw/mis2000lab/archive/2013/09/09/msdn_string_stringbuilder.aspx [FAQ]St ...
- PropertyGrid 控件使用方法
编写一个对象,后面传递给 PropertyGrid 来显示: using System; using System.Collections.Generic; using System.Linq; us ...
- main函数的argc和argv
int main(int argc, char const *argv[]) { printf("argc : %c\n",argc); printf(] ); printf( ...
- hdu 4006/AvlTree
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006 这道题以前用c语言写的Avltree水过了.. 现在接触了c++重写一遍... 由于没有删除操作 ...
- iOS学习之UIControl
一.UIControl初识 1.UIControl是有控制功能的视图(比如UIButton.UISlider.UISegmentedControl等)的父类. 只要跟控制有关的控件都是继承于 ...
- AngularJS与RequireJS集成方案
关于angularjs.requirejs的基础知识请自行学习 一.简单事例的项目目录如下: -index.html -scripts文件夹 --controller文件夹 --- mianContr ...
- iOS8 超简单的设置圆角按钮 ImageView等UIView
button.layer.cornerRadius = // 这个值根据你想要的效果可以更改 button.clipsToBounds = true 这种方法不止可以设置按钮,UIView应该都可以设 ...
- Swift global function(count indexOfObject contains...)
当你在使用Swift时会发现一些常用的函数不!见!了! 比如 String: s.count() s.contains() Array: a.indexOfObeject(t:<T> ...
- (转)前端构建工具gulp入门教程
前端构建工具gulp入门教程 老婆婆 1.8k 2013年12月30日 发布 推荐 10 推荐 收藏 83 收藏,20k 浏览 本文假设你之前没有用过任何任务脚本(task runner)和命令行工具 ...
- QT中实现中文的显示与国际化
1 增加头文件 #include "QTextCodec" 2 在文件中增加如下内容 QTextCodec::setCodecForTr(QTextCodec::codecF ...