em-redislite 0.1.2 → 0.2.0
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/CHANGELOG +7 -0
- data/README.md +61 -0
- data/lib/em/redis-synchrony.rb +21 -0
- data/lib/em/redis.rb +19 -2
- data/lib/em-redislite.rb +0 -1
- data/{tests → test}/helper.rb +2 -4
- data/{tests → test}/test_command_expire.rb +2 -2
- data/{tests → test}/test_commands.rb +0 -0
- data/{tests → test}/test_connection.rb +0 -0
- metadata +61 -59
- data/README.rdoc +0 -42
- data/em-redislite.gemspec +0 -16
- data/lib/em/redis/sugar.rb +0 -34
data/CHANGELOG
ADDED
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# Redis Lite
|
2
|
+
|
3
|
+
Eventmachine based adapter that talks redis 2.0 protocol
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
gem install em-redislite
|
8
|
+
|
9
|
+
## Dependencies
|
10
|
+
|
11
|
+
* Ruby >= 1.9.1
|
12
|
+
* eventmachine
|
13
|
+
* em-synchrony (optional)
|
14
|
+
|
15
|
+
## Unsupported commands
|
16
|
+
|
17
|
+
* Pub/Sub
|
18
|
+
* Scripting
|
19
|
+
* Server
|
20
|
+
|
21
|
+
## Example
|
22
|
+
|
23
|
+
### Using callbacks
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
require 'em-redislite'
|
27
|
+
|
28
|
+
EM.run do
|
29
|
+
# defaults to { host: '127.0.0.1', port: 6379 }
|
30
|
+
client = EM::Redis.connect
|
31
|
+
client.errback {|error| $stderr.puts "Redis Error: #{error}"; EM.stop }
|
32
|
+
|
33
|
+
r = client.set "mykey", "myvalue"
|
34
|
+
r.callback {|value| p value }
|
35
|
+
r.errback {|error| p error }
|
36
|
+
|
37
|
+
r = client.get "mykey"
|
38
|
+
r.callback {|value| p value }
|
39
|
+
r.errback {|error| p error }
|
40
|
+
end
|
41
|
+
```
|
42
|
+
### Using em-synchrony
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
require 'em-redislite'
|
46
|
+
require 'em/redis-synchrony'
|
47
|
+
|
48
|
+
EM.run do
|
49
|
+
EM.synchrony do
|
50
|
+
client = EM::Redis.connect
|
51
|
+
client.errback {|error| $stderr.puts "Redis Error: #{error}"; EM.stop }
|
52
|
+
|
53
|
+
p client.set "mykey", "myvalue"
|
54
|
+
p client.get "mykey"
|
55
|
+
EM.stop
|
56
|
+
end
|
57
|
+
end
|
58
|
+
```
|
59
|
+
|
60
|
+
## License
|
61
|
+
[Creative Commons Attribution - CC BY](http://creativecommons.org/licenses/by/3.0)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'em-synchrony'
|
2
|
+
require 'em-redislite'
|
3
|
+
|
4
|
+
module EM
|
5
|
+
module Redis
|
6
|
+
class Client < Connection
|
7
|
+
def command name, *args
|
8
|
+
EM::Synchrony.sync send_command(name, *args)
|
9
|
+
end
|
10
|
+
|
11
|
+
def send_command name, *args
|
12
|
+
defer = DefaultDeferrable.new
|
13
|
+
@pool << defer
|
14
|
+
send_data "*#{args.length + 1}\r\n" +
|
15
|
+
"$#{name.length}\r\n#{name}\r\n" +
|
16
|
+
args.map(&:to_s).inject('') {|a,v| a + "$#{v.bytesize}\r\n#{v}\r\n"}
|
17
|
+
defer
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/em/redis.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require 'eventmachine'
|
2
|
+
|
2
3
|
module EM
|
3
4
|
module Redis
|
4
|
-
class Error < StandardError; end
|
5
5
|
|
6
|
+
VERSION = '0.2.0'
|
6
7
|
DEFAULTS = { host: '127.0.0.1', port: 6379 }
|
7
8
|
|
9
|
+
class Error < StandardError; end
|
10
|
+
|
8
11
|
def self.connect options = {}
|
9
12
|
options = DEFAULTS.merge(options)
|
10
13
|
begin
|
@@ -56,7 +59,7 @@ module EM
|
|
56
59
|
EM.reconnect @options[:host], @options[:port], self
|
57
60
|
end
|
58
61
|
|
59
|
-
def unbind msg = 'lost connection'
|
62
|
+
def unbind msg = 'lost db connection'
|
60
63
|
error = Error.new(msg)
|
61
64
|
@pool.each {|r| r.fail(error) }
|
62
65
|
@pool = []
|
@@ -101,6 +104,20 @@ module EM
|
|
101
104
|
|
102
105
|
process_bytes(nil) if @want_bytes < 0
|
103
106
|
end
|
107
|
+
|
108
|
+
COMMANDS = %w(
|
109
|
+
APPEND AUTH BLPOP BRPOP BRPOPLPUSH DECR DECRBY DEL DISCARD DUMP ECHO EXEC EXISTS EXPIRE EXPIREAT
|
110
|
+
GET GETBIT GETRANGE GETSET HDEL HEXISTS HGET HGETALL HINCRBY HINCRBYFLOAT HKEYS HLEN HMGET HMSET
|
111
|
+
HSET HSETNX HVALS INCR INCRBY INCRBYFLOAT KEYS LINDEX LINSERT LLEN LPOP LPUSH LPUSHX LRANGE LREM
|
112
|
+
LSET LTRIM MGET MIGRATE MOVE MSET MSETNX MULTI OBJECT PERSIST PEXPIRE PEXPIREAT PING PSETEX PTTL
|
113
|
+
QUIT RANDOMKEY RENAME RENAMENX RESTORE RPOP RPOPLPUSH RPUSH RPUSHX SADD SCARD SDIFF SDIFFSTORE
|
114
|
+
SELECT SET SETBIT SETEX SETNX SETRANGE SINTER SINTERSTORE SISMEMBER SMEMBERS SMOVE SORT SPOP
|
115
|
+
SRANDMEMBER SREM STRLEN SUNION SUNIONSTORE TTL TYPE UNWATCH WATCH ZADD ZCARD ZCOUNT ZINCRBY
|
116
|
+
ZINTERSTORE ZRANGE ZRANGEBYSCORE ZRANK ZREM ZREMRANGEBYRANK ZREMRANGEBYSCORE ZREVRANGE
|
117
|
+
ZREVRANGEBYSCORE ZREVRANK ZSCORE ZUNIONSTORE
|
118
|
+
).freeze
|
119
|
+
|
120
|
+
COMMANDS.each {|name| send(:define_method, name.downcase) {|*args| command(name, *args) }}
|
104
121
|
end # Client
|
105
122
|
end # Redis
|
106
123
|
end # EM
|
data/lib/em-redislite.rb
CHANGED
data/{tests → test}/helper.rb
RENAMED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'minitest/
|
2
|
-
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'em-redislite'
|
3
3
|
|
4
4
|
class MiniTest::Unit::TestCase
|
5
5
|
def em_run &block
|
@@ -11,5 +11,3 @@ class MiniTest::Unit::TestCase
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
15
|
-
MiniTest::Unit.autorun
|
@@ -4,8 +4,8 @@ describe 'Command Expire' do
|
|
4
4
|
it 'should support set with expiry' do
|
5
5
|
@success = false
|
6
6
|
em_run do |client|
|
7
|
-
r = client.
|
8
|
-
r = client.get
|
7
|
+
r = client.setex 'mykey', 1, 'foobar'
|
8
|
+
r = client.get 'mykey'
|
9
9
|
r.callback do |value|
|
10
10
|
EM.stop unless value == 'foobar'
|
11
11
|
EM.add_timer(2) do
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,84 +1,86 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-redislite
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 1
|
8
|
-
- 2
|
9
|
-
version: 0.1.2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Bharanee Rathna
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-04-08 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: eventmachine
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
- 0
|
30
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
31
22
|
type: :runtime
|
32
|
-
|
33
|
-
|
34
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: EventMachine based Redis client
|
47
|
+
email:
|
48
|
+
- deepfryed@gmail.com
|
35
49
|
executables: []
|
36
|
-
|
37
50
|
extensions: []
|
38
|
-
|
39
51
|
extra_rdoc_files: []
|
40
|
-
|
41
|
-
|
42
|
-
-
|
43
|
-
-
|
44
|
-
-
|
45
|
-
- lib/em/redis/sugar.rb
|
52
|
+
files:
|
53
|
+
- test/test_connection.rb
|
54
|
+
- test/test_commands.rb
|
55
|
+
- test/helper.rb
|
56
|
+
- test/test_command_expire.rb
|
46
57
|
- lib/em/redis.rb
|
47
|
-
-
|
48
|
-
-
|
49
|
-
-
|
50
|
-
-
|
51
|
-
has_rdoc: true
|
58
|
+
- lib/em/redis-synchrony.rb
|
59
|
+
- lib/em-redislite.rb
|
60
|
+
- README.md
|
61
|
+
- CHANGELOG
|
52
62
|
homepage: http://github.com/deepfryed/em-redislite
|
53
63
|
licenses: []
|
54
|
-
|
55
64
|
post_install_message:
|
56
65
|
rdoc_options: []
|
57
|
-
|
58
|
-
require_paths:
|
66
|
+
require_paths:
|
59
67
|
- lib
|
60
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
69
|
none: false
|
62
|
-
requirements:
|
63
|
-
- -
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
|
66
|
-
|
67
|
-
version: "0"
|
68
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
75
|
none: false
|
70
|
-
requirements:
|
71
|
-
- -
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
|
74
|
-
- 0
|
75
|
-
version: "0"
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
76
80
|
requirements: []
|
77
|
-
|
78
81
|
rubyforge_project:
|
79
|
-
rubygems_version: 1.
|
82
|
+
rubygems_version: 1.8.21
|
80
83
|
signing_key:
|
81
84
|
specification_version: 3
|
82
|
-
summary: A
|
85
|
+
summary: A lite version of EM::Redis
|
83
86
|
test_files: []
|
84
|
-
|
data/README.rdoc
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
= Redis Lite
|
2
|
-
|
3
|
-
Eventmachine based adapter that talks redis 2.0 protocol
|
4
|
-
|
5
|
-
== Installation
|
6
|
-
|
7
|
-
gem install em-redislite
|
8
|
-
|
9
|
-
=== Dependencies
|
10
|
-
|
11
|
-
* Ruby >= 1.9.1
|
12
|
-
* eventmachine
|
13
|
-
|
14
|
-
== Usage
|
15
|
-
|
16
|
-
require 'em/redislite'
|
17
|
-
|
18
|
-
EM.run do
|
19
|
-
client = EM::Redis.connect # defaults to { host: '127.0.0.1', port: 6379 }
|
20
|
-
client.errback {|error| $stderr.puts "Redis Error: #{error}"; EM.stop }
|
21
|
-
|
22
|
-
r = client.command :get, "mykey"
|
23
|
-
r.callback {|value| p value }
|
24
|
-
r.errback {|error| p error }
|
25
|
-
|
26
|
-
# syntactic sugar for string and boolean commands
|
27
|
-
r = client.get "mykey"
|
28
|
-
r = client.set "mykey", "some value", 1800 # ttl
|
29
|
-
|
30
|
-
# you should be running redis in a private network or have it firewalled but ...
|
31
|
-
r = client.command :auth, "my super dooper password" # should work as well
|
32
|
-
end
|
33
|
-
|
34
|
-
== Testing
|
35
|
-
|
36
|
-
There are no tests at the moment coz I'm a lazy slob.
|
37
|
-
|
38
|
-
== License
|
39
|
-
|
40
|
-
GNU GPLv3, so its free and comes with no guarantees. If it brings down your website or burns down your house, I will
|
41
|
-
not be held responsible. Use it at your own risk. You can read all about GNU here: http://www.gnu.org and
|
42
|
-
GNU GPLv3 here: http://www.gnu.org/licenses/gpl.txt.
|
data/em-redislite.gemspec
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
Gem::Specification.new do |s|
|
4
|
-
s.name = %q{em-redislite}
|
5
|
-
s.version = '0.1.2'
|
6
|
-
s.summary = 'A lightweight EM based Redis adapter'
|
7
|
-
s.description = 'A very simple EventMachine based adapter that talks Redis protocol'
|
8
|
-
s.authors = [ 'Bharanee Rathna' ]
|
9
|
-
s.email = %q{deepfryed@gmail.com}
|
10
|
-
s.homepage = %q{http://github.com/deepfryed/em-redislite}
|
11
|
-
s.files = %w(README.rdoc em-redislite.gemspec) + Dir.glob("{lib,tests}/**/*")
|
12
|
-
s.require_paths = %w(lib)
|
13
|
-
s.platform = Gem::Platform::RUBY
|
14
|
-
|
15
|
-
s.add_dependency('eventmachine')
|
16
|
-
end
|
data/lib/em/redis/sugar.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
class EM::Redis::Client
|
2
|
-
COMMANDS = {
|
3
|
-
string: %w(get strlen getset setnx setex setbit getbit mset msetnx mget incr incrby decr decrby
|
4
|
-
append setrange getrange),
|
5
|
-
boolean: %w(exists del type keys randomkey rename renamenx dbsize expire persist ttl select move
|
6
|
-
flushdb flushall),
|
7
|
-
}.freeze
|
8
|
-
|
9
|
-
COMMANDS[:string].each {|c| send(:define_method, c) {|*args| command(c, *args) }}
|
10
|
-
COMMANDS[:boolean].each {|c| send(:define_method, c) {|*args|
|
11
|
-
defer = EM::DefaultDeferrable.new
|
12
|
-
req = command(c, *args)
|
13
|
-
req.callback {|r| defer.succeed(r == '1') }
|
14
|
-
req.errback {|e| defer.fail(e) }
|
15
|
-
defer
|
16
|
-
}}
|
17
|
-
|
18
|
-
# set here is special since it combines :set and optional :expire
|
19
|
-
def set key, value, ttl = nil
|
20
|
-
if ttl
|
21
|
-
defer = EM::DefaultDeferrable.new
|
22
|
-
req = command(:set, key, value)
|
23
|
-
req.callback do
|
24
|
-
req = command(:expire, key, ttl)
|
25
|
-
req.callback {|r| defer.succeed(r == '1') }
|
26
|
-
req.errback {|e| defer.fail(e) }
|
27
|
-
end
|
28
|
-
req.errback {|e| defer.fail(e) }
|
29
|
-
defer
|
30
|
-
else
|
31
|
-
command(:set, key, value)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|