renoir 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +1 -0
- data/lib/renoir.rb +2 -0
- data/lib/renoir/client.rb +45 -0
- data/lib/renoir/cluster_info.rb +1 -0
- data/lib/renoir/connection_adapters.rb +2 -0
- data/lib/renoir/connection_adapters/base.rb +14 -0
- data/lib/renoir/connection_adapters/redis.rb +1 -0
- data/lib/renoir/connection_adapters/reply.rb +1 -0
- data/lib/renoir/crc16.rb +14 -14
- data/lib/renoir/pipeline.rb +5 -0
- data/lib/renoir/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fcf83e530a5859d415a1bbe367fcb3505f5ec96e
|
4
|
+
data.tar.gz: c06b4040a3d4639547d5ee7d9570b8009dd2babd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cf573b2c5af35650da61f303f77e6b95d6aa42c29c547d4c5122123cbe4c1aad38c7f730d2e598b7e2c5130cc885b5033fddda5e77363cdf938ad2d943b3db1
|
7
|
+
data.tar.gz: a85045df90e31e5bab6e5685b231ae7d5e726b69ab788f08aa1c034308024064b49f32b4b0dfa4840f0175e8f52c3de35439dbe579bacbe25fb0bc731faf393d
|
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--markup markdown -M redcarpet --no-private
|
data/lib/renoir.rb
CHANGED
data/lib/renoir/client.rb
CHANGED
@@ -19,6 +19,20 @@ module Renoir
|
|
19
19
|
connection_adapter: :redis,
|
20
20
|
}.freeze
|
21
21
|
|
22
|
+
# @option options [Array<String, Array<String, Fixnum>, Hash{String => Fixnum}>] :cluster_nodes
|
23
|
+
# Array of hostnames and ports of cluster nodes. At least one node must be specified.
|
24
|
+
# An element could be one of: `String` (`"127.0.0.1:6379"`), `Array` (`["127.0.0.1", 6379]`) or
|
25
|
+
# `Hash` (`{ host: "127.0.0.1", port: 6379 }`).
|
26
|
+
# Defaults to `[["127.0.0.1", 6379]]`.
|
27
|
+
# @option options [Fixnum] :max_redirection Max number of MOVED/ASK redirections. Defaults to `10`.
|
28
|
+
# @option options [Fixnum] :max_connection_error
|
29
|
+
# Max number of reconnections for connection errors. Defaults to `5`.
|
30
|
+
# @option options [Float] :connect_retry_random_factor A factor of reconnection interval. Defaults to `0.1`.
|
31
|
+
# @option options [Float] :connect_retry_interval
|
32
|
+
# A base interval (seconds) of reconnection. Defaults to `0.001`, i.e., 1 ms.
|
33
|
+
# @option options [String, Symbol] :connection_adapter
|
34
|
+
# Adapter name of a connection used by client. Defaults to `:redis`.
|
35
|
+
# @option options [Logger] :logger A logger. Defaults to `nil`.
|
22
36
|
def initialize(options)
|
23
37
|
@connections = {}
|
24
38
|
@cluster_info = ClusterInfo.new
|
@@ -50,10 +64,22 @@ module Renoir
|
|
50
64
|
@refresh_slots_mutex = Mutex.new
|
51
65
|
end
|
52
66
|
|
67
|
+
# Call EVAL command.
|
68
|
+
#
|
69
|
+
# @param [Array] args arguments of EVAL passed to a connection backend
|
70
|
+
# @yield [Object] a connection backend may yield
|
71
|
+
# @raise [Renoir::RedirectionError] when too many redirections
|
72
|
+
# @return the value returned by a connection backend
|
53
73
|
def eval(*args, &block)
|
54
74
|
call(:eval, *args, &block)
|
55
75
|
end
|
56
76
|
|
77
|
+
# Pipeline commands and call them with MULTI/EXEC.
|
78
|
+
#
|
79
|
+
# @yield [Renoir::Pipeline] A command pipeliner which has almost compatible interfaces with {Renoir::Client}.
|
80
|
+
# @return the value returned by a connection backend
|
81
|
+
# @raise [Renoir::RedirectionError] when too many redirections
|
82
|
+
# @note Return value of {Renoir::Pipeline} methods is useless since "future variable" is not yet supported.
|
57
83
|
def multi(&block)
|
58
84
|
commands = pipeline_commands(&block)
|
59
85
|
slot = get_slot_from_commands(commands)
|
@@ -62,6 +88,12 @@ module Renoir
|
|
62
88
|
call_with_redirection(slot, [[:multi]] + commands + [[:exec]])
|
63
89
|
end
|
64
90
|
|
91
|
+
# Pipeline commands and call them.
|
92
|
+
#
|
93
|
+
# @yield [Renoir::Pipeline] A command pipeliner which has almost compatible interfaces with {Renoir::Client}.
|
94
|
+
# @return the value returned by a connection backend
|
95
|
+
# @raise [Renoir::RedirectionError] when too many redirections
|
96
|
+
# @note Return value of {Renoir::Pipeline} methods is useless since "future variable" is not yet supported.
|
65
97
|
def pipelined(&block)
|
66
98
|
commands = pipeline_commands(&block)
|
67
99
|
slot = get_slot_from_commands(commands)
|
@@ -70,6 +102,12 @@ module Renoir
|
|
70
102
|
call_with_redirection(slot, commands)
|
71
103
|
end
|
72
104
|
|
105
|
+
# Call a Redis command.
|
106
|
+
#
|
107
|
+
# @param [Array] command a Redis command passed to a connection backend
|
108
|
+
# @yield [Object] a connection backend may yield
|
109
|
+
# @return the value returned by a connection backend
|
110
|
+
# @raise [Renoir::RedirectionError] when too many redirections
|
73
111
|
def call(*command, &block)
|
74
112
|
slot = get_slot_from_commands([command])
|
75
113
|
|
@@ -77,15 +115,21 @@ module Renoir
|
|
77
115
|
call_with_redirection(slot, [command], &block)[0]
|
78
116
|
end
|
79
117
|
|
118
|
+
# Close all holding connections.
|
80
119
|
def close
|
81
120
|
while entry = @connections.shift
|
82
121
|
entry[1].close
|
83
122
|
end
|
84
123
|
end
|
85
124
|
|
125
|
+
# Enumerate connections of cluster nodes.
|
126
|
+
#
|
127
|
+
# @yield [Object] an connection instance of connection backend
|
128
|
+
# @return [Enumerable]
|
86
129
|
def each_node
|
87
130
|
return enum_for(:each_node) unless block_given?
|
88
131
|
|
132
|
+
refresh_slots
|
89
133
|
@cluster_info.nodes.each do |node|
|
90
134
|
fetch_connection(node).with_raw_connection do |conn|
|
91
135
|
yield conn
|
@@ -93,6 +137,7 @@ module Renoir
|
|
93
137
|
end
|
94
138
|
end
|
95
139
|
|
140
|
+
# Delegated to {#call}.
|
96
141
|
def method_missing(command, *args, &block)
|
97
142
|
call(command, *args, &block)
|
98
143
|
end
|
data/lib/renoir/cluster_info.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require "renoir/connection_adapters/reply"
|
2
2
|
|
3
3
|
module Renoir
|
4
|
+
# Adapter of backend Redis connection. {Renoir::Client} communicates with a
|
5
|
+
# backend connection through a corresponding adapter.
|
4
6
|
module ConnectionAdapters
|
5
7
|
autoload :Redis, "renoir/connection_adapters/redis"
|
6
8
|
end
|
@@ -1,20 +1,34 @@
|
|
1
1
|
module Renoir
|
2
2
|
module ConnectionAdapters
|
3
|
+
# Abstract class.
|
3
4
|
class Base
|
4
5
|
class << self
|
6
|
+
# Return keys in a `command`.
|
7
|
+
#
|
8
|
+
# @param [Array] command a command argument
|
9
|
+
# @return [Array<String>] keys
|
5
10
|
def get_keys_from_command(command)
|
6
11
|
fail "a connection adapter must override #get_keys_from_command"
|
7
12
|
end
|
8
13
|
end
|
9
14
|
|
15
|
+
# Call pipelined commands.
|
16
|
+
#
|
17
|
+
# @param [Array<Array>] commands list of commands.
|
18
|
+
# @param [Boolean] asking Call ASKING command at first if `true`
|
19
|
+
# @yield [Object] a connection backend may yield
|
10
20
|
def call(commands, asking=false, &block)
|
11
21
|
fail "a connection adapter must override #call"
|
12
22
|
end
|
13
23
|
|
24
|
+
# Close a backend connection.
|
14
25
|
def close
|
15
26
|
fail "a connection adapter must override #close"
|
16
27
|
end
|
17
28
|
|
29
|
+
# Return a backend connection.
|
30
|
+
#
|
31
|
+
# @return [Object] a backend connection instance
|
18
32
|
def with_raw_connection
|
19
33
|
fail "a connection adapter must override #with_raw_connection"
|
20
34
|
end
|
data/lib/renoir/crc16.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
# This is the CRC16 algorithm used by Redis Cluster to hash keys.
|
2
|
-
# Implementation according to CCITT standards.
|
3
|
-
#
|
4
|
-
# This is actually the XMODEM CRC 16 algorithm, using the
|
5
|
-
# following parameters:
|
6
|
-
#
|
7
|
-
# Name : "XMODEM", also known as "ZMODEM", "CRC-16/ACORN"
|
8
|
-
# Width : 16 bit
|
9
|
-
# Poly : 1021 (That is actually x^16 + x^12 + x^5 + 1)
|
10
|
-
# Initialization : 0000
|
11
|
-
# Reflect Input byte : False
|
12
|
-
# Reflect Output CRC : False
|
13
|
-
# Xor constant to output CRC : 0000
|
14
|
-
# Output for "123456789" : 31C3
|
15
1
|
module Renoir
|
2
|
+
# This is the CRC16 algorithm used by Redis Cluster to hash keys.
|
3
|
+
# Implementation according to CCITT standards.
|
4
|
+
#
|
5
|
+
# This is actually the XMODEM CRC 16 algorithm, using the
|
6
|
+
# following parameters:
|
7
|
+
#
|
8
|
+
# - Name : "XMODEM", also known as "ZMODEM", "CRC-16/ACORN"
|
9
|
+
# - Width : 16 bit
|
10
|
+
# - Poly : 1021 (That is actually x^16 + x^12 + x^5 + 1)
|
11
|
+
# - Initialization : 0000
|
12
|
+
# - Reflect Input byte : False
|
13
|
+
# - Reflect Output CRC : False
|
14
|
+
# - Xor constant to output CRC : 0000
|
15
|
+
# - Output for "123456789" : 31C3
|
16
16
|
module CRC16
|
17
17
|
def self.crc16(bytes)
|
18
18
|
crc = 0
|
data/lib/renoir/pipeline.rb
CHANGED
@@ -6,14 +6,19 @@ module Renoir
|
|
6
6
|
@commands = []
|
7
7
|
end
|
8
8
|
|
9
|
+
# Delegated to {#call}.
|
9
10
|
def eval(*args)
|
10
11
|
call(:eval, *args)
|
11
12
|
end
|
12
13
|
|
14
|
+
# Store a command for pipelining.
|
15
|
+
#
|
16
|
+
# @param [Array] a Redis command passed to a connection backend
|
13
17
|
def call(*command)
|
14
18
|
@commands << command
|
15
19
|
end
|
16
20
|
|
21
|
+
# Delegated to {#call}.
|
17
22
|
def method_missing(command, *args, &block)
|
18
23
|
call(command, *args, &block)
|
19
24
|
end
|
data/lib/renoir/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: renoir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroshi Saito
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -75,6 +75,7 @@ extra_rdoc_files: []
|
|
75
75
|
files:
|
76
76
|
- ".gitignore"
|
77
77
|
- ".travis.yml"
|
78
|
+
- ".yardopts"
|
78
79
|
- CODE_OF_CONDUCT.md
|
79
80
|
- Gemfile
|
80
81
|
- LICENSE.txt
|