iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >redis键空间通知使用实现
  • 309
分享到

redis键空间通知使用实现

2024-04-02 19:04:59 309人浏览 薄情痞子
摘要

目录导语实现在业务中使用总结导语 最近在开发一个定时活动,而且活动是多个场次的。这个是后就需要在活动开始的时候推送信息给客户端,结束的时候也要推送一次。简单的设计方案就是将配置缓存

导语

最近在开发一个定时活动,而且活动是多个场次的。这个是后就需要在活动开始的时候推送信息给客户端,结束的时候也要推送一次。简单的设计方案就是将配置缓存Redis,然后每隔一秒就轮询reids,获取配置信息,然后判断是不是到活动开始或者结束的时间点,然后推送给客户端。

但是,这里会有一个问题,如果没有到活动开始或结束的时间点,这里会造成很多无用的轮询操作。这个操作不但增大了对这个key的访问量,同时也会占用cpu,降低机器性能。

redis在2.8.0版本提供了一个键空间通知功能机制,对于这个功能的详细描述,可以查阅官方文档。简单总结就是,客户端可以订阅一个key,当这个可以发生改变时,redis会通知到已经订阅的客户端。

实现

这个实现也很简单,我们可以通过一个demo来看看如何使用这个机制。


package main

import (
   "context"
   "fmt"
   "GitHub.com/Go-redis/redis/v8"
   "time"
)

var redisCli *redis.Client

func init() {
   // 连接redis
   redisCli = redis.NewClient(&redis.Options{
      Addr:     "127.0.0.1:6379",
      PassWord: "redis123",
   })
}


func SetExpireEvent() {
   // 设置一个键,并且3秒钟之后过期
   redisCli.Set(context.Background(), "test_expire_event_notify", "测试键值过期通知", 3*time.Second)
}

func SubExpireEvent() {
   // 订阅key过期事件
   sub := redisCli2.Subscribe(context.Background(), "__keyevent@0__:expired")
   
   // 这里通过一个for循环监听redis-server发来的消息。
   // 当客户端接收到redis-server发送的事件通知时,
   // 客户端会通过一个channel告知我们。我们再根据
   // msg的channel字段来判断是不是我们期望收到的消息,
   // 然后再进行业务处理。
   for {
      msg := <-sub.Channel()
      fmt.Println("Channel ", msg.Channel)
      fmt.Println("pattern ", msg.Pattern)
      fmt.Println("pattern ", msg.Payload)
      fmt.Println("PayloadSlice ", msg.PayloadSlice)
   }
}

func main() {
   SetExpireEvent()
   go SubExpireEvent()
   
   // 这里sleep是为了防止main方法直接推出
   time.Sleep(10 * time.Second)
}

代码结果输出如下:

上面代码实现逻辑很简单,核心逻辑就是订阅__keyevent@0__:expired这个事件,然后一个循环等待事件的通知。值得注意的是,要启用这个特性需要修改配置文件,启用notify-keyspace-events这个配置,可以参考配置文件中的注释对不同事件进行启用。

在业务中使用

回到开始提及的业务场景,如何在这种场景中使用redis的机制呢?其实很简单,当活动配置到数据库之后,会有一个更新缓存的步骤。在将数据设置在活动缓存时,只要我们计算当前时间到活动开始/结束这个时间差,将这个差作为键的过期时间。

例如,活动id1的开始时间为t0, 结束时间为t2, 当前时间为t。这个时候就可以这么设置:


// 活动开始的key设置
redisCli.Set(context.Background(), "id1:start", "活动开始了", t0 - t)
// 活动结束结束的key设置
redisCli.Set(context.Background(), "id1:start", "活动开始了", t1 - t)

通过这么设置,当活动开启/结束就可以接收到相应的通知了。

总结

这种方案其实可以完全满足文中的需求场景,但是这种方案其实也存在一些问题。其实这些问题在redis文档中也有相应说明。

  • 第一,redis-server在推送这个事件通知时,只要订阅了这个事件的客户端端都会收到这个消息。通常,我们的业务都是跑在多个结点中,所以这个时候就要根据场景看要不要进行业务的原子操作。
  • 第二,redis-server只会推送一次这个通知。假如说在redis-server推送这个通知时,结点挂了或者由于其他异常情况没有收到消息,redis-server不会再重新推送。
  • 第三,通知可能会延迟。由于redis实现机制,对于过期的键,会有两种机制进行处理,一种是当命令访问键时,发现键已过期。另一种是通过后台系统在后台逐步查找过期的键,以便能够收集那些从未被访问的键。所以会有出现延迟的可能。

本文介绍了使用redis的键空间通知机制来实现了一种业务场景,当然这种方式并不是最好的,还有其他方式来实现。在实际开发中会有很多的因素要考虑,而且实现方式也是多种多样,这个就需要我们分析每一种方案的利弊,然后进行抉择。

到此这篇关于redis键空间通知使用实现的文章就介绍到这了,更多相关redis键空间通知 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: redis键空间通知使用实现

本文链接: https://www.lsjlt.com/news/134149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作