Help us shape the future of Go! Take the 2026 Go Developer Survey

redis

package module
v0.2.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 29, 2026 License: MIT Imports: 18 Imported by: 0

Documentation

Overview

Package redis 提供基于 Redis ZSet 的分布式延迟任务后端。

本包是独立 module(module path:github.com/oekit/timertask/redis), 与父模块 github.com/oekit/timertask 分开演进:

  • 父模块(根包)只保留通用类型与本地内存后端 LocalBackend, 依赖面里没有 redis——纯 Go 嵌入式服务形态(CGO_ENABLED=0 静态链接、 SQLite 落盘、零外部中间件)可以直接用;
  • 本模块承载 Redis 形态(分片管理、心跳、可靠投递), 显式引入才会把 go-redis 拉进依赖面。

迁移路径(破坏性变更)

Redis 后端原在根包 timertask 内,本次拆分后从根包迁出:

// 旧:import "github.com/oekit/timertask"
//     b := timertask.NewRedisBackend("order", client, handler)
// 新:import "github.com/oekit/timertask/redis"
//     b := redis.NewRedisBackend("order", client, handler)

其余符号对照:

根包 timertask.NewRedisBackend      → redis.NewRedisBackend
根包 timertask.RedisBackend         → redis.RedisBackend
根包 timertask.NewShardManager      → redis.NewShardManager
根包 timertask.ShardManager         → redis.ShardManager

选项函数仍留在根包(写法不变,只是包路径不同):

redis.NewRedisBackend("order", client, handler, timertask.WithBuckets(64))

任务类型也仍在根包:

func handler(ctx context.Context, task *timertask.Task) error { ... }

消费语义

支持两种投递模式(timertask.WithDeliveryMode / timertask.WithAtLeastOnce):

  • DeliveryAtMostOnce(默认,与历史行为一致):消费流程先通过 Lua 脚本 原子删除 ZSet 中的任务条目,再推入本地 worker 队列处理。进程在删除后、 处理前崩溃,任务永久丢失。应用层需自行保证幂等性。
  • DeliveryAtLeastOnce(可靠模式):claim 时把条目移入 processing 租约集 (score=租约到期),handler 成功后 Ack 删除;租约超时由回扫按 RetryCount 重投。kill -9 后未 Ack 任务会在 visibility timeout 后被重投(可容忍重复, 由调用方幂等)。

兜底路径:

  • 优雅停机(ctx 取消)时,本地队列中尚未处理的任务会回灌 Redis, 重启后继续消费;
  • 重试耗尽的任务会写入持久死信 ZSet({timertask.<buzType>}.dead, score 为失败时间戳,默认保留最近 10000 条);WithOnFailure 回调 只是死信之外的进程内通知手段,不构成持久化。

哪种任务选哪种模式:

  • 提醒/审计/计费等不可丢事件 → DeliveryAtLeastOnce + 调用方幂等;
  • 可丢弃的指标/通知/缓存预热 → DeliveryAtMostOnce(更省 Redis 往返)。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type RedisBackend

type RedisBackend struct {
	// contains filtered or unexported fields
}

RedisBackend 是基于 Redis ZSet 的分布式延迟任务实现。

func NewRedisBackend

func NewRedisBackend(buzType string, client goredis.UniversalClient, handler timertask.Handler, opts ...timertask.TimerTaskOption) *RedisBackend

NewRedisBackend 创建基于 Redis 的延迟任务后端。

  • buzType: 业务类型标识(区分不同业务的任务)
  • client: Redis 客户端(支持单机和集群)
  • handler: 任务处理函数

func (*RedisBackend) LocalPendingCount

func (b *RedisBackend) LocalPendingCount() int

LocalPendingCount 返回本地队列中待处理任务数。

func (*RedisBackend) PendingCount

func (b *RedisBackend) PendingCount(ctx context.Context) (int64, error)

PendingCount 返回队列中待处理任务数(所有分片的 ZSet 大小之和)。

func (*RedisBackend) Send

func (b *RedisBackend) Send(ctx context.Context, task *timertask.Task) error

Send 提交一个延迟任务。 task.EndTime(Unix 秒)决定任务何时被执行。

func (*RedisBackend) Start

func (b *RedisBackend) Start(ctx context.Context) error

Start 启动任务消费(阻塞)。 ctx 取消时所有 goroutine 退出。

type ShardManager

type ShardManager struct {
	// contains filtered or unexported fields
}

ShardManager 分片管理器。 负责心跳注册、一致性哈希分配分片。

func NewShardManager

func NewShardManager(buzType string, client goredis.UniversalClient, totalShards int) *ShardManager

NewShardManager 创建分片管理器。

func (*ShardManager) GetClientID

func (s *ShardManager) GetClientID() string

GetClientID 获取客户端 ID。

func (*ShardManager) GetMyShards

func (s *ShardManager) GetMyShards() []int

GetMyShards 获取当前负责的分片列表。

func (*ShardManager) StartAssign

func (s *ShardManager) StartAssign(ctx context.Context)

StartAssign 启动分片分配。

func (*ShardManager) StartHeartbeat

func (s *ShardManager) StartHeartbeat(ctx context.Context)

StartHeartbeat 启动心跳注册。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL