Redis TTL Converter

Paste TTL values, either bare numbers or durations like 3d, and get milliseconds, seconds, a human reading and the commands that set them. The two sentinel replies are called out rather than converted.

TTL returns seconds, PTTL returns milliseconds. A duration like 3d or 90m is understood whichever is selected.

Paste below, or drop a file anywhere on this panel

Or drop a file anywhere on this panel. Nothing is uploaded: the analysis runs in this tab.

The answer appears here

Paste on the left and press Convert. Nothing leaves this tab.

Examples

Real input you can load into the tool above. Each one shows a different thing going wrong, because that is what the tool is for.

The two sentinels

-1 and -2 are replies, not durations, and mean very different things

3600
-1
-2

Human durations

A duration converted to the EXPIRE and PEXPIRE calls that set it

3d
90m
12h

Common mistakes

These are the ones that fail silently. The config is accepted, nothing raises an error, and the consequence arrives later.

  1. Treating -1 and -2 as durations

    They are sentinels. -1 means the key exists with no expiry and -2 means it does not exist, so a dashboard averaging TTLs quietly folds negative numbers into the mean.

    Instead:Filter them out and count them separately. They answer a different question from a remaining lifetime.

  2. Refreshing a value with a plain SET

    SET clears an existing expiry. A refresh path written this way silently makes keys permanent, which shows up as a cache that stops evicting and grows.

    Instead:SET ... KEEPTTL to preserve it, or SET ... EX to set both atomically.

  3. Setting the key and its expiry in two commands

    If the process dies between them the key exists with no TTL, forever. It is also two round trips.

    Instead:SET key value EX seconds does both atomically in one call.

TTL answers three different questions with one number

A positive reply is a remaining lifetime. The two negative replies are not lifetimes at all, and treating them as numbers is how a monitoring dashboard ends up with a negative average TTL.

-1 means the key exists and will never expire

Usually this is intentional. When it is not, the cause is almost always a plain SET: SET overwrites a key's expiry, so a code path that refreshes a value with SET rather than SET ... KEEPTTL silently makes it permanent. PERSIST does the same thing deliberately.

-2 means the key does not exist

It may have expired, it may have been evicted under maxmemory pressure, or it may never have been written. TTL cannot distinguish those, and neither can EXISTS. Eviction and expiry look identical from the outside, which is why an unexplained -2 usually needs the INFO stats for evicted_keys and expired_keys to resolve.

EXPIRE takes whole seconds

Sub-second lifetimes need PEXPIRE. EXPIRE rounds, so a value under a second becomes zero or one rather than what you meant. Setting a key and its expiry in one call with SET key value EX or PX is both fewer round trips and atomic, which matters because a SET followed by a separate EXPIRE can leave a permanent key if the process dies between them.

Expiry is lazy plus sampled

A key with a past expiry is not deleted at that instant. Redis removes it when something touches it, and separately samples random keys twenty times a second to expire a fraction of those found dead. So a key can be logically gone while still occupying memory, which is why memory does not drop the moment a large batch of TTLs passes.

What this cannot see

It converts numbers. It does not know when a key was written, so it cannot tell you the absolute time a key expires, and it cannot tell you whether a TTL you are about to set is longer than the key will survive under your eviction policy.

More redis tools

Redis Hash Slot Calculator Which of the 16,384 slots does this key land in? Redis Hash Tag Tester Will these keys survive a multi-key command? Redis RESP Protocol Decoder Read what the server actually sent Redis RESP2 vs RESP3 Reply Decoder What the same reply looks like on each protocol Redis Command to RESP Exactly what your client puts on the socket Redis Glob Pattern Tester Redis globs are not shell globs Redis Connection URL Parser The path is the database number Redis Memory Unit Converter 1g and 1gb are not the same number Redis Stream ID Parser The first half is a millisecond timestamp redis.conf Validator Will Redis start with this file? Redis Production Config Linter The settings that cause incidents redis.conf to CONFIG SET Which of these can you change without a restart? Redis ACL Rule Decoder What does this user actually get? Redis ACL Validator Find the rule that does nothing Redis INFO Analyzer The numbers INFO does not print Redis SLOWLOG Analyzer What blocked everyone else Redis CLUSTER NODES Parser Read the topology, and find the gap Redis Cluster Slot Distribution Who owns how much, and what is missing Redis Keyspace Notification Flags Why your events never arrive Redis Memory Calculator The encoding decides, not the data Redis Key Count to Memory The fixed cost per key Redis Encoding Threshold Calculator One field more, several times the memory Redis Bitmap Memory Calculator Sized by the highest bit, not the set ones Redis HyperLogLog Calculator 12 KB whether you count a thousand or a billion Redis Cluster Sizing Only 60% of each node is usable Redis RDB and AOF Size Calculator The fork needs memory, not disk Redis Replication Bandwidth Calculator How long the backlog actually covers Redis Connection Pool Calculator More connections is not more throughput Redis Pipeline Calculator It removes round trips, not work Redis Cache Hit Rate Calculator 99% to 90% is ten times the backend load Redis Eviction Policy Simulator volatile- with no TTLs is noeviction Redis Cost Estimator Your rates, so nothing goes stale Redis Config File Generator A redis.conf with the reasons in it Redis ACL Generator A user that can do exactly one job Redis Maxmemory Config Generator The limit, and the headroom it needs Redis Persistence Config Generator How much you can afford to lose Redis Lua Script Generator Atomic, and short enough to stay that way Redis TLS Config Generator Encrypted, and the old port actually closed Redis Sentinel Config Generator Failover that can actually be authorised Redis Cluster Config Generator Three primaries, and the bus port open Redis Docker Compose Generator Local Redis that is not on the internet Redis Client Config Generator Timeouts on both sides, and a sane pool Redis MEMORY STATS Analyzer Which number actually matters Redis Bigkeys Output Analyzer Elements are not bytes Redis CLIENT LIST Analyzer Find the connection hurting you Redis LATENCY Report Analyzer An empty report may mean nothing was recorded Redis Keyspace Prefix Analyzer Which key family is growing Redis SET Command Builder A plain SET clears the TTL Redis ZRANGE Query Builder REV reverses the argument order Redis SCAN Iteration Planner COUNT is a hint, not a page size Redis Key Name Validator Legal is not the same as workable Redis Cluster Compatibility Checker Works now, breaks when you shard

Elsewhere on the site