haj 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 219dc1783cac1e87594e1cb9c035ebe1a9ece7636a35511d4184aca468e9e3f0
4
+ data.tar.gz: b560ac65c1cb1d7b262c9a73801038740edf4b0d3461166fbdfd9b5ae85ce8d0
5
+ SHA512:
6
+ metadata.gz: 509ec3899d10345067f6a54dde60aec8a837ca7fbb91f8a9990c97495fe862d3c7eed1ac3d39d447238090f3bec5abc9ede818cb10833ba405d79c1417b7ceff
7
+ data.tar.gz: a42dcddc1b23cf7f0f2417f1cd835b023f9218a9a77a8ed5d824f5764b58a1989ceee4c07730abcf720cf2e7a4e375bd4f8eb0d4bed7f58a206649a915aaa21c
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.env
3
+ /.mvn/
4
+ /.yardoc
5
+ /_yardoc/
6
+ /coverage/
7
+ /data/redis/*
8
+ /docker-compose.override.yml
9
+ /doc/
10
+ /Gemfile.lock
11
+ /pkg/
12
+ /spec/reports/
13
+ /tmp/
14
+
15
+ # rspec failure tracking
16
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1 @@
1
+ jruby-9.2.0.0
@@ -0,0 +1,15 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - jruby-9.2.0.0
7
+ before_install: gem install bundler -v 1.16.4
8
+ before_script:
9
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
10
+ - chmod +x ./cc-test-reporter
11
+ - ./cc-test-reporter before-build
12
+ script:
13
+ - jruby -G bin/rspec
14
+ after_script:
15
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
@@ -0,0 +1,63 @@
1
+ FROM jruby:9.2.0.0
2
+
3
+ # Bundler options
4
+ #
5
+ # The default value is taken from Travis's build options, so they should be
6
+ # good enough for most cases. For development, be sure to set a blank default
7
+ # in docker-compose.override.yml.
8
+ ARG BUNDLER_OPTS="--jobs=3 \
9
+ --retry=3 \
10
+ --deployment"
11
+
12
+ # The home directory of the gem.
13
+ #
14
+ # During development, make sure that the APP_DIR environment variable is
15
+ # identical to the variable in your docker-compose.override.yml file,
16
+ # otherwise things might not work as expected.
17
+ ENV APP_DIR="/opt/haj-rb"
18
+
19
+ # The jruby image doesn't include git but the general pattern used in
20
+ # the gemspec is to shell out to git to figure out which files are specs.
21
+ # See this line in the gemspec:
22
+ #
23
+ # `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ #
25
+ # This will make the image slightly bigger but it should be fine as it's
26
+ # meant to be mainly a development aid.
27
+ RUN apt-get update -y \
28
+ && apt-get install -y --no-install-recommends \
29
+ git-core \
30
+ && rm -rf /var/lib/apt/lists/*
31
+
32
+ # Create a non-root user
33
+ RUN groupadd -r travis \
34
+ && useradd -m -r -g travis travis
35
+ RUN mkdir -p ${APP_DIR} \
36
+ && chown -R travis:travis ${APP_DIR}
37
+
38
+ # Move the the application folder to perform all the following tasks.
39
+ WORKDIR ${APP_DIR}
40
+ # Use the non-root user to perform any commands from this point forward.
41
+ #
42
+ # NOTE: The COPY command requires the --chown flag set otherwise it will
43
+ # copy things as root.
44
+ USER travis
45
+
46
+ # Copy the gem's gemspec file so `bundle install` can run when the
47
+ # container is initialized.
48
+ #
49
+ # The added benefit is that Docker will cache this file and will not trigger
50
+ # the bundle install unless the gemspec changed on the filesystem.
51
+ #
52
+ # NOTE: If the command fails because of the --chown flag, make sure you have a
53
+ # recent stable version of Docker.
54
+ COPY --chown=travis:travis . ./
55
+
56
+ RUN bundle install ${BUNDLER_OPTS}
57
+
58
+ # Copy over the files, in case the Docker Compose file does not specify a
59
+ # mount point.
60
+ COPY --chown=travis:travis . ./
61
+
62
+ ENTRYPOINT ["jruby", "-G"]
63
+ CMD ["bin/rspec"]
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in haj.gemspec
6
+ gemspec
7
+
8
+ # A bunch of gems required for benchmarking, so we're sure we're on the right
9
+ # track and actually providing a performance gain.
10
+ gem 'benchmark-ips', '~> 2.7'
11
+
12
+ gem 'faker'
13
+ gem 'sequel', '~> 5.12'
14
+ gem 'jdbc-postgres', '~> 42.1'
15
+ gem 'redis', '~> 4.0'
16
+ gem 'jedis_rb', '~> 2.7'
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Andrei Maxim
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,86 @@
1
+ # Highly-Advanced Jedis client for Ruby
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/haj.svg)](https://badge.fury.io/rb/haj)
4
+ [![Build Status](https://travis-ci.org/andreimaxim/haj-rb.svg?branch=master)](https://travis-ci.org/andreimaxim/haj-rb)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/40b89512493cb5356076/maintainability)](https://codeclimate.com/github/andreimaxim/haj-rb/maintainability)
6
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/40b89512493cb5356076/test_coverage)](https://codeclimate.com/github/andreimaxim/haj-rb/test_coverage)
7
+
8
+ The raison d'être of this project can be pretty much described in one single
9
+ table:
10
+
11
+ ```bash
12
+ Warming up --------------------------------------
13
+ Postgres 1.000 i/100ms
14
+ Redis 1.000 i/100ms
15
+ Jedis 1.000 i/100ms
16
+ Ruby hash 5.000 i/100ms
17
+ Calculating -------------------------------------
18
+ Postgres 2.289 (± 0.0%) i/s - 12.000 in 5.248779s
19
+ Redis 0.016 (± 0.0%) i/s - 1.000 in 60.470617s
20
+ Jedis 0.047 (± 0.0%) i/s - 1.000 in 21.109477s
21
+ Ruby hash 52.735 (±13.3%) i/s - 260.000 in 5.042344s
22
+ ```
23
+
24
+ It looks slightly odd, but let's explain it a bit.
25
+
26
+ This is the result of a plain benchmark done on a Mac OS X development
27
+ machine using JRuby 9.2.0.0 and several libraries:
28
+
29
+ * [Sequel][sequel] with [jdbc-postgres][jdbc-pg] for the `Postgres` row
30
+ * Plain [redis-rb][redis-rb] for the `Redis` row
31
+ * For the `Jedis` row the [jedis_rb][jedis_rb] gem was used, which is a simple wrapper over the [jedis][jedis] Java library
32
+ * Finally, `Memory` meant using a plain Ruby hash
33
+
34
+ [sequel]: https://github.com/jeremyevans/sequel/
35
+ [jdbc-pg]: https://github.com/jruby/activerecord-jdbc-adapter/tree/master/jdbc-postgres
36
+ [redis-rb]: https://github.com/redis/redis-rb
37
+ [jedis_rb]:https://github.com/asmallworldsite/jedis_rb/tree/master/lib/jedis_rb
38
+ [jedis]: https://github.com/xetorthio/jedis
39
+
40
+ For the test, a table was created in a Postgres database that looked like a key-value store, something along the lines of:
41
+
42
+ ```sql
43
+ SQL
44
+ CREATE TABLE IF NOT EXISTS things (
45
+ k text,
46
+ v text,
47
+ PRIMARY KEY (k)
48
+ );
49
+ TRUNCATE TABLE things;
50
+ SQL
51
+ ```
52
+
53
+ The SQL query used:
54
+
55
+ ```sql
56
+ SELECT v FROM things WHERE k='#{random_key}';
57
+ ```
58
+
59
+ The Redis query used:
60
+
61
+ ```ruby
62
+ redis.get(random_key)
63
+ ```
64
+
65
+ Redis should be faster, especially when used as a key-value store, but Postgres actually blew it out of the water in this little test, which seemed odd.
66
+
67
+ First, let's talk about the elephant in the room, in this case the significant amount of time required by [redis-rb][redis-rb]: it's a plain Ruby application and a lot of time is spent in userland (280 seconds out of the 298 seconds), while the other libraries use faster languages (Java bindings for both the JDBC driver and Jedis and JRuby optimizes the hash quite nicely).
68
+
69
+ So, in this case, the language was the bottleneck and maybe some gains can be achieved if the JRuby team will look into the redis-rb gem and suggest some optimizations.
70
+
71
+ However, it's not so obvious why [jedis_rb][jedis_rb] was so slow compared to [Sequel][sequel] + [jdbc-postgres][jdbc-pg], especially since it's relying on the pretty fast [jedis][jedis] Java library (which is also one of the recommended libraries by Redis).
72
+
73
+ In this case, the answer lies in the smaller `real` time than the `total` time, which probably means that there are things happening in parallel. So the answer is probably in the connection pool.
74
+
75
+ There are two things you can do with a connection pool:
76
+
77
+ 1. Create a limited set of connections that can be reused by the application when needed.
78
+ 2. Parallelize the requests, when possible.
79
+
80
+ The [Sequel][sequel] gem was doing both, while [jedis_rb][jedis_rb] didn't even an option to set the number of concurrent connections. Actually, when digging a bit through [Sequel][sequel] but also through [jedis][jedis], it becomes rather obvious that the [Sequel][sequel] developers spent a lot of time and effort to maximize the output of the library by using as many of the connections in the connection pool as possible.
81
+
82
+ This is where HAJ comes in.
83
+
84
+ The goal of this project is to have __a more advanced connection pool__ for Jedis which can take advantage of __multiple parallel connections__ to Redis and *dramatically* increase the output.
85
+
86
+ Obviously, this is a work in progress so please don't use it in production.
@@ -0,0 +1,13 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ require 'jars/installer'
7
+
8
+ desc 'Download and vendor the jars needed'
9
+ task :setup do
10
+ Jars::Installer.vendor_jars!
11
+ end
12
+
13
+ task :default => :spec
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ # require 'haj'
5
+
6
+ require 'faker'
7
+ require 'benchmark/ips'
8
+ require 'sequel'
9
+ require 'jdbc/postgres'
10
+ require 'redis'
11
+ require 'jedis_rb'
12
+
13
+
14
+ Jdbc::Postgres.load_driver
15
+
16
+ redis = Redis.new(host: 'redis')
17
+ redis.flushall
18
+
19
+ pool = JedisRb::Pool.new(host: 'redis')
20
+
21
+ conn = Sequel.connect('jdbc:postgresql://pg/hajrb', user: 'hajrb', password: 'hajrb')
22
+
23
+ conn.run <<-SQL
24
+ CREATE TABLE IF NOT EXISTS things (
25
+ k text,
26
+ v text,
27
+ PRIMARY KEY (k)
28
+ );
29
+ TRUNCATE TABLE things;
30
+ SQL
31
+
32
+ memory = {}
33
+
34
+ (1..1000).each do |k|
35
+ v = Faker::Lorem.paragraph(rand 1..10)
36
+ conn.run("insert into things (k, v) values ('#{k}', '#{v}')")
37
+ redis.set(k, v)
38
+ memory[k]=v
39
+ end
40
+
41
+ n = 100_000
42
+ random_keys = []
43
+ n.times { random_keys << rand(1..1000) }
44
+
45
+ Benchmark.ips do |x|
46
+ x.report('Postgres') do
47
+ n.times do |i|
48
+ conn.fetch("select v from things where k='#{random_keys[i]}'")
49
+ end
50
+ end
51
+ x.report('Redis') do
52
+ n.times do |i|
53
+ redis.get(random_keys[i])
54
+ end
55
+ end
56
+ x.report('Jedis') do
57
+ n.times do |i|
58
+ pool.execute(:get, random_keys[i].to_s)
59
+ end
60
+ end
61
+ x.report('Ruby hash') do
62
+ n.times do |i|
63
+ memory[random_keys[i]]
64
+ end
65
+ end
66
+ end
67
+
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'haj'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start(__FILE__)
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env jruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rake", "rake")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env jruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rspec' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rspec-core", "rspec")
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,20 @@
1
+ version: '3'
2
+
3
+ services:
4
+
5
+ # Required for manual testing against a real Redis process.
6
+ redis:
7
+ image: "redis:3.2"
8
+ command: redis-server --appendonly yes
9
+
10
+ # The project was started due to the high performance of the
11
+ # Sequel + jdbc-postgres combo when compared with the performance
12
+ # of the existing Redis libraries on JRuby.
13
+ pg:
14
+ image: "postgres:9.6.10"
15
+
16
+ gem:
17
+ build: .
18
+ links:
19
+ - "redis:redis"
20
+ - "pg:pg"
@@ -0,0 +1,35 @@
1
+
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'haj/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'haj'
8
+ spec.version = HAJ::VERSION
9
+ spec.authors = ['Andrei Maxim']
10
+ spec.email = ['andrei@andreimaxim.ro']
11
+
12
+ spec.summary = 'Highly-Advanced Jedis client for Ruby'
13
+ spec.homepage = 'https://github.com/andreimaxim/haj-rb'
14
+ spec.license = 'MIT'
15
+
16
+ # Specify which files should be added to the gem when it is released.
17
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
19
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ end
21
+
22
+ spec.bindir = 'exe'
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ['lib']
25
+
26
+ spec.add_development_dependency 'bundler', '~> 1.16'
27
+ spec.add_development_dependency 'rake', '~> 10.0'
28
+ spec.add_development_dependency 'rspec', '~> 3.0'
29
+ spec.add_development_dependency 'simplecov', '~> 0.16'
30
+
31
+ spec.add_development_dependency 'jar-dependencies', '~> 0.3'
32
+
33
+ # The Jedis JAR
34
+ spec.requirements << "jar redis.clients:jedis, '~> 2.9.0'"
35
+ end
@@ -0,0 +1,10 @@
1
+ require 'singleton'
2
+
3
+ require 'haj_jars'
4
+
5
+ require 'haj/version'
6
+ require 'haj/pool'
7
+
8
+ module HAJ
9
+
10
+ end
@@ -0,0 +1,6 @@
1
+ module HAJ
2
+ # Class to provide a POC for better pooling.
3
+ class Pool
4
+
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ module HAJ
2
+ VERSION = '0.0.1'.freeze
3
+ end
@@ -0,0 +1,12 @@
1
+ # this is a generated file, to avoid over-writing it just delete this comment
2
+ begin
3
+ require 'jar_dependencies'
4
+ rescue LoadError
5
+ require 'redis/clients/jedis/2.9.0/jedis-2.9.0.jar'
6
+ require 'org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2.jar'
7
+ end
8
+
9
+ if defined? Jars
10
+ require_jar 'redis.clients', 'jedis', '2.9.0'
11
+ require_jar 'org.apache.commons', 'commons-pool2', '2.4.2'
12
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: haj
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Andrei Maxim
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-09-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.16'
19
+ name: bundler
20
+ prerelease: false
21
+ type: :development
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '10.0'
33
+ name: rake
34
+ prerelease: false
35
+ type: :development
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.0'
47
+ name: rspec
48
+ prerelease: false
49
+ type: :development
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.16'
61
+ name: simplecov
62
+ prerelease: false
63
+ type: :development
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.16'
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.3'
75
+ name: jar-dependencies
76
+ prerelease: false
77
+ type: :development
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.3'
83
+ description:
84
+ email:
85
+ - andrei@andreimaxim.ro
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".ruby-version"
93
+ - ".travis.yml"
94
+ - Dockerfile
95
+ - Gemfile
96
+ - LICENSE.txt
97
+ - README.md
98
+ - Rakefile
99
+ - bin/benchmark
100
+ - bin/console
101
+ - bin/rake
102
+ - bin/rspec
103
+ - bin/setup
104
+ - data/redis/.gitkeep
105
+ - docker-compose.yml
106
+ - haj.gemspec
107
+ - lib/haj.rb
108
+ - lib/haj/pool.rb
109
+ - lib/haj/version.rb
110
+ - lib/haj_jars.rb
111
+ - lib/org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2.jar
112
+ - lib/redis/clients/jedis/2.9.0/jedis-2.9.0.jar
113
+ homepage: https://github.com/andreimaxim/haj-rb
114
+ licenses:
115
+ - MIT
116
+ metadata: {}
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements:
132
+ - jar redis.clients:jedis, '~> 2.9.0'
133
+ rubyforge_project:
134
+ rubygems_version: 2.7.6
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: Highly-Advanced Jedis client for Ruby
138
+ test_files: []