This gem implements HeavyKeeper algorithm, based on the paper with the same name: https://www.usenix.org/conference/atc18/presentation/gong
The interface is designed to be similar with ReBloom TopK datastructure (DS) (https://oss.redis.com/redisbloom/TopK_Commands/).
This is a naive implementation of HeavyKeeper, probably not very optimized. We use multiple Redis DSs:
- A hash with maximum depth * width items to act as a bucket to store main counter
- A sorted set with maximum K elements to act as a MinHeap
- A hash with maximum K elements to store more correct counter of the element in MinHeap
Add this line to your application's Gemfile:
gem 'heavy_keeper'You will need to add an initializer to provide some configuration:
HeavyKeeper.configure do |config|
config.cache_prefix = 'cache_prefix'.freeze # currently used as prefix for the redis data structures.
config.storage = Redis.new # a Redis store, at least version 4.0
endIn general, you will only interact with an instance of the HeavyKeeper::TopK class.
These are the most relevant instance methods (see code comments for more detail):
reserve(name, top_k: size, width:, depth:, decay:) - sets up a Top K list with specified options
increase_by(name, *items) - add an array of items to a list
list(name) - returns full list of items in Top K list
clear(name) - deletes list
remove(name, item) - reset the counter of the targeted item in the list
After checking out the repo, run bin/setup to install dependencies. Then, run bundle exec rspec to run the tests.
To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.
Bug reports and pull requests are welcome on GitHub at https://github.com/Kaligo/heavy_keeper.