您当前的位置: 首页 >  redis

Linux小百科

暂无认证

  • 0浏览

    0关注

    1185博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

大神教你实现redis键空间通知

Linux小百科 发布时间:2021-09-16 09:28:51 ,浏览量:0

最近在开发一个定时活动,而且活动是多个场次的。这个是后就需要在活动开始的时候推送信息给客户端,结束的时候也要推送一次。简单的设计方案就是将配置缓存在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",
   })
}
 
/*
 * 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 :=             
关注
打赏
1665632672
查看更多评论
立即登录/注册

微信扫码登录

0.0757s