Class: Redis::Helper::Lock

Inherits:
Object
  • Object
show all
Defined in:
lib/redis/helper/lock.rb

Overview

ロックの管理クラス

Constant Summary collapse

DEFAULT_TIMEOUT =

ロック取得のタイムアウト(sec)

5

Instance Method Summary collapse

Constructor Details

#initialize(redis, lock_key, options = {}) ⇒ Lock

Returns a new instance of Lock.

Parameters:

  • redis (Redis)

    redisのインスタンス

  • lock_key (String)

    ロックを保持するキー

  • options (Hash) (defaults to: {})

    オプション

Options Hash (options):

  • timeout (Integer)

    タイムアウト時間(sec)



12
13
14
15
16
17
# File 'lib/redis/helper/lock.rb', line 12

def initialize(redis, lock_key, options = {})
  @redis        = redis
  @lock_key     = lock_key
  @options      = options
  @locked_by_self = false
end

Instance Method Details

#lock { ... } ⇒ Object

ロックをかけてブロック内の処理を実行

Yields:

  • ロック中に実行する処理のブロック

Raises:

  • (ArgumentError)


21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/redis/helper/lock.rb', line 21

def lock
  raise ArgumentError unless block_given?
  if Thread.current[@lock_key]
    yield
  else
    begin
      Thread.current[@lock_key] = true
      try_lock!(Time.now.to_f)
      yield
    ensure
      unlock
      Thread.current[@lock_key] = nil
    end
  end
end

#unlockObject

ロックを開放(自身でかけたロックの場合のみ開放する)



39
40
41
42
43
44
# File 'lib/redis/helper/lock.rb', line 39

def unlock
  if @locked_by_self
    @redis.del(@lock_key)
    @locked_by_self = false
  end
end