温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

redis键空间通知的使用实现

发布时间:2021-08-31 19:53:24 来源:亿速云 阅读:103 作者:chen 栏目:开发技术

这篇文章主要介绍“redis键空间通知的使用实现”,在日常操作中,相信很多人在redis键空间通知的使用实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”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",
   })
}

/*
 * redis key 过期自动通知
 */
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)
}

代码结果输出如下:

redis键空间通知的使用实现

上面代码实现逻辑很简单,核心逻辑就是订阅__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键空间通知的使用实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI