Redis 实战 —— 09. 实现任务队列、消息拉取和文件分发

任务队列 P133

通过将待执行任务的相关信息放入队列里面,并在之后对队列进行处理,可以推迟执行那些耗时对操作,这种将工作交给任务处理器来执行对做法被称为任务队列 (task queue) 。 P133

先进先出队列 P133

可以 Redis 的列表结构存储任务的相关信息,并使用 RPUSH 将待执行任务的相关信息推入列表右端,使用阻塞版本的弹出命令 BLPOP 从队列中弹出待执行任务的相关信息(因为任务处理器除了执行任务不需要执行其他工作)。 P134

发送任务

// 将任务参数推入指定任务对应的列表右端
func SendTask(conn redis.Conn, queueName string, param string) (bool, error) {
   
	count, err := redis.Int(conn.Do("RPUSH", queueName, param))
	if err != nil {
   
		return false, nil
	}
	// 只有成功推入 1 个才算成功发送
	return count == 1, nil
}

执行任务

// 不断从任务对应的列表中获取任务参数,并执行任务
func RunTask(conn redis.Conn, queueName string, taskHandler func(param string)) {
   
	for ; ; {
   
		result, err := redis.Strings(conn.Do("BLPOP", queueName, 10))
		// 如果成功获取任务信息,则执行任务
		if err != nil && len(result) == 2 {
   
			taskHandler(result[1])
		}
	}
}

以上代码是任务队列与 Redis 交互的通用版本,使用方式简单,只需要将入参信息序列化成字符串传入即可发送一个任务,提供一个处理任务的方法回调即可执行任务。

任务优先级 P136

在此基础上可以讲原有的先进先出任务队列改为具有优先级的任务队列,即高优先级的任务需要在低优先级的任务之前执行。 BLPOP 将弹出第一个非空列表的第一个元素,所以我们只需要将所有任务队列名数组按照优先级降序排序,让任务队列名数组作为 BLPOP 的入参即可实现上述功能(当然这种如果高优先级任务的生成速率大于消费速率,那么低优先级的任务就永远不会执行)。 P136

优先执行高优先级任务

// 不断从任务对应的列表中获取任务参数,并执行任务
// queu
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过Redis消息队列实现秒杀系统控制超买,可以按照以下步骤进行: 1. 使用Redis作为缓存存储秒杀商品的库存信息。每个秒杀商品可以使用一个Redis的key-value对来表示,key为商品ID,value为该商品的库存数量。 2. 在秒杀开始前,将秒杀商品的库存信息预先加载到Redis中。 3. 当有用户进行秒杀时,首先需要从Redis中获取该秒杀商品的库存数量。可以使用Redis的命令如GET或DECR来获取并减少库存数量。 4. 在获取库存数量后,判断库存是否充足。如果库存大于0,则表示可以继续秒杀;如果库存不足或已经为0,则表示秒杀活动已经结束或商品已售罄。 5. 如果库存充足,则可以将用户的秒杀请求加入到消息队列中。可以使用消息队列的生产者将用户的请求消息发送到队列中。 6. 在消息队列的消费者中,对于每个接收到的秒杀请求,需要进行进一步的处理。可以使用分布式锁来保证同一时间只有一个消费者进行处理。 7. 在处理秒杀请求时,可以进行一些限流措施,如设置一个最大处理速度来防止超买。可以使用计数器来记录已处理的请求数量,并根据设定的速度限制进行控制。 8. 在处理完秒杀请求后,需要更新Redis中秒杀商品的库存数量。可以使用Redis的命令如INCR或DECR来增加或减少库存数量。 通过以上步骤,可以实现基于Redis消息队列的秒杀系统,并控制超买情况的发生。同时,需要注意并发操作时的线程安全和数据一致性问题,可以使用分布式锁和事务等机制来保证系统的稳定性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值