From 0a8589d7b6b3212ffb78b166c161f0298addeee9 Mon Sep 17 00:00:00 2001 From: Yun Date: Wed, 17 Sep 2025 19:41:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=80=E4=BA=9Boption?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lockx_test.go | 64 +++++++++++++++++++++++++-------------------------- options.go | 21 ++++++++++++++--- 2 files changed, 50 insertions(+), 35 deletions(-) diff --git a/lockx_test.go b/lockx_test.go index f69109d..7731d40 100644 --- a/lockx_test.go +++ b/lockx_test.go @@ -31,43 +31,43 @@ var Redis *redis.Client // Redis = client // } -func TestLockx(t *testing.T) { - client := redis.NewClient(&redis.Options{ - Addr: "127.0.0.1" + ":" + "6379", - Password: "123456", // no password set - DB: 0, // use default DB - }) - if client == nil { - fmt.Println("redis init error") - return - } - fmt.Println("begin") - ctx := context.Background() - ctx, cancel := context.WithCancel(ctx) - defer cancel() +// func TestLockx(t *testing.T) { +// client := redis.NewClient(&redis.Options{ +// Addr: "127.0.0.1" + ":" + "6379", +// Password: "123456", // no password set +// DB: 0, // use default DB +// }) +// if client == nil { +// fmt.Println("redis init error") +// return +// } +// fmt.Println("begin") +// ctx := context.Background() +// ctx, cancel := context.WithCancel(ctx) +// defer cancel() - wg := sync.WaitGroup{} +// wg := sync.WaitGroup{} - for i := 0; i < 20; i++ { - wg.Add(1) - go func(i int) { - defer wg.Done() - lock, _ := lockx.NewGlobalLock(ctx, client, "lockx:test") - if b, _ := lock.Lock(); !b { - fmt.Println("lock error", i) - return - } - defer lock.Unlock() +// for i := 0; i < 20; i++ { +// wg.Add(1) +// go func(i int) { +// defer wg.Done() +// lock, _ := lockx.NewGlobalLock(ctx, client, "lockx:test") +// if b, _ := lock.Lock(); !b { +// fmt.Println("lock error", i) +// return +// } +// defer lock.Unlock() - fmt.Println("ssss2", i) +// fmt.Println("ssss2", i) - time.Sleep(time.Second * 2) - }(i) - time.Sleep(time.Second) - } +// time.Sleep(time.Second * 2) +// }(i) +// time.Sleep(time.Second) +// } - wg.Wait() -} +// wg.Wait() +// } // MockLogger 用于测试的模拟日志器 type MockLogger struct { diff --git a/options.go b/options.go index e39d43a..6d71419 100644 --- a/options.go +++ b/options.go @@ -7,12 +7,15 @@ import ( ) type option struct { - lockTimeout time.Duration // 锁的超时时间 - Expiry time.Duration // 单次刷新有效时间 + lockTimeout time.Duration // 锁的超时时间 + MaxRetryTimes int // 尝试次数 RetryInterval time.Duration // 尝试间隔 + + Expiry time.Duration // 单次刷新有效时间 RefreshPeriod time.Duration // 刷新间隔 - logger Logger // 日志 + + logger Logger // 日志 } func defaultOption() *option { @@ -35,36 +38,48 @@ func InitOption(opts ...Option) { type Option func(*option) +// 最大锁定时间(默认1h) func WithLockTimeout(t time.Duration) Option { return func(o *option) { o.lockTimeout = t } } +// 日志 func WithLogger(logger Logger) Option { return func(o *option) { o.logger = logger } } +// key有效时间(会自动刷新) func WithExpiry(expiry time.Duration) Option { return func(o *option) { o.Expiry = expiry + if o.Expiry/3 < o.RefreshPeriod { + o.RefreshPeriod = o.Expiry / 3 + } } } +// 刷新间隔 func WithRefreshPeriod(period time.Duration) Option { return func(o *option) { o.RefreshPeriod = period + if o.RefreshPeriod*3 > o.Expiry { + o.Expiry = o.RefreshPeriod * 3 + } } } +// 最大尝试次数 func WithMaxRetryTimes(times int) Option { return func(o *option) { o.MaxRetryTimes = times } } +// 尝试间隔 func WithRetryInterval(interval time.Duration) Option { return func(o *option) { o.RetryInterval = interval