Skip to content
/ redislock Public

Simplified distributed locking implementation using Redis

License

Notifications You must be signed in to change notification settings

bsm/redislock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Mar 21, 2024
bfd385b · Mar 21, 2024

History

58 Commits
Nov 24, 2023
Mar 21, 2024
Oct 5, 2021
Nov 24, 2023
Jun 24, 2019
Oct 5, 2021
Mar 23, 2023
Mar 23, 2023
Nov 24, 2023
Apr 27, 2023
Apr 27, 2023
Nov 24, 2023
Nov 24, 2023
Mar 21, 2024
Nov 24, 2023
Nov 24, 2023
Nov 24, 2023
Dec 29, 2021

Repository files navigation

redislock

Test GoDoc License

Simplified distributed locking implementation using Redis. For more information, please see examples.

Examples

import (
  "context"
  "fmt"
  "log"
  "time"

  "github.com/bsm/redislock"
  "github.com/redis/go-redis/v9"
)

func main() {
	// Connect to redis.
	client := redis.NewClient(&redis.Options{
		Network:	"tcp",
		Addr:		"127.0.0.1:6379",
	})
	defer client.Close()

	// Create a new lock client.
	locker := redislock.New(client)

	ctx := context.Background()

	// Try to obtain lock.
	lock, err := locker.Obtain(ctx, "my-key", 100*time.Millisecond, nil)
	if err == redislock.ErrNotObtained {
		fmt.Println("Could not obtain lock!")
	} else if err != nil {
		log.Fatalln(err)
	}

	// Don't forget to defer Release.
	defer lock.Release(ctx)
	fmt.Println("I have a lock!")

	// Sleep and check the remaining TTL.
	time.Sleep(50 * time.Millisecond)
	if ttl, err := lock.TTL(ctx); err != nil {
		log.Fatalln(err)
	} else if ttl > 0 {
		fmt.Println("Yay, I still have my lock!")
	}

	// Extend my lock.
	if err := lock.Refresh(ctx, 100*time.Millisecond, nil); err != nil {
		log.Fatalln(err)
	}

	// Sleep a little longer, then check.
	time.Sleep(100 * time.Millisecond)
	if ttl, err := lock.TTL(ctx); err != nil {
		log.Fatalln(err)
	} else if ttl == 0 {
		fmt.Println("Now, my lock has expired!")
	}

}

Documentation

Full documentation is available on GoDoc