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: [email protected]
#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:[email protected]
#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: [email protected] 

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
时间: 2024-10-14 08:46:22

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

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

package com.ailk.biapp.ci.localization.cntv.filter; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; imp

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

需求由来 1.Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争. 这里的并发指的是多个redis的client同时set key引起的并发问题. 2.出现并发设置Key的原因 Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘.由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端

mac ssh key 的获取 (转)

mac 系统开始就已经为我们安装了ssh  如果没有安装没,首先安装:这个在网上到处都是. 打开终端:$ ssh -v 查看ssh版本 OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011 usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-e escape_char] [-F configfile] [-I pkcs

Redis遍历所有key的两个命令 -- KEYS 和 SCAN

当我们需要遍历Redis所有key或者指定模式的key时,首先想到的是KEYS命令: KEYS pattern   官网对于KEYS命令有一个提示: KEYS 的速度非常快,例如,Redis在一个有1百万个key的数据库里面执行一次查询需要的时间是40毫秒 .但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 KEYS, 你最好还是用 Redis 的集合结构 SETS 来代替. KEYS命令使用很简单. redis> MSET one 1 two 2 three

解决redis运行期间key值过期但是内存memory依然占用过高

要解决这个问题,首先要了解redis info信息中几个数据的意义: used_memory:810575104 //数据占用了多少内存(字节) used_memory_human:773.02M //数据占用了多少内存(带单位的,可读性好) used_memory_rss:885465088  //redis占用了多少内存 used_memory_rss_human:844.45M //redis占用了多少内存(带单位的,可读性好) used_memory_peak:2001274696 //

通过Dictionary key值获取对应value

/// <summary> /// 通过Dictionary key值获取对应value /// </summary> public string GetValueByKey(Dictionary<string, string> dic,string key) { string result = ""; foreach (KeyValuePair<string, string> kvp in dic) { if (kvp.Key.Equa

Redis 键(key)

Redis 键(key) Redis键命令用于管理redis的键. 语法 Redis键命令的基本语法如下: redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> DEL runoobkey (integer) 1     在以上实例中DEL是一个命令,runoobkey是一个键.如果键被删除成功,命令执行后输出(integer

超大批量删除redis中无用key+配置

目前线上一个单实例redis中无用的key太多,决定删除一部分. 1.删除指定用户的key,使用redis的pipeline 根据一定条件把需要删除的用户统计出来,放到一个表里面,表为 del_user(int user_id),rows大约在1千万. 要删除的key为 "login:%s" %s匹配 user_id . 写sql文如下:把sql文保存在一个文件里面,命名为 1.sql SELECT CONCAT( "*2\r\n", '$3\r\n',    'D

辛星浅析Redis中与key有关的命令

在Redis中,我们还可以直接对key直接操作,下面是我们常用的主要命令: (1)keypattern   它表示获取所有匹配pattern的keys,这里需要注意的是,我们应该避免使用该命令,因为对于大型数据库而言,该命令非常耗时,对Redis服务器的性能打击也是比较大的.它支持glob-style的通配符格式,比如用*表示任意一个或者多个字符,用?表示任意字符,用[xyz]表示方括号中的任意一个字母. (2)del   key ....   它是从数据库中删除参数中指定的keys,如果指定的