golang利用redis实现简单延时队列

redis的zset是一种能自动排序的数据结构,我们可以用这个特性来实现简单的延时队列。

利用zadd将数据添加到zset中,每个数据的score值设置为数据的延时时间+当前时间戳,后台goroutine不断zrange轮询zset,取出score值小于当前时间戳的数据,然后再对数据进一步处理,这样就实现了简单延时队列的功能。

  • Zadd

zadd支持批量添加的功能,有需要可以自己去探索下,这里我们先提供添加一个元素的方法

import "github.com/garyburd/redigo/redis"

func AddZset(data, zsetName string, score int64) (err error) {
	con := pool.Get()
	defer con.Close()
	_, err = con.Do("zadd", zsetName, score, data)
	if err != nil {
		return
	}
	return
}
  • Zrange

zrange按照score值从小到大遍历zset,提供start和end两个下标参数,都以0为底。下标超出范围不会出错。start=0,end=1表示遍历前2个元素,end=-1表示最后一个元素。

可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。

我们可以每次取几个数据,判断当前时间戳与数据对应score的大小关系,并决定是否处理这些数据。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值