`

Redis 数据库通知功能的实现

阅读更多
        Reids 数据库通知功能可以让客户端通过订阅给定的频道或者模式,来获知数据库中键的变化,以及数据库中命令的执行情况。
        比如,以下代码展示了客户端如何获取 0 号数据库中针对 message 键执行的所有命令。
redis> SUBSCRIBE __keyspace@0__:message
Reading messages... (press Ctrl-C to quit)

1) "subscribe"                  // 订阅信息
2) "__keyspace@0__:message"
3) (integer) 1

1) "message"                    // 执行 SET 命令
2) "__keyspace@0__:message"
3) "set"

1) "message"                    // 执行 EXPIRE 命令
2) "__keyspace@0__:message"
3) "expire"

        根据发回的通知显示,可见先后共有 SET 和 EXPIRE 两个命令对键 message 进行了操作。
        像这一类关注“某个键执行了什么命令”的通知称为键空间通知(key-space notification),此外,还有另一类称为键事件通知(key-event notification),它们关注的是“某个命令被什么键执行了”。以下代码就是客户端如何获取 0 号数据库中所有执行了 DEL 命令的键的键事件通知的例子。
redis> SUBSCRIBE __keyevent@0__:del
Reading messages... (press Ctrl-C to quit)

1) "subscribe"                 // 订阅信息
2) "__keyevent@0__:del"
3) (integer) 1

1) "message"                   // 键 key 执行了 DEL 命令
2) "__keyevent@0__:del"
3) "key"

1) "message"                   // 键 number 执行了 DEL 命令
2) "__keyevent@0__:del"
3) "number"

        服务器的 notify-keyspace-events 配置选项值决定了服务器所发送通知的类型,如(更多设置可参考 Redis 的官方文档说明):
        (1)值 AKE 表示想让服务器发送所有类型的键空间通知和键事件通知。
        (2)值 AK 表示想让服务器发送所有类型的键空间通知。
        (3)值 AE 表示想让服务器发送所有类型的键事件通知。
        (4)值 KS 表示想让服务器只发送和字符串键有关的键空间通知。
        (5)值 EL 表示想让服务器只发送和列表键有关的键事件通知。
        发送数据库通知的功能是由 notifyKeyspaceEvent 函数实现的,其伪代码实现如下。
def notifyKeyspaceEvent(type, event, key, dbid):
    # 如果给定的通知不是服务器配置允许发送的通知,则直接返回
    if not (server.notify_keyspace_events & type):
        return
    # 发送键空间通知
    if server.notify_keyspace_events & REDIS_NOTIFY_KEYSPACE:
        # 将通知发送给频道“__keyspace@<dbid>__:<key>”
        # 内容为键所发生的事件 <event>
        # 构建频道名字
        chan = "__keyspace@{dbid}__:{key}".format(dbid=dbid, key=key)
        # 发送通知
        pubsubPublishMessage(chan, event)

    # 发送键事件通知
    if server.notify_keyspace_events & REDIS_NOTIFY_KEYEVENT:
        # 将通知发送给频道“__keyevent@<dbid>__:<event>”
        # 内容为发生事件的键 <key>
        # 构建频道名字
        chan = "__keyevent@{dbid}__:{event}".format(dbid=dbid, event=event)
        # 发送通知
        pubsubPublishMessage(chan, key)

        其中的 pubsubPublishMessage 函数就是 PUBLISH 命令的实现函数,订阅数据库通知的客户端收到的信息就是由这个函数发出的,其具体实现细节留待后面再进行介绍。


参考书籍:《Redis 设计与实现》第 9 章——数据库。
分享到:
评论

相关推荐

    Redis数据库

    Redis数据库是一种开源、高速、内存中的数据存储系统,它支持多种数据结构,如字符串、哈希、列表、集合和有序集合。Redis的全称是Remote Dictionary Server,它以键值对的形式存储数据,使得在处理高并发、低延迟...

    redis数据库

    接下来,我们将深入探讨Redis数据库的相关知识点。 一、Redis的数据类型 Redis提供了五种基本数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。每种类型都有其独特的用途: 1...

    redis-unstable_Redis数据库源码_

    以下是对Redis数据库源码的一些核心知识点的详细说明: 1. 数据结构: Redis使用多种自定义的数据结构来存储和操作数据,如字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)...

    超详细Redis数据库入门教程.docx

    有序集合是 Redis 中的一种复杂的数据类型, 有序集合的值可以是多个字符串, 有序集合可以用来实现排名、分数等功能。 Redis 数据结构 – 哈希 哈希是 Redis 中的一种复杂的数据类型,哈希的值可以是多个键值对,...

    Redis数据库百度云02.txt

    根据提供的文件信息:“Redis数据库百度云02.txt”,我们似乎没有具体的文本内容来解析和生成相关的知识点。不过,可以从文件的标题、描述以及可能涉及的主题出发,为您详细地阐述关于Redis数据库的一些基础知识及其...

    redis数据库5.0.7.tar包

    本文将深入探讨Redis数据库5.0.7版本的主要特性和功能。 首先,Redis 5.0.7是Redis的一个稳定版本,包含了自5.0.0以来的一系列改进和修复。这个版本的重点在于增强性能、提升稳定性,并引入了一些新的特性。 1. **...

    redis数据库的设计

    Redis是一款高性能的键值对数据库,它...以上是关于“redis数据库设计”的主要知识点,涵盖了Redis的数据结构、持久化、复制、事务、脚本、发布订阅等核心特性。了解并掌握这些内容,对于使用和优化Redis系统至关重要。

    Redis发布订阅.net实现

    Redis是一种高性能的键值数据库,广泛应用于缓存、消息队列等...总之,Redis的发布订阅机制和键过期通知功能在.NET环境下,通过StackExchange.Redis库可以轻松实现,为分布式系统提供了强大的实时通信和数据管理能力。

    Redis 数据库

    - Pub/Sub:发布/订阅功能允许客户端订阅感兴趣的频道,当有新消息发布到该频道时,所有订阅者都会收到通知。 - 主从复制:通过复制,可以创建多个Redis实例作为主服务器的副本,提高读取性能和容灾能力。 Redis-x...

    Go-Redigo是Redis数据库的Go语言客户端

    Go-Redigo是针对Redis数据库的一个高效且功能丰富的Go语言客户端库,专为Go开发者设计,提供简单易用且性能优异的接口来与Redis进行交互。这个库的强大之处在于它全面支持Redis的所有命令,允许开发者执行各种数据...

    Qt封装Redis接口

    这样,就可以实现实时的多对多通信场景,例如聊天室或通知系统。 在实际应用中,为了保证连接的稳定性和数据的完整性,`QRedis`类可能还会包含重试机制、超时控制以及异常处理等策略。同时,考虑到Qt的异步特性,...

    基于django框架与mysql,redis数据库开发的简单博客.zip

    此外,Redis的发布/订阅功能也可能用于实现消息通知,如新文章发布时通知订阅者。 **项目结构** 从"Blog-master"这个文件名来看,项目的根目录可能是这个名称,这符合Django项目的常规命名习惯。在该目录下,通常会...

    Redis数据库1

    【Redis数据库1】详解 Redis 是一款开源、免费且遵循 BSD 协议的高性能键值存储系统。作为一款内存数据库,Redis 具备快速读写能力,读取速度可达110000次/s,写入速度达81000次/s。其主要特点包括: 1. **持久化*...

    浅谈Redis数据库的键值设计

    【Redis数据库键值设计】 Redis作为一个高性能的键值存储系统,其丰富的数据结构(如字符串、哈希、列表、集合、有序集合等)为开发者提供了极大的灵活性。与关系型数据库不同,Redis允许开发者直接操作数据结构,...

    redis内存数据库2.4.1

    此外,Redis 2.4.1版本还提供了发布/订阅(Publish/Subscribe)功能,这是一个简单的消息传递模型,允许客户端订阅特定主题,当有其他客户端向该主题发布消息时,订阅者会收到通知。这一特性常用于构建实时通信系统...

    redis的设计与实现pdf以及带注释源码

    Redis的pub/sub功能提供轻量级的消息传递,适用于实时消息通知。 8. **HyperLogLog** 用于估算集合中不同元素的数量,空间效率高,适用于大数据量场景。 9. **地理空间索引** 提供GEO命令,支持地理位置信息的...

    C# Redis发布与订阅系统源码

    Redis是一种高性能的键值对数据存储系统,常用于缓存、消息队列和数据库功能。在C#中,我们可以利用StackExchange.Redis库来与Redis进行交互。本项目提供了一个基于C#的Redis发布与订阅(Publish/Subscribe)系统的...

    springboot+websocket+redis实现聊天室

    另一端的用户订阅该队列,一旦有新消息,Redis会立即通知订阅者,从而实现实时同步。 4. **私聊与群聊**: 私聊是指用户之间的一对一通信,群聊则是多用户之间的消息共享。在实现过程中,需要设计合理的数据结构来...

    Redis缓存数据库

    4. **发布/订阅模式**:Redis提供了发布订阅功能,允许客户端订阅特定频道,当有新消息发布到这些频道时,订阅者会收到通知,常用于实现消息队列。 5. **主从复制**:通过主从复制,可以创建多个副本,用于读取负载...

    Redis介绍与内部实现机制

    例如,在实时计数、聊天室、通知系统等场景中,这一功能发挥了关键作用。 在实际使用中,为了优化性能,开发者需要注意一些最佳实践,如合理设置缓存过期策略、避免大Key、控制客户端连接数等。此外,Redis社区提供...

Global site tag (gtag.js) - Google Analytics