键空间
2025年2月18日大约 3 分钟
键空间概念
Redis 是一个键值对数据库服务器,服务器中每个数据库都由 redisDB 结构表示(默认16个库)。其中,RedisDB 结构的 dict 字典保存了数据库中所有的键值对,这个字典被称为键空间(key space)。而 0~15 共 16 个库,都分别有各自的键空间(key space)
对数据库库执行的 get、set、... 等命令都是通过对键空间的字典进行操作来实现的
键空间通知
根据 键空间概念 的描述,对 Redis 操作的命令最终都会落实到数据库里的键空间字典上。而数据变更,发生在这个键空间(Key Space)时,Redis基于 发布订阅(Pub/Sub) 能够对一些基本的事件进行通知。几乎所有 Redis 产生数据变更的命令,均可订阅
客户端可以通过订阅的方式来接受通过键空间通知发送出来的相关 Redis 数据集事件。目前 Redis 的 Pub/Sub 功能采取的是发送即忘策略,如果程序对这通知的可靠性很强的话那么键空间通知并不适合
- 每当一个键因为过期而被删除时,产生一个 expired 通知
- 每当一个键因为 maxmemory 政策而被删除以回收内存时,产生一个 evicted 通知
所有命令都只在键真的被改动了之后,才会产生通知
过期通知的发送时间
过期通知(expired)的触发时机是键被实际删除时,而非 过期时间(TTL) 归零时。对于未被访问且未被后台扫描到的键,通知延迟可能长达数秒甚至更久(过期字典中的键越多周期越长)
而触发删除通知有两种方式:
- 当一个键被访问时,程序会去判断这个键是否过期。如果过期则删除
- Redis 定期的去数据库中随机抽取一些键来判断(默认每秒进行 10 次扫描,每次从过期字典中随机抽取 20 个键,删除其中过期的,如果超过 25% 过期,会继续抽取),如果过期则删除
开启通知配置
有两种方式:
修改配置文件
一般默认为 redis.conf 文件,所以修改它即可
- 当
notify-keyspace-events
选项的参数为空字符串(""
)时,功能关闭 - 另一方面,当参数不是空字符串时,功能开启

至于字符的组合方案从 配置字符 查看
命令行
获取当前字符方案:
CONFIG GET notify-keyspace-events
修改字符方案:
CONFIG SET notify-keyspace-events [字符]
配置字符
字符 | 通知 |
---|---|
K | 键空间通知,所有通知以 __keyspace@<db index>__ 为前缀 |
E | 键事件通知,所有通知以 __keyevent@<db index>__ 为前缀 |
g | DEL、EXPLRE、RENAME 等类型无关的通用命令通知 |
$ | 字符串命令通知 |
l | 列表命令通知 |
s | 集合命令通知 |
h | 哈希命令通知 |
z | 有序礼集合命令通知 |
x | 过期(expired)事件:每当有过期键被删除时发送 |
e | 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送 |
A | 参数 g$lshzxe 的别名(全部事件All) |