PHPackages                             mvs3d/laravel-redlock - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. mvs3d/laravel-redlock

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

mvs3d/laravel-redlock
=====================

Redis distributed locks for laravel with using PhpRedis

v3.0.8(7y ago)08MITPHPPHP &gt;=5.4.0

Since Dec 14Pushed 7y ago1 watchersCompare

[ Source](https://github.com/mvs3d/laravel-redlock)[ Packagist](https://packagist.org/packages/mvs3d/laravel-redlock)[ Docs](https://github.com/mvs3d/laravel-redlock)[ RSS](/packages/mvs3d-laravel-redlock/feed)WikiDiscussions master Synced 2mo ago

READMEChangelog (3)Dependencies (6)Versions (17)Used By (0)

Laravel RedLock
===============

[](#laravel-redlock)

Provides a generic locking mechanism using Redis. Implements the locking standard proposed by Redis.

### Acknowledgements

[](#acknowledgements)

This library was originally built by LibiChai based on the Redlock algorithm developed by antirez. The library was reworked by the team at That's Us, Inc.

**Added by mvs3d: general fork purpose - package adaptation for PhpRedis instead of Predis. Unstable now, please don't use.**

### Installation

[](#installation)

1. `composer require mvs3d/laravel-redlock`
2. Add `ThatsUs\RedLock\RedLockServiceProvider::class,` to the `providers` array in config/app.php
3. Enjoy!

### It's Simple!

[](#its-simple)

Set a lock on any scalar. If the `lock()` method returns false, you did not acquire the lock.

Store results of the `lock()` method. Use this value to release the lock with `unlock()`.

### Example

[](#example)

This example sets a lock on the key "1" with a 3 second expiration time.

If it acquired the lock, it does some work and releases the lock.

```
 use ThatsUs\RedLock\Facades\RedLock;

 $product_id = 1;

 $lock_token = RedLock::lock($product_id, 3000);

 if ($lock_token) {

     $order->submit($product_id);

     RedLock::unlock($lock_token);
 }
```

### Refresh

[](#refresh)

Use `refreshLock()` to reacquire and extend the time of your lock.

```
 use ThatsUs\RedLock\Facades\RedLock;

 $product_ids = [1, 2, 3, 5, 7];

 $lock_token = RedLock::lock('order-submitter', 3000);

 while ($product_ids && $lock_token) {

     $order->submit(array_shift($product_ids));

     $lock_token = RedLock::refreshLock($lock_token);
 }

 RedLock::unlock($lock_token);
```

### Even Easier with Closures

[](#even-easier-with-closures)

Use `runLocked()` for nicer syntax. The method returns the results of the closure, or else false if the lock could not be acquired.

```
 use ThatsUs\RedLock\Facades\RedLock;

 $product_id = 1;

 $result = RedLock::runLocked($product_id, 3000, function () use ($order, $product_id) {
     $order->submit($product_id);
     return true;
 });

 echo $result ? 'Worked!' : 'Lock not acquired.';
```

### Refresh with Closures

[](#refresh-with-closures)

You can easily refresh your tokens when using closures. The first parameter to your closure is `$refresh`. Simply call it when you want to refresh. If the lock cannot be refreshed, `$refresh()` will break out of the closure.

```
 use ThatsUs\RedLock\Facades\RedLock;

 $product_ids = [1, 2, 3, 5, 7];

 $result = RedLock::runLocked($product_id, 3000, function ($refresh) use ($order, $product_ids) {
     foreach ($product_ids as $product_id) {
         $refresh();
         $order->submit($product_id);
     }
     return true;
 });

 echo $result ? 'Worked!' : 'Lock lost or never acquired.';
```

### Lock Queue Jobs Easily

[](#lock-queue-jobs-easily)

If you're running jobs on a Laravel queue, you may want to avoid queuing up the same job more than once at a time.

The `ThatsUs\RedLock\Traits\QueueWithoutOverlap` trait provides this functionality with very few changes to your job. Usually only two changes are necessary.

1. `use ThatsUs\RedLock\Traits\QueueWithoutOverlap` as a trait
2. Change the `handle()` method to `handleSync()`

```
use ThatsUs\RedLock\Traits\QueueWithoutOverlap;

class OrderProductJob
{
    use QueueWithoutOverlap;

    public function __construct($order, $product_id)
    {
        $this->order = $order;
        $this->product_id = $product_id;
    }

    public function handleSync()
    {
        $this->order->submit($this->product_id);
    }

}
```

Sometimes it's also necessary to specify a `getLockKey()` method. This method must return the string that needs to be locked.

This is typically unnecessary because the lock key can be generated automatically. But if the job's data is not easy to stringify, you must define the `getLockKey()` method.

This trait also provides a refresh method called `refreshLock()`. If `refreshLock()` is unable to refresh the lock, an exception is thrown and the job fails.

Finally, you can change the lock time-to-live from the default 300 seconds to another value using the `$lock_time` property.

```
use ThatsUs\RedLock\Traits\QueueWithoutOverlap;

class OrderProductsJob
{
    use QueueWithoutOverlap;

    protected $lock_time = 600; // 10 minutes in seconds

    public function __construct($order, array $product_ids)
    {
        $this->order = $order;
        $this->product_ids = $product_ids;
    }

    // We need to define getLockKey() because $product_ids is an array and the
    // automatic key generator can't deal with arrays.
    protected function getLockKey()
    {
        $product_ids = implode(',', $this->product_ids);
        return "OrderProductsJob:{$this->order->id}:{$product_ids}";
    }

    public function handleSync()
    {
        foreach ($this->product_ids as $product_id) {
            $this->refreshLock();
            $this->order->submit($product_id);
        }
    }

}
```

### Contribution

[](#contribution)

If you find a bug or want to contribute to the code or documentation, you can help by submitting an [issue](https://github.com/thatsus/laravel-redlock/issues) or a [pull request](https://github.com/thatsus/laravel-redlock/pulls).

### License

[](#license)

[MIT](http://opensource.org/licenses/MIT)

###  Health Score

28

—

LowBetter than 54% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity4

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity66

Established project with proven stability

 Bus Factor1

Top contributor holds 52.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~69 days

Recently: every ~87 days

Total

12

Last Release

2668d ago

Major Versions

1.0.2 → v3.0.12017-05-30

### Community

Maintainers

![](https://www.gravatar.com/avatar/08952b3c0de4183dd718700ddddcd76b537040e1bfe24ac6de57aef29071c090?d=identicon)[mvs3d](/maintainers/mvs3d)

---

Top Contributors

[![dankuck](https://avatars.githubusercontent.com/u/277837?v=4)](https://github.com/dankuck "dankuck (22 commits)")[![libi](https://avatars.githubusercontent.com/u/7769922?v=4)](https://github.com/libi "libi (11 commits)")[![jamieburnip](https://avatars.githubusercontent.com/u/5802560?v=4)](https://github.com/jamieburnip "jamieburnip (3 commits)")[![BrandonShar](https://avatars.githubusercontent.com/u/6599653?v=4)](https://github.com/BrandonShar "BrandonShar (2 commits)")[![potsky](https://avatars.githubusercontent.com/u/408237?v=4)](https://github.com/potsky "potsky (1 commits)")[![evanBurg](https://avatars.githubusercontent.com/u/4584403?v=4)](https://github.com/evanBurg "evanBurg (1 commits)")[![KarmicXKoala](https://avatars.githubusercontent.com/u/29736440?v=4)](https://github.com/KarmicXKoala "KarmicXKoala (1 commits)")[![mvs3d](https://avatars.githubusercontent.com/u/5299867?v=4)](https://github.com/mvs3d "mvs3d (1 commits)")

---

Tags

redlocklaravel redis lockredis lock

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/mvs3d-laravel-redlock/health.svg)

```
[![Health](https://phpackages.com/badges/mvs3d-laravel-redlock/health.svg)](https://phpackages.com/packages/mvs3d-laravel-redlock)
```

###  Alternatives

[barryvdh/laravel-ide-helper

Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.

14.9k123.0M683](/packages/barryvdh-laravel-ide-helper)[wnx/laravel-stats

Get insights about your Laravel Project

1.8k1.8M7](/packages/wnx-laravel-stats)[orchestra/canvas

Code Generators for Laravel Applications and Packages

21017.2M157](/packages/orchestra-canvas)[thatsus/laravel-redlock

Redis distributed locks for laravel

53145.2k](/packages/thatsus-laravel-redlock)[interaction-design-foundation/laravel-geoip

Support for multiple Geographical Location services.

17221.0k3](/packages/interaction-design-foundation-laravel-geoip)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

255.2k](/packages/aedart-athenaeum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
