# Key 过期策略

URL: https://caijiao.org/redis/05-advanced/04-expire
Source: docs/redis/05-advanced/04-expire.md
Description: Redis 提供多种 key 过期策略，确保在数据不再需要时及时清理内存，避免内存泄漏，并支持多种失效模式和清理机制。

Redis 提供了多种方式来处理键的过期情况，确保在数据不再需要时能够及时删除，从而优化内存使用。过期策略决定了 Redis 如何管理和清理过期键。

## 设置过期时间

可以使用 `EXPIRE` 命令为键设置过期时间，过期时间单位为秒：

```bash
EXPIRE key seconds
```

- 例如，将 `mykey` 的过期时间设置为 60 秒：

```bash
EXPIRE mykey 60
```

也可以使用其他命令设置过期时间：

- **TTL**：查看键的剩余过期时间（秒）

```bash
TTL key
```

- **PERSIST**：移除键的过期时间，使键永不过期

```bash
PERSIST key
```

- **EXPIREAT**：指定具体的过期时间（UNIX 时间戳）

```bash
EXPIREAT key timestamp
```

## 过期策略

Redis 采用了三种主要的过期策略来清理过期的键：

### 1. 定时删除（主动过期）

Redis 会在每次访问数据库时检查键是否过期，并在键过期时立即删除。这是一个比较轻量的方式。

### 2. 惰性删除（延迟过期）

当 Redis 访问一个键时，如果该键已过期，会在访问时删除该键。惰性删除并不会遍历所有的键，而是仅在访问到某个键时检查其是否过期。

### 3. 定期删除（周期性过期）

Redis 会定期扫描一部分键，检查它们是否过期，并将过期的键删除。这个过程会在后台线程中执行，不会影响主线程的性能。

## 配置过期策略

在 `redis.conf` 文件中，可以配置 Redis 执行定期过期检查的频率：

```txt
# 每 10 秒钟扫描一次过期键，扫描 10 个键
hz 10
```

`hz` 选项控制了 Redis 扫描过期键的频率，默认为 10，这意味着 Redis 每 10 毫秒会进行一次扫描。

## 过期键的清理机制

- **懒删除**：惰性删除机制，只有在客户端访问过期键时，Redis 才会删除该键。
- **定期删除**：周期性地扫描部分键并删除过期的键，防止内存溢出。
- **过期精度**：由于过期时间是通过精确到秒来控制的，Redis 允许过期时间的精度误差为 1 秒。

## 使用场景

- **缓存**：用于定期清理不再需要的数据，避免内存占用过大。
- **会话管理**：比如用户登录的 session 会在一定时间后过期。
- **临时数据存储**：需要在短期内存储的数据，使用过期时间确保不再需要时自动删除。

## 注意事项

- **内存管理**：过期策略有助于控制内存占用，但在高负载场景下，定期删除和惰性删除可能会引起一定的性能影响。
- **精确性**：由于 Redis 使用秒级过期时间，过期时间的精度可能不是特别精确（最大误差为 1 秒）。
- **无过期键**：如果设置了过期时间后键没有过期，Redis 不会自动删除这些键，因此需要手动管理过期键的清理。

通过合理配置 Redis 的过期策略，能够高效管理内存和处理不再需要的数据，保证系统的性能和稳定性。
