`

基于redis实现的锁

阅读更多

代码:

class MsgSchedule
  attr_reader :lock_key, :expire_in, :redis

  def initialize(lock_key, opts = {})
    raise 'lock_key must be exists!' if lock_key.blank?

    @lock_key  = lock_key
    @expire_in = opts.delete(:expire_in) || 1.minute
    @redis     = opts.delete(:redis) || MSG_BUFFERS_REDIS
    @opts      = opts
  end

  def synchronize
    set_owner_flag
    return unless lock

    begin
      yield self
    ensure
      unlock
    end

    true
  end

  private

  def lock
    @locked = @redis.set(lock_key, owner_flag, nx: true, ex: expire_in)
    @locked ||= (unlock_by_expired && lock)
  end

  def unlock
    unlock_by_myself || unlock_by_expired
  end

  def unlock_by_myself
    val = @redis.get(lock_key)
    val == owner_flag && !!@redis.del(lock_key)
  end

  def unlock_by_expired
    val = @redis.get(lock_key)
    val.nil? || (val.to_f + expire_in <= Time.current.to_f) && !!@redis.del(lock_key)
  end

  def owner_flag
    @owner_flag
  end

  def set_owner_flag
    @owner_flag = Time.current.to_f.to_s
  end
end

 

测试代码:

@a, @b, @k, @ex = (1..50).to_a, [], 'test/ms', 1.seconds

5.times.map {
  Thread.new {
    ms  = MsgSchedule.new(@k, expire_in: @ex)
    @ss = false

    loop {
      puts "数据 ====> #{@a.size} == #{@b.size}"
      break if @a.uniq.size <= 1
      puts "等待加锁 ==> #{sleep(0.1)}" if @ss

      ms.synchronize {
        x = @a.find { |x| x > -1 }
        sleep(rand(3) / 10.0)
        @ss = x.nil?
        unless x.nil?
          @b << x
          @a[@a.index(x)] = -1
        end
      }
    }
  }
}.join

puts @a, @b

  

分享到:
评论

相关推荐

    Java基于redis实现分布式锁代码实例

    Java基于Redis实现分布式锁代码实例 分布式锁的必要性 在多线程环境中,资源竞争是一个常见的问题。例如,在一个简单的用户操作中,一个线程修改用户状态,首先在内存中读取用户状态,然后在内存中进行修改,然后...

    基于Redis方式实现分布式锁

    本篇重点介绍基于Redis实现分布式锁的方法。Redis提供了高效的键值存储能力,可以很好地支持分布式锁的需求。 ##### 实现原理 Redis实现分布式锁主要依赖三个基本操作:`SETNX`(Set If Not eXists)、`EXPIRE` 和...

    springboot基于redis分布式锁

    本教程将深入探讨如何在SpringBoot应用中实现基于Redis的分布式锁。 首先,Redis之所以常被用作分布式锁的实现,是因为其具有以下优点: 1. **高可用性**:Redis支持主从复制,可以确保在单点故障时仍有服务可用。...

    redis实现分布式锁,自旋式加锁,lua原子性解锁

    本文将深入探讨如何使用Redis实现分布式锁,以及如何利用自旋式加锁和Lua脚本实现原子性解锁。 首先,我们来理解分布式锁的基本概念。分布式锁是在多节点之间共享资源时,用于协调各个节点的访问控制机制。在分布式...

    C++基于redis的分布式锁redisAPI

    本文将深入探讨如何使用C++结合Redis实现分布式锁,并详细讲解Redis API在C++中的应用,以及如何处理与Boost库的集成。 首先,Redis是一个高性能的键值存储数据库,广泛用于缓存、消息队列、分布式锁等场景。分布式...

    基于Redis的分布式锁的实现方案.pdf

    本文讨论了分布式锁的实现方案,主要基于Redis实现分布式锁,以解决分布式系统中资源访问的同步问题。在分布式系统中,需要协调各个系统或主机之间的资源访问,以避免彼此干扰和保证一致性。分布式锁是控制分布式...

    Mybatis-plus基于redis实现二级缓存过程解析

    Mybatis-plus基于Redis实现二级缓存过程解析 Mybatis-plus是一款基于Java语言的持久层框架,旨在简化数据库交互操作。然而,在高并发、高性能的应用场景中,数据库的查询操作可能会成为性能瓶颈。为了解决这个问题...

    基于redis分布式锁实现“秒杀”

    ### 基于Redis分布式锁实现“秒杀” #### 一、引言 在现代互联网应用中,“秒杀”作为一种常见的促销手段,被广泛应用于电商领域。为了保证系统的稳定性和公平性,在高并发环境下实现秒杀功能时,合理地利用分布式...

    记录redisson实现redis分布式事务锁

    Redisson是基于Redis的Java客户端,它提供了丰富的数据结构和服务,包括分布式锁、信号量、队列、计数器等,极大地扩展了Redis在分布式系统中的应用能力。本篇文章将详细探讨如何使用Redisson实现Redis分布式事务锁...

    基于Redis实现分布式锁以及任务队列

    一、Redis实现分布式锁 1. Redis分布式锁的核心是`setnx()`命令,它用于设置键值对,但如果键已存在,则返回失败。在分布式锁的实现中,通常会为锁设置一个超时时间,以防锁意外丢失。例如,使用`Lock:order`作为锁...

    基于 Redis 的分布式锁

    在实现基于Redis的分布式锁时,通常会用到两个命令:NX(Not eXists)和EX(过期时间)。NX命令确保只有在键不存在时才能被设置,这样可以保证锁的互斥性。EX命令则是用来设置键的过期时间,保证锁可以在一段时间后...

    人工智能-项目实践-redis-基于 Redis 实现的分布式锁.zip

    人工智能-项目实践-redis-基于 Redis 实现的分布式锁 redis-lock 基于 Redis 实现的分布式锁。要求: Redis &gt;= v7: 理论上来说低于 Redis 7 的也可以,但是暂时我还没在这些 Redis 版本上测试 Go &gt;= 18: 低版本的 ...

    基于redis的分布式锁实现

    接下来,我们将重点介绍如何利用Redis实现分布式锁。 #### 基于Redis的分布式锁实现 Redis作为一个高性能的键值存储系统,因其出色的并发性能和丰富的数据结构支持,成为了实现分布式锁的理想选择之一。 ##### ...

    Redis分布式锁实现Redisson 15问.doc

    Redisson是一个基于Redis的分布式锁实现,它提供了一个高效、可靠的加锁机制。在本文中,我们将深入探讨Redisson实现分布式锁的原理和机制。 一、如何保证加锁的原子性 Redisson实现分布式锁的原子性是通过lua脚本...

    100讲带你实战基于Redis的高并发预约抢购系统.zip

    1. **分布式锁**:在抢购过程中,防止同一商品被多个用户同时购买,我们可以利用Redis实现分布式锁。例如,40_案例实战:实现一个最简单的分布式锁,讲解了如何通过设置和删除特定键来确保同一资源在同一时刻只能被...

    基于Redis实现分布式锁的使用方法详解.docx

    3. 死锁处理及锁续约为了防止死锁,除了设置过期时间外,还可以实现锁续约机制。在加锁时启动一个定时任务,如果同步代码执行时间较长,定时任务会在锁即将过期时尝试延长锁的生命周期。但是要注意,续约操作也需要...

    使用go语言编写的基于redis实现的分布式锁项目资源.zip

    使用go语言编写的基于redis实现的分布式锁项目资源

    分布式锁实现(基于redis-mysql)1

    **基于Redis实现分布式锁** Redis是一个内存数据库,其命令执行是单线程的,这使得它非常适合用来实现分布式锁。Redis提供了`SETNX`命令,该命令在键不存在时设置键值,具有原子性。在Java中,我们可以使用以下代码...

    基于redis的分布式session实现

    为了解决这个问题,我们可以采用基于Redis的分布式Session实现。 Redis是一种高性能的键值存储系统,常被用作数据缓存、消息中间件以及分布式锁等场景。由于其支持网络通信且操作速度快,非常适合用来存储和共享...

    基于redis的分布式方法锁

    本文将深入探讨如何基于Redis实现分布式方法锁,并分析其工作原理、优势以及应用场景。 **1. Redis分布式锁的概念** Redis分布式锁是一种基于键值存储系统的锁机制,它通过在Redis中设置一个带有超时时间的key来...

Global site tag (gtag.js) - Google Analytics