【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/22664653/viewspace-2153419/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Redis大key掃描Python指令碼RedisPython指令碼
- redis裡顯示key大小的shell指令碼Redis指令碼
- 【Azure Redis 快取】使用Python程式碼獲取Azure Redis的監控指標值 (含Powershell指令碼方式)Redis快取Python指標指令碼
- 採用lua指令碼獲取mysql、redis資料以及jwt的校驗指令碼MySqlRedisJWT
- PING命令 獲取的TTL值 登錄檔位置
- Redis中Lua指令碼的使用和設定超時坍淑Redis指令碼
- jenkins pipline指令碼 獲取git分支Jenkins指令碼Git
- swift 獲取通知設定Swift
- 常用指令碼:獲取隱含引數指令碼
- 通過 Redis 定時執行指令碼Redis指令碼
- 獲取Saiku3.8.8 license keyAI
- OpenAI&Claude API key獲取OpenAIAPI
- cookie的設定、獲取和刪除Cookie
- Redis設定Key/value的規則定義和注意事項(附工具類)Redis
- 直播系統程式碼,Android獲取、設定鎖屏密碼Android密碼
- REDIS 快取的穿透,雪崩和熱點keyRedis快取穿透
- DNS入門學習:什麼是TTL值?如何設定合適的TTL值?DNS
- Redis 實戰 —— 14. Redis 的 Lua 指令碼程式設計Redis指令碼程式設計
- redis 設定過期時間,以資料夾形式展示key顯示快取資料Redis快取
- 獲取AWR的指令碼,可以在crontab裡面部署指令碼
- 介面測試之 json 中的 key 獲取JSON
- 介面測試之json中的key獲取JSON
- shell指令碼獲取函式返回值指令碼函式
- shell指令碼獲取時間格式化指令碼
- 獲取sql完整指令碼,get_fulltext.shSQL指令碼
- 域名解析TTL是什麼意思 TTL值設定為多少合適?
- redis cluster 設定密碼Redis密碼
- memcahed 的 python sdk 如何批次獲取memcahed的keyPython
- iOS WebView UserAgent 獲取和設定iOSWebView
- 獲取和設定pdf目錄
- Flutter Key的原理和使用 (一) 沒有Key會發生什麼Flutter
- 域名解析中的TTL值設定多少合適?
- Redis刪除大量key後,佔用的系統記憶體卻沒有釋放?Redis記憶體
- Redis 刪除1.2億指定字首的keyRedis
- 線上直播原始碼,安裝mysql沒有提示設定密碼的問題原始碼MySql密碼
- win10電腦沒有照相功能怎麼設定_win10沒有照相功能的設定方法Win10
- Linux c程式中獲取shell指令碼輸出(如獲取system命令輸出)LinuxC程式指令碼
- Redis - Lua 指令碼Redis指令碼