1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
package utils
import ( "context" "fmt" "testing" "time" "github.com/redis/go-redis/v9" )
func TestAntiShakeLock(t *testing.T) { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: fmt.Sprintf("%s:%s", "localhost", "6379"), Password: "123456", DB: 0, })
redisKey := fmt.Sprintf("%s:%d:%s", "app", 10001, "hqd8080") allowed, err := NewAntiShakeLock(rdb).TryLock(ctx, redisKey, 500*time.Millisecond) if err != nil { t.Fatalf("获取防抖动锁失败:%v", err) } if !allowed { t.Fatal("操作频繁!") } else { t.Log("获得防抖动锁成功、执行业务!") if err = NewAntiShakeLock(rdb).ReleaseLock(ctx, redisKey); err != nil { t.Fatal(err) } } for i := 1; i <= 5; i++ { allowed, err = NewAntiShakeLock(rdb).TryLock(ctx, redisKey, 500*time.Millisecond) if err != nil { fmt.Printf("第 %d 次操作错误: %v\n", i, err) continue } if allowed { fmt.Printf("第 %d 次操作有效,执行业务逻辑\n", i) } else { fmt.Printf("第 %d 次操作被拦截(处于抖动窗口)\n", i) } time.Sleep(100 * time.Millisecond) } }
|