oxblood 0.2.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 914d269f92807d5e874e813be77ad7a325fa6b86
4
- data.tar.gz: e8ec8e0a92d5ccc93a48271b0b44545cdc38a365
3
+ metadata.gz: 1233a81cff6072fcb573bdc595b996d499f2a414
4
+ data.tar.gz: 7b3c679039d0bf18efa45c7e6d01e8de01ba88ca
5
5
  SHA512:
6
- metadata.gz: 6a5584d343e12974e664c75b094662c72b0cc63c6c660c1c6f305d8a8d2cd7de2fe6c7361acf648fa1db7da158e532967be0fee053454e9a6ad785eaa63ecc52
7
- data.tar.gz: 2d7ca78e83a921687b56de218a0b57a1bac2a262a66fb8c33c1fb630b623691e610e53ecd01063342e363927d02fb4e77d5d084f675faf7746ba49263ee09424
6
+ metadata.gz: 3bf913dab69bd847ef4397b40a64b8adab77b4d60a35f6df6b7262f6fd46a3360cf9882cf60e9c8e27415ed29c4710fc977d011336c2c98690f672515f341962
7
+ data.tar.gz: ceb1eb09ebe2d64fd450dd189edad55e9646cef731829339f62ca27dd11656e0efbc410fd6c768c4013cd7c9057baf7e07accc5f507718bb824e9870bc703075
@@ -1,3 +1,11 @@
1
+ ## 0.3.0 (2017-04-02)
2
+ * [#26](https://github.com/etehtsea/oxblood/issues/26):
3
+ Added server commands support - [@etehtsea](https://github.com/etehtsea)
4
+ * [#21](https://github.com/etehtsea/oxblood/issues/21):
5
+ Added geo commands support - [@etehtsea](https://github.com/etehtsea)
6
+ * [#22](https://github.com/etehtsea/oxblood/issues/22):
7
+ Added scripting commands support - [@etehtsea](https://github.com/etehtsea)
8
+
1
9
  ## 0.2.0 (2017-01-18)
2
10
  * [#13](https://github.com/etehtsea/oxblood/issues/13):
3
11
  Added support for ZRANGEBYLEX/ZREMRANGEBYLEX/ZREVRANGEBYLEX - [@etehtsea](https://github.com/etehtsea)
data/README.md CHANGED
@@ -12,32 +12,33 @@ A straightforward Redis Ruby client.
12
12
  - Ruby 2.2.2+
13
13
  - JRuby 9k+
14
14
 
15
- ## Status
15
+ ## Usage
16
+ As a starting point please look at [Oxblood::Pool](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Pool) documentation.
17
+
18
+ ## Documentation
19
+ Documentation and usage examples are available on [Rubydoc](http://rubydoc.info/github/etehtsea/oxblood/master/frames).
16
20
 
17
- - Commands:
18
- - Cluster (0/20)
21
+ - [Pipelining](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Pipeline)
22
+ - [Connection pooling](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Pool)
23
+ - [Connection resiliency](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/RSocket)
24
+ - Commands groups:
25
+ - Cluster
19
26
  - [Connection](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Connection)
20
- - Geo (0/6)
27
+ - [Geo](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Geo)
21
28
  - [Hashes](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Hashes)
22
29
  - [HyperLogLog](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/HyperLogLog)
23
- - [Keys](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Keys) (19/22) (See [#4], [#6], [#7])
30
+ - [Keys](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Keys)
24
31
  - [Lists](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Lists)
25
- - Pub/Sub (0/6)
26
- - Scripting (0/7)
27
- - [Server](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Server) (2/31)
32
+ - Pub/Sub
33
+ - [Scripting](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Scripting)
34
+ - [Server](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Server)
28
35
  - [Sets](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Sets)
29
36
  - [Sorted Sets](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/SortedSets)
30
- - [Strings](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Strings) (23/24) (See [#16])
37
+ - [Strings](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Strings)
31
38
  - [Transactions](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Commands/Transactions)
32
- - [Pipeling](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Pipeline)
33
- - [Connection pooling](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Pool)
34
- - [Connection resiliency](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/RSocket)
35
39
 
36
- ## Usage
37
- As a starting point please look at [Oxblood::Pool](http://www.rubydoc.info/github/etehtsea/oxblood/master/Oxblood/Pool) documentation.
38
-
39
- ## Documentation
40
- Documentation and usage examples are available on [Rubydoc](http://rubydoc.info/github/etehtsea/oxblood/master/frames).
40
+ ## Performance
41
+ Available benchmark results are available [here](https://github.com/etehtsea/oxblood/wiki/Performance).
41
42
 
42
43
  ## Continuous Integration
43
44
  You can check CI status at [Travis CI](https://travis-ci.org/etehtsea/oxblood).
@@ -47,9 +48,3 @@ Bug reports and pull requests are welcome on [GitHub](https://github.com/etehtse
47
48
 
48
49
  ## License
49
50
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
50
-
51
- [#4]: https://github.com/etehtsea/oxblood/issues/4
52
- [#6]: https://github.com/etehtsea/oxblood/issues/6
53
- [#7]: https://github.com/etehtsea/oxblood/issues/7
54
- [#16]: https://github.com/etehtsea/oxblood/issues/16
55
- [#19]: https://github.com/etehtsea/oxblood/issues/19
@@ -2,10 +2,12 @@ require 'oxblood/commands/hashes'
2
2
  require 'oxblood/commands/hyper_log_log'
3
3
  require 'oxblood/commands/strings'
4
4
  require 'oxblood/commands/connection'
5
+ require 'oxblood/commands/geo'
5
6
  require 'oxblood/commands/server'
6
7
  require 'oxblood/commands/keys'
7
8
  require 'oxblood/commands/lists'
8
9
  require 'oxblood/commands/sets'
10
+ require 'oxblood/commands/scripting'
9
11
  require 'oxblood/commands/sorted_sets'
10
12
  require 'oxblood/commands/transactions'
11
13
 
@@ -15,10 +17,12 @@ module Oxblood
15
17
  include HyperLogLog
16
18
  include Strings
17
19
  include Connection
20
+ include Geo
18
21
  include Server
19
22
  include Keys
20
23
  include Lists
21
24
  include Sets
25
+ include Scripting
22
26
  include SortedSets
23
27
  include Transactions
24
28
  end
@@ -0,0 +1,169 @@
1
+ module Oxblood
2
+ module Commands
3
+ module Geo
4
+ # Add one or more geospatial items in the geospatial index represented
5
+ # using a sorted set.
6
+ # @see https://redis.io/commands/geoadd
7
+ #
8
+ # @param [String] key
9
+ # @param [Array<[String, String, String]>] items
10
+ # Geospatial items (longitude, latitude, member)
11
+ #
12
+ # @return [Integer] The number of elements added to the sorted set,
13
+ # not including elements already existing for which the score was updated.
14
+ def geoadd(key, *items)
15
+ run(*items.unshift(:GEOADD, key))
16
+ end
17
+
18
+ # Returns members of a geospatial index as standard geohash strings.
19
+ # @see https://redis.io/commands/geohash
20
+ #
21
+ # @param [String] key
22
+ # @param [String, Array<String>] members
23
+ #
24
+ # @return [Array] The command returns an array where each element is
25
+ # the Geohash corresponding to each member name passed as argument to the command.
26
+ def geohash(key, *members)
27
+ run(*members.unshift(:GEOHASH, key))
28
+ end
29
+
30
+ # Returns longitude and latitude of members of a geospatial index.
31
+ # @see https://redis.io/commands/geopos
32
+ #
33
+ # @param [String] key
34
+ # @param [String, Array<String>] members
35
+ #
36
+ # @return [Array] an array where each element is a two elements array
37
+ # representing longitude and latitude (x,y) of each member name passed
38
+ # as argument to the command.
39
+ # Non existing elements are reported as `nil` elements of the array.
40
+ def geopos(key, *members)
41
+ run(*members.unshift(:GEOPOS, key))
42
+ end
43
+
44
+ # Returns the distance between two members of a geospatial index.
45
+ # @see https://redis.io/commands/geodist
46
+ #
47
+ # @param [String] key
48
+ # @param [String] member1 name of geospatial index member
49
+ # @param [String] member2 name of geospatial index member
50
+ # @param [nil, String] unit that could be one of the following and
51
+ # defaults to meters: m (meters), km (kilometers), mi (miles), ft (feet).
52
+ #
53
+ # @return [nil, String] The command returns the distance as a double
54
+ # (represented as a string) in the specified unit, or nil if one or
55
+ # both elements are missing.
56
+ def geodist(key, member1, member2, unit = nil)
57
+ if unit
58
+ run(:GEODIST, key, member1, member2, unit)
59
+ else
60
+ run(:GEODIST, key, member1, member2)
61
+ end
62
+ end
63
+
64
+ # Query a sorted set representing a geospatial index to fetch members
65
+ # matching a given maximum distance from a point.
66
+ # @see https://redis.io/commands/georadius
67
+ #
68
+ # @param [String] key
69
+ # @param [String] longitude
70
+ # @param [String] latitude
71
+ # @param [Integer] radius
72
+ # @param [Symbol] unit that could be one of the following and defaults to
73
+ # meters: m (meters), km (kilometers), mi (miles), ft (feet).
74
+ # @param [Hash] opts
75
+ #
76
+ # @option opts [Boolean] :withcoord Also return the longitude, latitude
77
+ # coordinates of the matching items.
78
+ # @option opts [Boolean] :withdist Also return the distance of
79
+ # the returned items from the specified center. The distance is returned
80
+ # in the same unit as the unit specified as the radius argument of
81
+ # the command.
82
+ # @option opts [Boolean] :withhash Also return the raw geohash-encoded
83
+ # sorted set score of the item, in the form of a 52 bit unsigned integer.
84
+ # This is only useful for low level hacks or debugging and is otherwise
85
+ # of little interest for the general user.
86
+ # @option opts [Symbol] :order The command default is to return unsorted
87
+ # items. Two different sorting methods can be invoked using the following
88
+ # two options:
89
+ # - ASC: from the nearest to the farthest, relative to the center.
90
+ # - DESC: from the farthest to the nearest, relative to the center.
91
+ # @option opts [Integer] :count limit the results to the first N matching items.
92
+ # @option opts [String] :store generates a valid geo index and stores
93
+ # result to key
94
+ # @option opts [String] :storedist stores calculated distances to key.
95
+ #
96
+ # @return [Array] See https://redis.io/commands/georadius#return-value
97
+ # @return [Integer] if STORE or STOREDIST option was used
98
+ def georadius(key, longitude, latitude, radius, unit, opts = {})
99
+ args = [:GEORADIUS, key, longitude, latitude, radius, unit]
100
+ add_georadius_opts!(args, opts)
101
+ run(*args)
102
+ end
103
+
104
+ # Query a sorted set representing a geospatial index to fetch members
105
+ # matching a given maximum distance from a member.
106
+ # @see https://redis.io/commands/georadiusbymember
107
+ #
108
+ # @param [String] key
109
+ # @param [String] member
110
+ # @param [Integer] radius
111
+ # @param [Symbol] unit that could be one of the following and defaults to
112
+ # meters: m (meters), km (kilometers), mi (miles), ft (feet).
113
+ # @param [Hash] opts
114
+ #
115
+ # @option opts [Boolean] :withcoord Also return the longitude, latitude
116
+ # coordinates of the matching items.
117
+ # @option opts [Boolean] :withdist Also return the distance of
118
+ # the returned items from the specified center. The distance is returned
119
+ # in the same unit as the unit specified as the radius argument of
120
+ # the command.
121
+ # @option opts [Boolean] :withhash Also return the raw geohash-encoded
122
+ # sorted set score of the item, in the form of a 52 bit unsigned integer.
123
+ # This is only useful for low level hacks or debugging and is otherwise
124
+ # of little interest for the general user.
125
+ # @option opts [Symbol] :order The command default is to return unsorted
126
+ # items. Two different sorting methods can be invoked using the following
127
+ # two options:
128
+ # - ASC: from the nearest to the farthest, relative to the center.
129
+ # - DESC: from the farthest to the nearest, relative to the center.
130
+ # @option opts [Integer] :count limit the results to the first N matching items.
131
+ # @option opts [String] :store generates a valid geo index and stores
132
+ # result to key
133
+ # @option opts [String] :storedist stores calculated distances to key.
134
+ #
135
+ # @return [Array] See https://redis.io/commands/georadius#return-value
136
+ # @return [Integer] if STORE or STOREDIST option was used
137
+ def georadiusbymember(key, member, radius, unit, opts = {})
138
+ args = [:GEORADIUSBYMEMBER, key, member, radius, unit]
139
+ add_georadius_opts!(args, opts)
140
+ run(*args)
141
+ end
142
+
143
+ private
144
+
145
+ # @note Mutates args argument!
146
+ def add_georadius_opts!(args, opts)
147
+ args << :WITHCOORD if opts[:withcoord]
148
+ args << :WITHDIST if opts[:withdist]
149
+ args << :WITHHASH if opts[:withhash]
150
+
151
+ if order = opts[:order]
152
+ args << order
153
+ end
154
+
155
+ if count = opts[:count]
156
+ args.push(:COUNT, count)
157
+ end
158
+
159
+ if store_key = opts[:store]
160
+ args.push(:STORE, store_key)
161
+ end
162
+
163
+ if storedist_key = opts[:storedist]
164
+ args.push(:STOREDIST, storedist_key)
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,102 @@
1
+ require 'oxblood/commands/scripting'
2
+
3
+ module Oxblood
4
+ module Commands
5
+ module Scripting
6
+ # Execute a Lua script server side
7
+ # @see https://redis.io/commands/eval
8
+ #
9
+ # @example
10
+ # session.eval("return redis.call('set','foo','bar')", 0)
11
+ # # => 'OK'
12
+ #
13
+ # @example
14
+ # session.eval("return redis.call('set',KEYS[1],'bar')", 1, :foo)
15
+ # # => 'OK'
16
+ #
17
+ # @example
18
+ # session.eval("return 10", 0)
19
+ # # => 10
20
+ #
21
+ # @example
22
+ # session.eval("return {1,2,{3,'Hello World!'}}", 0)
23
+ # # => [1, 2, [3, 'Hello World!']]
24
+ #
25
+ # @example
26
+ # session.eval("return redis.call('get','foo')", 0)
27
+ # # => 'bar'
28
+ #
29
+ # @example
30
+ # session.eval("return {1,2,3.3333,'foo',nil,'bar'}", 0)
31
+ # # => [1, 2, 3, 'foo']
32
+ #
33
+ # @param [String] script
34
+ # @param [Integer] numkeys
35
+ # @param [String, Array<String>] keys_and_args
36
+ def eval(script, numkeys, *keys_and_args)
37
+ run(:EVAL, script, numkeys, keys_and_args)
38
+ end
39
+
40
+ # Execute a Lua script server side
41
+ # @see https://redis.io/commands/evalsha
42
+ #
43
+ # @param [String] sha1
44
+ # @param [Integer] numkeys
45
+ # @param [String, Array<String>] keys_and_args
46
+ def evalsha(sha1, numkeys, *keys_and_args)
47
+ run(:EVALSHA, sha1, numkeys, keys_and_args)
48
+ end
49
+
50
+ # Set the debug mode for executed scripts.
51
+ # @see https://redis.io/commands/script-debug
52
+ #
53
+ # @param [Symbol] mode
54
+ #
55
+ # @return [String] 'OK'
56
+ # @return [RError] if wrong mode passed
57
+ def script_debug(mode)
58
+ run(:SCRIPT, :DEBUG, mode)
59
+ end
60
+
61
+ # Check existence of scripts in the script cache.
62
+ # @see https://redis.io/commands/script-exists
63
+ #
64
+ # @param [String, Array<String>] sha1_digests
65
+ #
66
+ # @return [Array<Integer>] For every corresponding SHA1 digest of a script
67
+ # that actually exists in the script cache, an 1 is returned,
68
+ # otherwise 0 is returned.
69
+ def script_exists(*sha1_digests)
70
+ run(*sha1_digests.unshift(:SCRIPT, :EXISTS))
71
+ end
72
+
73
+ # Remove all the scripts from the script cache.
74
+ # @see https://redis.io/commands/script-flush
75
+ #
76
+ # @return [String] 'OK'
77
+ def script_flush
78
+ run(:SCRIPT, :FLUSH)
79
+ end
80
+
81
+ # Kill the script currently in execution.
82
+ # @see https://redis.io/commands/script-kill
83
+ #
84
+ # @return [String] 'OK'
85
+ # @return [RError] if there is no script to kill
86
+ def script_kill
87
+ run(:SCRIPT, :KILL)
88
+ end
89
+
90
+ # Load the specified Lua script into the script cache.
91
+ # @see https://redis.io/commands/script-load
92
+ #
93
+ # @param [String] script
94
+ #
95
+ # @return [String] This command returns the SHA1 digest of the script
96
+ # added into the script cache
97
+ def script_load(script)
98
+ run(:SCRIPT, :LOAD, script)
99
+ end
100
+ end
101
+ end
102
+ end
@@ -1,16 +1,211 @@
1
1
  module Oxblood
2
2
  module Commands
3
3
  module Server
4
- # Remove all keys from the current database
4
+ # Asynchronously rewrite the append-only file.
5
+ # @see https://redis.io/commands/bgrewriteaof
6
+ #
7
+ # @return [String] always 'OK'
8
+ def bgrewriteaof
9
+ run(:BGREWRITEAOF)
10
+ end
11
+
12
+ # Asynchronously save the dataset to disk
13
+ # @see https://redis.io/commands/bgsave
14
+ #
15
+ # @return [String] command status message
16
+ def bgsave
17
+ run(:BGSAVE)
18
+ end
19
+
20
+ # Get the current conneciton name.
21
+ # @see https://redis.io/commands/client-getname
22
+ #
23
+ # @return [nil, String] client name
24
+ def client_getname
25
+ run(:CLIENT, :GETNAME)
26
+ end
27
+
28
+ # Get the list of client connections.
29
+ # @see https://redis.io/commands/client-list
30
+ #
31
+ # @return [String] client list in the formatted string
32
+ def client_list
33
+ run(:CLIENT, :LIST)
34
+ end
35
+
36
+ # Kill the connection of a client.
37
+ # @see https://redis.io/commands/client-kill
38
+ #
39
+ # @param [Hash, String] opts_or_addr hash of options or addr in
40
+ # an addr:port form.
41
+ #
42
+ # @option opts_or_addr [Integer] :id unique client ID.
43
+ # @option opts_or_addr [Symbol] :type Close connections of all the clients
44
+ # of specified type (for example: `normal`, `master`, `slave`, `pubsub`).
45
+ # @option opts_or_addr [String] :addr ip:port which matches a line
46
+ # returned by CLIENT LIST command (addr field).
47
+ # @option opts_or_addr [Boolean] :skipme Skip client that is calling this
48
+ # command (enabled by default).
49
+ #
50
+ # @return [String] 'OK'
51
+ # @return [Integer] the number of clients killed when called with
52
+ # the filter/value format
53
+ def client_kill(opts_or_addr = {})
54
+ if opts_or_addr.is_a?(String)
55
+ run(:CLIENT, :KILL, opts_or_addr)
56
+ else
57
+ args = [:CLIENT, :KILL]
58
+
59
+ if v = opts_or_addr[:id]
60
+ args.push(:ID, v)
61
+ end
62
+
63
+ if v = opts_or_addr[:type]
64
+ args.push(:TYPE, v)
65
+ end
66
+
67
+ if v = opts_or_addr[:addr]
68
+ args.push(:ADDR, v)
69
+ end
70
+
71
+ if opts_or_addr.key?(:skipme)
72
+ case opts_or_addr[:skipme]
73
+ when false, 'no'.freeze
74
+ args.push(:SKIPME, 'no'.freeze)
75
+ when true, 'yes'.freeze
76
+ args.push(:SKIPME, 'yes'.freeze)
77
+ end
78
+ end
79
+
80
+ run(*args)
81
+ end
82
+ end
83
+
84
+ # Set the current connection name.
85
+ # @see https://redis.io/commands/client-setname
86
+ #
87
+ # @param [String] connection_name
88
+ #
89
+ # @return [String] 'OK' in case of success.
90
+ def client_setname(connection_name)
91
+ run(:CLIENT, :SETNAME, connection_name)
92
+ end
93
+
94
+ # Stop processing commands from clients for some time.
95
+ # @see https://redis.io/commands/client-pause
96
+ #
97
+ # @param [Integer] timeout in milliseconds
98
+ #
99
+ # @return [String] 'OK' in case of success.
100
+ def client_pause(timeout)
101
+ run(:CLIENT, :PAUSE, timeout)
102
+ end
103
+
104
+ # Get array of Redis command details.
105
+ # @see https://redis.io/commands/command
106
+ #
107
+ # @return [Array] nested list of command details
108
+ def command
109
+ run(:COMMAND)
110
+ end
111
+
112
+ # Get total number of Redis commands.
113
+ # @see https://redis.io/commands/command-count
114
+ #
115
+ # @return [Integer] number of commands returned by COMMAND
116
+ def command_count
117
+ run(:COMMAND, :COUNT)
118
+ end
119
+
120
+ # Extract keys given a full Redis command
121
+ # @see https://redis.io/commands/command-getkeys
122
+ #
123
+ # @return [Array] list of keys from your command
124
+ def command_getkeys(*args)
125
+ run(*args.unshift(:COMMAND, :GETKEYS))
126
+ end
127
+
128
+ # Get array of specific Redis command details.
129
+ # @see https://redis.io/commands/command-info
130
+ #
131
+ # @param [String, Array<String>] command_names
132
+ #
133
+ # @return [Array] nested list of command details.
134
+ def command_info(*command_names)
135
+ run(*command_names.unshift(:COMMAND, :INFO))
136
+ end
137
+
138
+ # Get the value of a configuration parameter
139
+ # @see https://redis.io/commands/config-get
140
+ #
141
+ # @param [String] parameter
142
+ #
143
+ # @return [Array] parameters with values
144
+ def config_get(parameter)
145
+ run(:CONFIG, :GET, parameter)
146
+ end
147
+
148
+ # Rewrite the configuration file with the in memory configuration
149
+ # @see https://redis.io/commands/config-rewrite
150
+ #
151
+ # @return [String] 'OK'
152
+ def config_rewrite
153
+ run(:CONFIG, :REWRITE)
154
+ end
155
+
156
+ # Set a configuration parameter to the given value
157
+ # @see https://redis.io/commands/config-set
158
+ #
159
+ # @param [String] parameter
160
+ # @param [String] value
161
+ #
162
+ # @return [String] OK if parameter was set properly.
163
+ def config_set(parameter, value)
164
+ run(:CONFIG, :SET, parameter, value)
165
+ end
166
+
167
+ # Reset the stats returned by INFO
168
+ # @see https://redis.io/commands/config-resetstat
169
+ #
170
+ # @return [String] 'OK'
171
+ def config_resetstat
172
+ run(:CONFIG, :RESETSTAT)
173
+ end
174
+
175
+ # Return the number of keys in the selected database
176
+ # @see https://redis.io/commands/dbsize
177
+ #
178
+ # @return [Integer] selected database size
179
+ def dbsize
180
+ run(:DBSIZE)
181
+ end
182
+
183
+ # Remove all keys from all databases.
184
+ # @see https://redis.io/commands/flushall
185
+ #
186
+ # @param [Hash] opts
187
+ #
188
+ # @option opts [Boolean] :async
189
+ #
190
+ # @return [String] 'OK'
191
+ def flushall(opts = {})
192
+ opts[:async] ? run(:FLUSHALL, :ASYNC) : run(:FLUSHALL)
193
+ end
194
+
195
+ # Remove all keys from the current database.
5
196
  # @see http://redis.io/commands/flushdb
6
197
  #
198
+ # @param [Hash] opts
199
+ #
200
+ # @option opts [Boolean] :async
201
+ #
7
202
  # @return [String] should always return 'OK'
8
- def flushdb
9
- run(:FLUSHDB)
203
+ def flushdb(opts = {})
204
+ opts[:async] ? run(:FLUSHDB, :ASYNC) : run(:FLUSHDB)
10
205
  end
11
206
 
12
207
  # Returns information and statistics about the server in a format that is
13
- # simple to parse by computers and easy to read by humans
208
+ # simple to parse by computers and easy to read by humans.
14
209
  # @see http://redis.io/commands/info
15
210
  #
16
211
  # @param [String] section used to select a specific section of information
@@ -19,6 +214,94 @@ module Oxblood
19
214
  def info(section = nil)
20
215
  section ? run(:INFO, section) : run(:INFO)
21
216
  end
217
+
218
+ # Get the UNIX timestamp of the last successful save to disk.
219
+ # @see https://redis.io/commands/lastsave
220
+ #
221
+ # @return [Integer] an UNIX timestamp.
222
+ def lastsave
223
+ run(:LASTSAVE)
224
+ end
225
+
226
+ # Return the role of the instance in the context of replication.
227
+ # @see https://redis.io/commands/role
228
+ #
229
+ # @return [Array] where the first element is one of master, slave,
230
+ # sentinel and the additional elements are role-specific as illustrated
231
+ # above.
232
+ def role
233
+ run(:ROLE)
234
+ end
235
+
236
+ # Synchronously save the dataset to disk.
237
+ # @see https://redis.io/commands/save
238
+ #
239
+ # @return [String] 'OK'
240
+ def save
241
+ run(:SAVE)
242
+ end
243
+
244
+ # Synchronously save the dataset to disk and then shutdown the server.
245
+ # @see https://redis.io/commands/shutdown
246
+ #
247
+ # @param [Hash] opts
248
+ #
249
+ # @option opts [Boolean] :save truthy value acts as SAVE and explicit
250
+ # `false` value acts as NOSAVE. `nil` or absence of option don't add anything.
251
+ #
252
+ # @return [RError] in case of failure and nothing
253
+ # @return [nil] in case of success
254
+ def shutdown(opts = {})
255
+ case opts[:save]
256
+ when nil
257
+ run(:SHUTDOWN)
258
+ when false
259
+ run(:SHUTDOWN, :NOSAVE)
260
+ else
261
+ run(:SHUTDOWN, :SAVE)
262
+ end
263
+ rescue Errno::ECONNRESET
264
+ nil
265
+ end
266
+
267
+ # Make the server a slave of another instance, or promote it as master.
268
+ # @see https://redis.io/commands/slaveof
269
+ #
270
+ # @example Make server slave
271
+ # session.slaveof('localhost', 7777)
272
+ # @example Promote to master
273
+ # session.slaveof(:NO, :ONE)
274
+ #
275
+ # @param [String] host
276
+ # @param [String] port
277
+ #
278
+ # @return [String] 'OK'
279
+ def slaveof(host, port)
280
+ run(:SLAVEOF, host, port)
281
+ end
282
+
283
+ # Manages the Redis slow queries log.
284
+ # @see https://redis.io/commands/slowlog
285
+ #
286
+ # @param [Symbol] subcommand For example :len, :reset, :get
287
+ # @param [String] argument
288
+ #
289
+ # @return [Integer] for :len subcommand
290
+ # @return [String] 'OK' for :reset subcommand
291
+ # @return [Array] for :get subcommand
292
+ def slowlog(subcommand, argument = nil)
293
+ args = [:SLOWLOG, subcommand]
294
+ args << argument if argument
295
+ run(*args)
296
+ end
297
+
298
+ # Returns the current server time.
299
+ # @see https://redis.io/commands/time
300
+ #
301
+ # @return [Array<String, String>] unix time in seconds and microseconds.
302
+ def time
303
+ run(:TIME)
304
+ end
22
305
  end
23
306
  end
24
307
  end
@@ -3,7 +3,7 @@ require 'oxblood/commands'
3
3
 
4
4
  module Oxblood
5
5
  # Redis pipeling class. Commands won't be send until {#sync} is called.
6
- # Error responses won't be raises and should be checked manually in the
6
+ # Error responses won't be raised and should be checked manually in the
7
7
  # responses array.
8
8
  # @see http://redis.io/topics/pipelining#redis-pipelining
9
9
  #
@@ -8,7 +8,7 @@ module Oxblood
8
8
  #
9
9
  # @example
10
10
  # pool = Oxblood::Pool.new(size: 8)
11
- # pool.with { |c| c.ping } # => 'PONG'
11
+ # pool.with { |s| s.ping } # => 'PONG'
12
12
  class Pool
13
13
  # Initialize connection pool
14
14
  #
@@ -1,3 +1,3 @@
1
1
  module Oxblood
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oxblood
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Shabanov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-18 00:00:00.000000000 Z
11
+ date: 2017-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -118,11 +118,13 @@ files:
118
118
  - lib/oxblood.rb
119
119
  - lib/oxblood/commands.rb
120
120
  - lib/oxblood/commands/connection.rb
121
+ - lib/oxblood/commands/geo.rb
121
122
  - lib/oxblood/commands/hashes.rb
122
123
  - lib/oxblood/commands/hyper_log_log.rb
123
124
  - lib/oxblood/commands/keys.rb
124
125
  - lib/oxblood/commands/lists.rb
125
126
  - lib/oxblood/commands/scan.rb
127
+ - lib/oxblood/commands/scripting.rb
126
128
  - lib/oxblood/commands/server.rb
127
129
  - lib/oxblood/commands/sets.rb
128
130
  - lib/oxblood/commands/sorted_sets.rb
@@ -158,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
160
  version: '0'
159
161
  requirements: []
160
162
  rubyforge_project:
161
- rubygems_version: 2.6.8
163
+ rubygems_version: 2.6.10
162
164
  signing_key:
163
165
  specification_version: 4
164
166
  summary: A Ruby Redis client