こんにちは!今回は、開発者が毎日の開発作業中に遭遇した課題と、それを解決した方法についてのご紹介です!(シリーズ化予定)
同様の課題に直面されている方の参考になれば嬉しいですし、そうでない方もココネ開発の雰囲気を少しでも感じて頂けたら嬉しいです。

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)