# 事件通知机制

URL: https://caijiao.org/redis/05-advanced/05-notify
Source: docs/redis/05-advanced/05-notify.md
Description: Redis 事件通知机制允许用户监听数据库中键的变化，如键的过期、删除等操作。通过发布通知，系统可以及时处理这些变更。

Redis 事件通知机制允许客户端订阅并监听 Redis 中某些操作的变化，如键的过期、删除等。这种机制适用于需要实时响应数据变动的场景，如缓存清理、数据同步等。

## 启用事件通知

要启用事件通知，首先需要在 `redis.conf` 配置文件中进行配置：

```txt
notify-keyspace-events Ex
```

`notify-keyspace-events` 配置项控制 Redis 发送哪些事件通知，参数组合如下：

- **E**：键过期事件（expire）
- **x**：键删除事件（del）
- **g**：所有生成的事件（generic）
- **\$**：字符串事件（string）
- **l**：列表事件（list）
- **s**：集合事件（set）
- **h**：哈希事件（hash）
- **z**：有序集合事件（zset）

例如，`notify-keyspace-events Ex` 表示启用键过期和键删除的事件通知。

## 事件类型

Redis 支持多种类型的事件通知：

### 1. 键过期（Expired）

当键的过期时间到达时，Redis 会发布过期事件通知。订阅者可以接收到相应的事件。

- 事件名称：`__keyevent@0__:expired`
- 例子：

  ```bash
  PSUBSCRIBE __keyevent@0__:expired
  ```

### 2. 键删除（Deleted）

当 Redis 删除某个键时（如通过 `DEL` 命令），也会发布删除事件通知。

- 事件名称：`__keyevent@0__:del`
- 例子：

  ```bash
  PSUBSCRIBE __keyevent@0__:del
  ```

### 3. 键变更（Set, Hash, List, etc.）

Redis 还会发布其他类型的数据结构的变化事件。例如，修改了哈希表（`HSET`）、集合（`SADD`）等，会触发对应的事件通知。

- 事件名称：`__keyevent@0__:set`, `__keyevent@0__:hset`, `__keyevent@0__:sadd` 等。

### 4. 过期通知

Redis 提供一个特殊的通知，当某个键过期时，会生成一个过期通知事件。

- 事件名称：`__keyevent@0__:expired`
- 例子：

  ```bash
  PSUBSCRIBE __keyevent@0__:expired
  ```

## 发布和订阅（Pub/Sub）

Redis 通过发布/订阅（Pub/Sub）机制来广播事件通知。客户端通过订阅特定频道来接收通知：

- **PSUBSCRIBE**：通过模式订阅，可以监听特定类型的事件。

  ```bash
  PSUBSCRIBE __keyevent@0__:*
  ```

- **SUBSCRIBE**：订阅具体的键空间事件，如键过期、键删除等。

  ```bash
  SUBSCRIBE __keyevent@0__:expired
  ```

## 应用场景

Redis 的事件通知机制非常适用于以下场景：

- **缓存清理**：当某些缓存键过期或被删除时，通知相关系统进行缓存清理。
- **数据同步**：当数据发生变化时（如删除或更新），可以通过事件通知机制触发数据同步。
- **日志记录**：实时记录 Redis 中的操作，尤其是数据变动，方便审计和分析。
- **系统监控**：监控 Redis 中的 key 变动事件，及时发现潜在问题。

## 注意事项

- **性能影响**：启用事件通知可能会对 Redis 性能产生影响，尤其是在事件量较大时。需要根据系统的实际负载来谨慎配置。
- **事件丢失**：如果客户端在订阅事件时与 Redis 服务器失去连接，某些事件通知可能会丢失。因此，需要确保客户端的连接稳定。
- **消息可靠性**：Redis 的事件通知是基于 Pub/Sub 实现的，具有消息不持久化的特点，一旦消息发送后客户端未接收到消息则丢失。

通过合理配置 Redis 事件通知机制，能够实时响应数据变化，提高系统的灵活性和扩展性。
