redis-bloomfilter 0.0.1 → 0.0.2
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/README.md +1 -1
- data/lib/redis/bloomfilter.rb +13 -2
- data/redis-bloomfilter.gemspec +1 -0
- data/spec/redis_bloomfilter_spec.rb +24 -0
- data/spec/spec_helper.rb +3 -1
- metadata +18 -2
data/README.md
CHANGED
@@ -85,7 +85,7 @@ The lua version is about ~3 times faster than the pure-Ruby version
|
|
85
85
|
|
86
86
|
Lua code is taken from https://github.com/ErikDubbelboer/redis-lua-scaling-bloom-filter
|
87
87
|
|
88
|
-
1.000.000 ~= 1.5Mb
|
88
|
+
1.000.000 ~= 1.5Mb occupied on Redis
|
89
89
|
|
90
90
|
Contributing to redis-bloomfilter
|
91
91
|
----------------
|
data/lib/redis/bloomfilter.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Redis
|
2
2
|
class Bloomfilter
|
3
3
|
|
4
|
-
VERSION = "0.0.
|
4
|
+
VERSION = "0.0.2"
|
5
5
|
|
6
6
|
def self.version
|
7
7
|
"redis-bloomfilter version #{VERSION}"
|
@@ -19,7 +19,7 @@ class Redis
|
|
19
19
|
:key_name => 'redis-bloomfilter',
|
20
20
|
:hash_engine => 'md5',
|
21
21
|
:redis => Redis.current,
|
22
|
-
:driver =>
|
22
|
+
:driver => nil
|
23
23
|
}.merge options
|
24
24
|
|
25
25
|
raise ArgumentError, "options[:size] && options[:error_rate] cannot be nil" if options[:error_rate].nil? || options[:size].nil?
|
@@ -33,6 +33,17 @@ class Redis
|
|
33
33
|
|
34
34
|
@redis = @options[:redis] || Redis.current
|
35
35
|
@options[:hash_engine] = options[:hash_engine] if options[:hash_engine]
|
36
|
+
|
37
|
+
if @options[:driver].nil?
|
38
|
+
ver = @redis.info['redis_version']
|
39
|
+
|
40
|
+
if Gem::Version.new(ver) >= Gem::Version.new('2.6.0')
|
41
|
+
@options[:driver] = 'lua'
|
42
|
+
else
|
43
|
+
@options[:driver] = 'ruby'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
36
47
|
driver_class = Redis::BloomfilterDriver.const_get(driver_name)
|
37
48
|
@driver = driver_class.new @options
|
38
49
|
@driver.redis = @redis
|
data/redis-bloomfilter.gemspec
CHANGED
@@ -32,6 +32,21 @@ describe Redis::Bloomfilter do
|
|
32
32
|
expect { Redis::Bloomfilter.new :size => 123,:error_rate => 0.01, :driver => 'bibu' }.to raise_error(NameError)
|
33
33
|
end
|
34
34
|
|
35
|
+
it 'should choose the right driver based on the Redis version' do
|
36
|
+
|
37
|
+
redis_mock = flexmock("redis")
|
38
|
+
redis_mock.should_receive(:info).and_return({'redis_version' => '2.6.0'})
|
39
|
+
redis_mock.should_receive(:script).and_return([true, true])
|
40
|
+
redis_mock_2_5 = flexmock("redis_2_5")
|
41
|
+
redis_mock_2_5.should_receive(:info).and_return({'redis_version' => '2.5.0'})
|
42
|
+
|
43
|
+
bf = factory({:size => 1000, :error_rate => 0.01, :key_name => 'ossom', :redis => redis_mock}, nil)
|
44
|
+
bf.driver.should be_kind_of(Redis::BloomfilterDriver::Lua)
|
45
|
+
|
46
|
+
bf = factory({:size => 1000, :error_rate => 0.01, :key_name => 'ossom', :redis => redis_mock_2_5}, nil)
|
47
|
+
bf.driver.should be_kind_of(Redis::BloomfilterDriver::Ruby)
|
48
|
+
end
|
49
|
+
|
35
50
|
it 'should create a Redis::Bloomfilter object' do
|
36
51
|
bf = factory({:size => 1000, :error_rate => 0.01, :key_name => 'ossom'}, 'ruby')
|
37
52
|
bf.should be
|
@@ -72,4 +87,13 @@ describe Redis::Bloomfilter do
|
|
72
87
|
end
|
73
88
|
end
|
74
89
|
|
90
|
+
it 'should be a scalable bloom filter' do
|
91
|
+
bf = factory({:size => 10, :error_rate => 0.01, :key_name => '__test_bf'},'lua')
|
92
|
+
bf.clear
|
93
|
+
e = test_error_rate(bf, 1000)
|
94
|
+
e.should be < bf.options[:error_rate]
|
95
|
+
bf.clear
|
96
|
+
|
97
|
+
end
|
98
|
+
|
75
99
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,6 +8,7 @@ RSpec.configure do |config|
|
|
8
8
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
9
|
config.run_all_when_everything_filtered = true
|
10
10
|
config.filter_run :focus
|
11
|
+
config.mock_with :flexmock
|
11
12
|
|
12
13
|
# Run specs in random order to surface order dependencies. If you find an
|
13
14
|
# order dependency and want to debug it, you can fix the order by providing
|
@@ -17,4 +18,5 @@ RSpec.configure do |config|
|
|
17
18
|
end
|
18
19
|
|
19
20
|
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
20
|
-
require
|
21
|
+
require "redis-bloomfilter"
|
22
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-bloomfilter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: hiredis
|
@@ -59,6 +59,22 @@ dependencies:
|
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: flexmock
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
62
78
|
description: ! "\n Adds Redis::Bloomfilter class which can be used as ditributed
|
63
79
|
bloom filter implementation on Redis.\n A Bloom filter is a space-efficient probabilistic
|
64
80
|
data structure that is used to test whether an element is a member of a set.\n "
|