最近在开发一个定时活动,而且活动是多个场次的。这个是后就需要在活动开始的时候推送信息给客户端,结束的时候也要推送一次。简单的设计方案就是将配置缓存在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 :=关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?