56 lines
1.3 KiB
Markdown
56 lines
1.3 KiB
Markdown
|
|
---
|
||
|
|
title: Set TTL on Cache Keys
|
||
|
|
impact: HIGH
|
||
|
|
impactDescription: Prevents unbounded memory growth
|
||
|
|
tags: ttl, expiration, cache, memory
|
||
|
|
description: Set TTL on Cache Keys
|
||
|
|
alwaysApply: true
|
||
|
|
---
|
||
|
|
|
||
|
|
## Set TTL on Cache Keys
|
||
|
|
|
||
|
|
Always set expiration times on cache keys to prevent unbounded memory growth.
|
||
|
|
|
||
|
|
**Correct:** Set TTL at write time.
|
||
|
|
|
||
|
|
**Python** (redis-py):
|
||
|
|
```python
|
||
|
|
# Good: TTL set atomically with the value
|
||
|
|
redis.setex("cache:user:1001", 3600, user_json)
|
||
|
|
|
||
|
|
# Good: For hashes, set TTL after
|
||
|
|
redis.hset("session:abc", mapping=session_data)
|
||
|
|
redis.expire("session:abc", 1800)
|
||
|
|
```
|
||
|
|
|
||
|
|
**Java** (Jedis):
|
||
|
|
```java
|
||
|
|
import redis.clients.jedis.params.SetParams;
|
||
|
|
|
||
|
|
// Good: TTL set atomically with SetParams
|
||
|
|
jedis.set("cachedItem:1", "fe8c357903ac9", new SetParams().ex(120));
|
||
|
|
```
|
||
|
|
|
||
|
|
**Incorrect:** Forgetting TTL on cache keys.
|
||
|
|
|
||
|
|
**Python** (redis-py):
|
||
|
|
```python
|
||
|
|
# Risk: This key may live forever
|
||
|
|
redis.set("cache:user:1001", user_json)
|
||
|
|
```
|
||
|
|
|
||
|
|
**Java** (Jedis):
|
||
|
|
```java
|
||
|
|
// Risk: This key may live forever
|
||
|
|
jedis.set("cachedItem:1", "fe8c357903ac9");
|
||
|
|
```
|
||
|
|
|
||
|
|
**TTL strategies:**
|
||
|
|
- Cache data: 1-24 hours depending on freshness requirements
|
||
|
|
- Sessions: 30 minutes to 24 hours
|
||
|
|
- Rate limiting: Seconds to minutes
|
||
|
|
- Temporary locks: Seconds with automatic release
|
||
|
|
|
||
|
|
Reference: [Redis EXPIRE](https://redis.io/commands/expire/)
|
||
|
|
|