golocks

package module
v1.0.0 Latest Latest
Warning

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

Go to latest
Published: Aug 28, 2019 License: Apache-2.0 Imports: 7 Imported by: 0

README

Go Locks

  • map lock
  • redis lock
  • mysql lock

Usage

//  Map Lock
mapLock := NewMapLock("lock1")
err := mapLock.TryLock()
err = mapLock.Unlock()

// Redis Lock
InitRedisLock(redisClient)
redisLock := NewRedisLock("lock2", time.Second)
err = redisLock.TryLock()
err = redisLock.Unlock()

// MySQL Lock
InitMysqlLock(db, "test", 5*time.Second)
mysqlLock := NewMysqlLock("lock3", time.Second)
err = mysqlLock.TryLock()
err = mysqlLock.Unlock()

// Upgrade to Spin Lock
mapSpinLock := NewSpinLock(NewMapLock(lockKey), spinTries, spinInterval)
err = mapSpinLock.Lock()
err = mapSpinLock.Unlock()

Dependency Injection
type usecase struct {
	lockFactory ExpiryLockFactory
}

func (u *usecase) CheckFrequntSubmit(key string, expiry time.Duration) (ok bool) {
	lock := u.lockFactory.NewLock(key, expiry)
	if err := lock.TryLock(); err != nil {
		return false
	}

	// let the lock expire, and unlock automatically
	return true
}

func TestUsecase_CheckFrequentSubmit(t *testing.T) {
	ctl := gomock.NewController(t)
	defer ctl.Finish()

	key := "book:1:submit"
	expiry := time.Second

	lock := mock.NewMockTryLocker(ctl)
	lock.EXPECT().TryLock().Return(nil)
	lockFactory := mock.NewMockExpiryLockFactory(ctl)
	lockFactory.EXPECT().NewLock(key, expiry).Return(lock)

	bookUsecase := usecase{lockFactory}
	ok := bookUsecase.CheckFrequntSubmit(key, expiry)
	assert.True(t, ok)
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func InitMysqlLock

func InitMysqlLock(db *sql.DB, tableName string, clearExpiryInterval time.Duration)

func InitRedisLock

func InitRedisLock(client *redis.Client)

func NewMapLock

func NewMapLock(name string) *mapLock

func NewMapLockFactory

func NewMapLockFactory() *mapLockFactory

func NewMysqlLock

func NewMysqlLock(name string, expiry time.Duration) *mysqlLock

func NewMysqlLockFactory

func NewMysqlLockFactory(db *sql.DB, tableName string, clearExpiryInterval time.Duration) *mysqlLockFactory

func NewRedisLock

func NewRedisLock(name string, expiry time.Duration) *redisLock

func NewRedisLockFactory

func NewRedisLockFactory(client *redis.Client) *redisLockFactory

func NewSpinLock

func NewSpinLock(lock TryLocker, spinTries int, spinInterval time.Duration) *spinLock

Types

type ExpiryLockFactory

type ExpiryLockFactory interface {
	NewLock(key string, expiry time.Duration) TryLocker
}

type LockFactory

type LockFactory interface {
	NewLock(key string) TryLocker
}

type TryLocker

type TryLocker interface {
	TryLock() error
	Unlock() error
}

Directories

Path Synopsis
Package mock is a generated GoMock package.
Package mock is a generated GoMock package.

Jump to

Keyboard shortcuts

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