
(技術ネタ)RedisのTTLが設定されてないキーの取得
-
2020年3月27日
こんにちは!今回は、開発者が毎日の開発作業中に遭遇した課題と、それを解決した方法についてのご紹介です!(シリーズ化予定)
同様の課題に直面されている方の参考になれば嬉しいですし、そうでない方もココネ開発の雰囲気を少しでも感じて頂けたら嬉しいです。
RedisのTTLが設定されてないキーの取得
今回のお題は、インメモリデータベースの一つであるRedisから「TTLが設定されていないキーのみを取得する」方法についてです。
TTLが設定されていないとキーがRedisから削除されず、Cacheサーバーという本来の役割にも合わないこと、またメモリ容量も圧迫されてしまうため安定的なサービス提供に支障が生じてしまいます。
TTLが設定されていないデータを見つけて適切な設定を加えることで、サービスの安定化やコストダウンも実現できます。
1.Redisのキー情報取得
$ redis-cli info keyspace # Keyspace db0:keys=6328703,expires=6328701,avg_ttl=9169857
上記結果から
keys – expires = ttlが設定されていないキーの件数
2.TTLが設定されていないキーリスト取得
・コマンド redis-cli keys "*" | while read LINE ; do TTL=`redis-cli ttl $LINE`; if [ $TTL -eq -1 ]; then echo "$LINE"; fi; done; ・スクリプト(redis_extract_not_ttl_keys.sh) #!/bin/sh /usr/local/redis_cluster/src/redis-cli -p $1 -a {password} keys "*" | while read LINE ; do TTL=`/usr/local/redis_cluster/src/redis-cli -p $1 -a {password} ttl $LINE`; if [ $TTL -eq -1 ]; then echo "$LINE"; fi; done; ・実行 ./redis_extract_not_ttl_keys.sh {port} > redis_ttl_{port}.txt
【参考】
50万キーに対して30分程度かかった
サーバSpec
vCPU:2個
Memory : 7.5G
いかがでしたでしょうか。
今回はちょっとした効率化に通じる物でしたが、今後も様々な技術ネタを投稿予定です。
また、今回は上記とは別でRedisに関連したTipsをいくつかおまけとして記載しましたので、
少しでも同じような作業をしようとしている方の参考になれば嬉しいです!
3.(おまけ1)Serialized Sizeを取得
DEBUG OBJECT <key> [Sample] DEBUG OBJECT SAMPLE_KEY Value at:0x7f842414fd90 refcount:1 encoding:skiplist serializedlength:154 lru:10102462 lru_seconds_idle:416
4.(おまけ2)大容量のキー検索
redis-cli --bigkeys Sample & result ------------------------- /usr/local/redis_cluster/src/redis-cli -h {sample-redis-host} -p 7001 --bigkeys # Scanning the entire keyspace to find biggest keys as well as # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec # per 100 SCAN commands (not usually needed). [00.00%] Biggest zset found so far 'SAMPLE_KEY1' with 1 members [00.06%] Biggest zset found so far 'SAMPLE_KEY2' with 100 members [00.09%] Biggest string found so far 'SAMPLE_KEY3' with 13 bytes [00.16%] Biggest hash found so far 'SAMPLE_KEY4' with 110298 fields [00.32%] Biggest hash found so far 'SAMPLE_KEY5' with 125383 fields [00.79%] Biggest zset found so far 'SAMPLE_KEY6' with 250 members [02.38%] Biggest hash found so far 'SAMPLE_KEY7' with 182274 fields [12.72%] Biggest hash found so far 'SAMPLE_KEY8' with 185532 fields [65.06%] Biggest set found so far 'SAMPLE_KEY9' with 1 members -------- summary ------- Sampled 485104 keys in the keyspace! Total key length in bytes is 6480710 (avg len 13.36) Biggest string found 'SUMMARY_KEY1' has 13 bytes Biggest set found 'SUMMARY_KEY2' has 1 members Biggest hash found 'SUMMARY_KEY3' has 185532 fields Biggest zset found 'SUMMARY_KEY4' has 250 members 1947 strings with 25288 bytes (00.40% of keys, avg size 12.99) 0 lists with 0 items (00.00% of keys, avg size 0.00) 1 sets with 1 members (00.00% of keys, avg size 1.00) 296 hashs with 21242315 fields (00.06% of keys, avg size 71764.58) 482860 zsets with 554413 members (99.54% of keys, avg size 1.15)