redis_support 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/redis_support/locks.rb +28 -18
- metadata +8 -17
data/lib/redis_support/locks.rb
CHANGED
@@ -16,6 +16,15 @@ module RedisSupport
|
|
16
16
|
release_redis_lock( key_to_lock )
|
17
17
|
end
|
18
18
|
|
19
|
+
# Throttle a block of code so it is only executed at most every
|
20
|
+
# `expiration` seconds. The block is skipped if it has been run
|
21
|
+
# more recently.
|
22
|
+
#
|
23
|
+
# Returns nothing
|
24
|
+
def redis_throttle( key_to_lock, expiration = 30 )
|
25
|
+
yield if acquire_redis_lock_nonblock( key_to_lock, expiration )
|
26
|
+
end
|
27
|
+
|
19
28
|
# Acquire a lock on a key in our Redis database. This is a blocking
|
20
29
|
# call. It sleeps until the lock has been successfully acquired.
|
21
30
|
#
|
@@ -25,6 +34,19 @@ module RedisSupport
|
|
25
34
|
# # do some stuff on my_key
|
26
35
|
# release_redis_lock( key.my_key )
|
27
36
|
#
|
37
|
+
# interval - sleep interval for checking the lock's status.
|
38
|
+
#
|
39
|
+
# Returns nothing.
|
40
|
+
def acquire_redis_lock( key_to_lock, expiration = 30, interval = 1 )
|
41
|
+
until acquire_redis_lock_nonblock( key_to_lock, expiration )
|
42
|
+
sleep interval
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Attempt to acquire a lock on a key in our Redis database.
|
47
|
+
#
|
48
|
+
# Returns true on success and false on failure
|
49
|
+
#
|
28
50
|
# Described in detail here:
|
29
51
|
#
|
30
52
|
# http://code.google.com/p/redis/wiki/SetnxCommand
|
@@ -40,30 +62,19 @@ module RedisSupport
|
|
40
62
|
# amount of time others will wait for you, not the amount of time
|
41
63
|
# you will wait to acquire the lock.
|
42
64
|
#
|
43
|
-
|
44
|
-
#
|
45
|
-
# Returns nothing.
|
46
|
-
def acquire_redis_lock( key_to_lock, expiration = 30, interval = 1 )
|
65
|
+
def acquire_redis_lock_nonblock( key_to_lock, expiration = 30 )
|
47
66
|
key = lock_key( key_to_lock )
|
48
|
-
|
67
|
+
if redis.setnx key, timeout_i( expiration )
|
68
|
+
return true
|
69
|
+
else
|
49
70
|
if redis.get( key ).to_i < Time.now.to_i
|
50
71
|
old_timeout = redis.getset( key, timeout_i( expiration ) ).to_i
|
51
72
|
if old_timeout < Time.now.to_i
|
52
|
-
return
|
73
|
+
return true
|
53
74
|
end
|
54
|
-
else
|
55
|
-
sleep interval
|
56
75
|
end
|
57
76
|
end
|
58
|
-
|
59
|
-
|
60
|
-
# Acquire a redis lock only if it can be acquired
|
61
|
-
# is a nonblocking action
|
62
|
-
#
|
63
|
-
# Returns true on success and false on failure
|
64
|
-
def acquire_redis_lock_nonblock( key_to_lock, expiration = 30 )
|
65
|
-
key = lock_key( key_to_lock )
|
66
|
-
redis.setnx key, timeout_i( expiration )
|
77
|
+
false
|
67
78
|
end
|
68
79
|
|
69
80
|
# See docs for acquire_redis_lock above
|
@@ -95,6 +106,5 @@ module RedisSupport
|
|
95
106
|
def timeout_i( timeout )
|
96
107
|
timeout.seconds.from_now.to_i
|
97
108
|
end
|
98
|
-
|
99
109
|
end
|
100
110
|
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 13
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
8
|
+
- 10
|
9
|
+
version: 0.0.10
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Brian P O'Rourke
|
@@ -16,25 +15,23 @@ autorequire:
|
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
18
17
|
|
19
|
-
date: 2010-
|
18
|
+
date: 2010-07-01 00:00:00 -07:00
|
20
19
|
default_executable:
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
23
|
-
|
24
|
-
|
22
|
+
name: redis
|
23
|
+
type: :runtime
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
hash: 31
|
29
28
|
segments:
|
30
29
|
- 1
|
31
30
|
- 0
|
32
31
|
- 4
|
33
32
|
version: 1.0.4
|
34
|
-
type: :runtime
|
35
|
-
name: redis
|
36
33
|
prerelease: false
|
37
|
-
|
34
|
+
requirement: *id001
|
38
35
|
description: "Module for adding redis functionality to classes: simple key namespacing and locking and connections"
|
39
36
|
email: dolores@doloreslabs.com
|
40
37
|
executables: []
|
@@ -48,8 +45,6 @@ files:
|
|
48
45
|
- lib/redis_support/class_extensions.rb
|
49
46
|
- lib/redis_support/locks.rb
|
50
47
|
- README.md
|
51
|
-
- test/helper.rb
|
52
|
-
- test/test_redis_support.rb
|
53
48
|
has_rdoc: true
|
54
49
|
homepage: http://github.com/dolores/redis_support
|
55
50
|
licenses: []
|
@@ -60,27 +55,23 @@ rdoc_options:
|
|
60
55
|
require_paths:
|
61
56
|
- lib
|
62
57
|
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
-
none: false
|
64
58
|
requirements:
|
65
59
|
- - ">="
|
66
60
|
- !ruby/object:Gem::Version
|
67
|
-
hash: 3
|
68
61
|
segments:
|
69
62
|
- 0
|
70
63
|
version: "0"
|
71
64
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
65
|
requirements:
|
74
66
|
- - ">="
|
75
67
|
- !ruby/object:Gem::Version
|
76
|
-
hash: 3
|
77
68
|
segments:
|
78
69
|
- 0
|
79
70
|
version: "0"
|
80
71
|
requirements: []
|
81
72
|
|
82
73
|
rubyforge_project:
|
83
|
-
rubygems_version: 1.3.
|
74
|
+
rubygems_version: 1.3.6
|
84
75
|
signing_key:
|
85
76
|
specification_version: 3
|
86
77
|
summary: A Redis Support module
|