【Redis】獲取沒有設定ttl的key指令碼
一 前言
在運維Redis的時候,總會遇到使用不規範的業務設計,比如沒有對key設定ttl,進而導致記憶體空間吃緊,通常的解決方法是在slave上dump 出來所有的key ,然後對檔案進行遍歷再分析。遇到幾十G的Redis例項,dump + 分析 會是一個比較耗時的操作,為此,我開發了一個小指令碼直接連線Redis 進行scan 遍歷所有的key,然後在檢查key的ttl,將沒有ttl的key輸出到指定的檔案裡面。二 程式碼實現
-
# encoding: utf-8
-
"""
-
author: yangyi@youzan.com
-
time: 2018/4/26 下午4:34
-
func: 獲取資料庫中沒有設定ttl的 key
-
"""
-
import redis
-
import argparse
-
import time
-
import sys
-
-
-
class ShowProcess:
-
"""
-
顯示處理進度的類
-
呼叫該類相關函式即可實現處理進度的顯示
-
"""
-
i = 0 # 當前的處理進度
-
max_steps = 0 # 總共需要處理的次數
-
max_arrow = 50 # 進度條的長度
-
-
# 初始化函式,需要知道總共的處理次數
-
def __init__(self, max_steps):
-
self.max_steps = max_steps
-
self.i = 0
-
-
# 顯示函式,根據當前的處理進度i顯示進度
-
# 效果為[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]100.00%
-
def show_process(self, i = None):
-
if i is not None:
-
self.i = i
-
else:
-
self.i += 1
-
num_arrow = int(self.i * self.max_arrow / self.max_steps) # 計算顯示多少個'>'
-
num_line = self.max_arrow - num_arrow # 計算顯示多少個'-'
-
percent = self.i * 100.0 / self.max_steps # 計算完成進度,格式為xx.xx%
-
process_bar = '[' + '>' * num_arrow + ' ' * num_line + ']'\
-
+ '%.2f' % percent + '%' + '\r' # 帶輸出的字串,'\r'表示不換行回到最左邊
-
sys.stdout.write(process_bar) # 這兩句列印字元到終端
-
sys.stdout.flush()
-
-
def close(self, words='done'):
-
print ''
-
print words
-
self.i = 0
-
-
-
def check_ttl(redis_conn, no_ttl_file, dbindex):
-
start_time = time.time()
-
no_ttl_num = 0
-
keys_num = redis_conn.dbsize()
-
print "there are {num} keys in db {index} ".format(num=keys_num, index=dbindex)
-
process_bar = ShowProcess(keys_num)
-
with open(no_ttl_file, 'a') as f:
-
-
for key in redis_conn.scan_iter(count=1000):
-
process_bar.show_process()
-
if redis_conn.ttl(key) == -1:
-
no_ttl_num += 1
-
if no_ttl_num < 1000:
-
f.write(key+'\n')
-
else:
-
continue
-
-
process_bar.close()
-
print "cost time(s):", time.time() - start_time
-
print "no ttl keys number:", no_ttl_num
-
print "we write keys with no ttl to the file: %s" % no_ttl_file
-
-
-
def main():
-
parser = argparse.ArgumentParser()
-
parser.add_argument('-p', type=int, dest='port', action='store', help='port of redis ')
-
parser.add_argument('-d', type=str, dest='db_list', action='store', default=0,
-
help='ex : -d all / -d 1,2,3,4 ')
-
args = parser.parse_args()
-
port = args.port
-
if args.db_list == 'all':
-
db_list = [i for i in xrange(0, 16)]
-
else:
-
db_list = [int(i) for i in args.db_list.split(',')]
-
-
for index in db_list:
-
try:
-
pool = redis.ConnectionPool(host='127.0.0.1', port=port, db=index)
-
r = redis.StrictRedis(connection_pool=pool)
-
except redis.exceptions.ConnectionError as e:
-
print e
-
else:
-
no_ttl_keys_file = "/tmp/{port}_{db}_no_ttl_keys.txt".format(port=port, db=index)
-
check_ttl(r, no_ttl_keys_file, index)
-
-
-
if __name__ == '__main__':
- main()
注意:
程式碼裡面對沒有ttl的key的輸出做了限制,大家使用的時候可以調整閾值 或者去掉 全部輸出到指定的檔案裡面。歡迎大家使用,並給出功能或者演算法上的改進措施。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-2153848/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- redis的bigkey掃描指令碼Redis指令碼
- redis裡顯示key大小的shell指令碼Redis指令碼
- Redis大key掃描Python指令碼RedisPython指令碼
- 【Azure Redis 快取】使用Python程式碼獲取Azure Redis的監控指標值 (含Powershell指令碼方式)Redis快取Python指標指令碼
- oracle獲取ddl指令碼Oracle指令碼
- 採用lua指令碼獲取mysql、redis資料以及jwt的校驗指令碼MySqlRedisJWT
- PING命令 獲取的TTL值 登錄檔位置
- 批次過程獲取指令碼指令碼
- Redis中Lua指令碼的使用和設定超時坍淑Redis指令碼
- jquery獲取沒有選中的checkbox核取方塊jQuery
- swift 獲取通知設定Swift
- 單個過程獲取指令碼指令碼
- 透過hostname獲取IP的perl指令碼指令碼
- javascript設定或者獲取cookie程式碼例項JavaScriptCookie
- 使用dbstart指令碼的設定指令碼
- redis設定密碼Redis密碼
- Redis的指令碼Redis指令碼
- redis快取佇列+MySQL +php任務指令碼定時批量入庫Redis快取佇列MySqlPHP指令碼
- DNS入門學習:什麼是TTL值?如何設定合適的TTL值?DNS
- 通過 Redis 定時執行指令碼Redis指令碼
- cookie的設定、獲取和刪除Cookie
- javascript設定和獲取cookie值程式碼例項JavaScriptCookie
- shopify 如何獲取 apikeyAPI
- 獲取完整的sqltext指令碼。get_fulltext.shSQL指令碼
- 指令碼:獲取當前的User Trace檔案指令碼
- 常用指令碼:獲取隱含引數指令碼
- Python 指令碼之獲取CPU資訊Python指令碼
- 獲取單個檢視DDL指令碼指令碼
- 域名解析TTL是什麼意思 TTL值設定為多少合適?
- jQuery獲取keycode按鍵值程式碼jQuery
- 【DataGuarad】獲取standby 庫的配置資訊的指令碼指令碼
- 線上直播原始碼,安裝mysql沒有提示設定密碼的問題原始碼MySql密碼
- Redis 實戰 —— 14. Redis 的 Lua 指令碼程式設計Redis指令碼程式設計
- redis cluster 設定密碼Redis密碼
- 在Redis-Sentinel的client-reconfig-script指令碼中設定VIPRedisclient指令碼
- 設定獲取div元素中的文字內容程式碼例項
- Redis key 設計技巧Redis
- jquery設定和獲取元素的屬性jQuery