RedisからTTL(Expire)設定されていないKeyの一覧を取得する

TTLが設定されていないキーの一覧を取得する方法です。

以下で言えば、keys=6328703expires=6328701 の差分の2件を知りたい場合です。

$ redis-cli info keyspace
# Keyspace
db0:keys=6328703,expires=6328701,avg_ttl=9169857

bashで実装

少量のデータなら以下で一気に取得可能です。

Finding non-expiring keys in Redis - Stack Overflow

redis-cli keys  "*" | while read LINE ; do TTL=`redis-cli ttl $LINE`; if [ $TTL -eq  -1 ]; then echo "$LINE"; fi; done;

ただし大量のデータになるとエラーが出たりします。一回ファイルに出力したり調整が必要です。

Luaで実装

バージョン2.6くらいからLuaスクリプティング機能が実装されました。これを使う手もあります。こちらの方が速度早いと思います。

redis-cliから実行する方法

127.0.0.1:6379> eval "local t = {} local i = 1 for _,v in ipairs(redis.call('KEYS', '*')) do if redis.call('TTL',v) == -1 then t[i] = v i = i + 1 end end return t" 0

Luaスクリプトファイルを使って実行する方法

redis-cli --eval find.lua > output.txt
local t = {} 
local i = 1 
for _,v in ipairs(redis.call('KEYS', '*')) 
do 
  if redis.call('TTL',v) == -1 then
    t[i] = v 
    i = i + 1
  end
end 
return t

参考URL

RedisのLuaスクリプティング機能について « Rest Term

http://densan-labs.net/_downloads/lua.pdf