Skip to content

键空间概念

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 选项的参数为空字符串("")时,功能关闭
  • 另一方面,当参数不是空字符串时,功能开启

image-20250218144146675

至于字符的组合方案从 配置字符 查看

命令行

获取当前字符方案:

bash
CONFIG GET notify-keyspace-events

修改字符方案:

bash
CONFIG SET notify-keyspace-events [字符]

配置字符

字符通知
K键空间通知,所有通知以 __keyspace@<db index>__ 为前缀
E键事件通知,所有通知以 __keyevent@<db index>__ 为前缀
gDEL、EXPLRE、RENAME 等类型无关的通用命令通知
$字符串命令通知
l列表命令通知
s集合命令通知
h哈希命令通知
z有序礼集合命令通知
x过期(expired)事件:每当有过期键被删除时发送
e驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送
A参数 g$lshzxe 的别名(全部事件All)