概览

分布式锁

自定义

// Locker 互斥锁需要实现的方法
type Locker interface {
	// Lock 加锁
	Lock(ctx context.Context, key, threadId string, expiresIn time.Duration) bool
	// Unlock 解锁
	Unlock(ctx context.Context, key, threadId string) bool
	// 续期
	KeepAlive(ctx context.Context, key, threadId string, expiresIn time.Duration) bool
}

使用

redis实现的分布式互斥锁

import (
	"github.com/asjard/asjard/pkg/xredis"
	"github.com/asjard/asjard/pkg/mutex"
)

func main() {
	var count int64
	do := func() error {
		count += 1
		return nil
	}
	// redis分布式锁
	rediLock, err := xredis.NewLock()
	if err != nil {
		panic(err)
	}
	m := &mutext.Mutex{Locker: redisLock}
	wg := sync.WaitGroup{}
	key := "test_do_with_lock"
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			if err := m.TryLock(context.Background(), key, do, WithMaxRetries(-1)); err != nil {
				t.Error(err)
			}
		}()
	}
	wg.Wait()
	fmt.Println(count)
	// Output: 10
}

mysql实现的分布式互斥锁

import (
	"github.com/asjard/asjard/pkg/xgorm"
	"github.com/asjard/asjard/pkg/mutex"
)

func main() {
	var count int64
	do := func() error {
		count += 1
		return nil
	}
	// gorm分布式锁
	gormLock, err := xgorm.NewLock()
	if err != nil {
		panic(err)
	}
	m := &mutext.Mutex{Locker: gormLock}
	wg := sync.WaitGroup{}
	key := "test_do_with_lock"
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			if err := m.TryLock(context.Background(), key, do, WithMaxRetries(-1)); err != nil {
				t.Error(err)
			}
		}()
	}
	wg.Wait()
	fmt.Println(count)
	// Output: 10
}

最后更新于