TTLが設定されていないキーの一覧を取得する方法です。
以下で言えば、keys=6328703
と expires=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