class Redis::Bloomfilter

Constants

VERSION

Attributes

driver[R]
options[R]

Public Class Methods

new(options = {}) click to toggle source

Usage: Redis::Bloomfilter.new :size => 1000, :error_rate => 0.01 It creates a bloomfilter with a capacity of 1000 items and an error rate of 1%

# File lib/redis/bloomfilter.rb, line 10
def initialize(options = {})
  @options = {
    size: 1000,
    error_rate: 0.01,
    key_name: 'redis-bloomfilter',
    hash_engine: 'md5',
    redis: Redis.current,
    driver: nil
  }.merge options

  raise ArgumentError, 'options[:size] && options[:error_rate] cannot be nil' if options[:error_rate].nil? || options[:size].nil?

  # Size provided, compute hashes and bits

  @options[:size]       = options[:size]
  @options[:error_rate] = options[:error_rate] ? options[:error_rate] : @options[:error_rate]
  @options[:bits]       = Bloomfilter.optimal_m options[:size], @options[:error_rate]
  @options[:hashes]     = Bloomfilter.optimal_k options[:size], @options[:bits]

  @redis = @options[:redis] || Redis.current
  @options[:hash_engine] = options[:hash_engine] if options[:hash_engine]

  if @options[:driver].nil?
    ver = @redis.info['redis_version']

    @options[:driver] = if Gem::Version.new(ver) >= Gem::Version.new('2.6.0')
                          'lua'
                        else
                          'ruby'
                        end
  end

  driver_class = Redis::BloomfilterDriver.const_get(driver_name)
  @driver = driver_class.new @options
  @driver.redis = @redis
end
optimal_k(num_of_elements, bf_size) click to toggle source
# File lib/redis/bloomfilter.rb, line 53
def self.optimal_k(num_of_elements, bf_size)
  h = (Math.log(2) * (bf_size / num_of_elements)).round
  h += 1 if h.zero?
  h
end
optimal_m(num_of_elements, false_positive_rate = 0.01) click to toggle source

Methods used to calculate M and K Taken from en.wikipedia.org/wiki/Bloom_filter#Probability_of_false_positives

# File lib/redis/bloomfilter.rb, line 49
def self.optimal_m(num_of_elements, false_positive_rate = 0.01)
  (-1 * num_of_elements * Math.log(false_positive_rate) / (Math.log(2)**2)).round
end
version() click to toggle source
# File lib/redis/bloomfilter/version.rb, line 6
def self.version
  "redis-bloomfilter version #{VERSION}"
end

Public Instance Methods

clear() click to toggle source

It deletes a bloomfilter

# File lib/redis/bloomfilter.rb, line 70
def clear
  @driver.clear
end
include?(key) click to toggle source

It checks if a key is part of the set

# File lib/redis/bloomfilter.rb, line 65
def include?(key)
  @driver.include?(key)
end
insert(data) click to toggle source

Insert a new element

# File lib/redis/bloomfilter.rb, line 60
def insert(data)
  @driver.insert data
end

Protected Instance Methods

driver_name() click to toggle source
# File lib/redis/bloomfilter.rb, line 76
def driver_name
  @options[:driver].downcase.split('-').collect { |t| t.gsub(/(\w+)/, &:capitalize) }.join
end