0.0
No commit activity in last 3 years
No release in over 3 years
Asynchronous key-value storage system
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

> 0.0.0
> 0.0.0
 Project Readme

AsyncStorage

Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file lib/async_storage. To experiment with that code, run bin/console for an interactive prompt.

TODO: Delete this and the text above, and describe your gem

Installation

Add this line to your application's Gemfile:

gem 'async_storage'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install async_storage

Usage

** Idea about the API of this gem. Update accordingly before release it

Define global configurations

# Configurations
AsyncStorage.configuration do |config|
  config.redis = ConnectionPool.new(size: 10, timeout: 1) do
    Redis.new(url: ENV.fetch('REDIS_URL', 'redis://0.0.0.0:6379'))
  end
  config.namespace = 'async_storage'  # Default to 'async_storage'
  config.expires_in = 3_600           # Default to nil
  config.circuit_breaker = true       # Call the resolver instead of thrown redis connection error when the redis service is down. Default to true
end

Useful methods to get, set and check data

# app/resolvers/user_tweets_resolver.rb
class UserTweetsResolver
  def call(user_id)
    # Return JSON friendly object
    { 'user_id' => user_id, 'tweets' => Twitter::API.tweets(user_id).as_json }
  end
end

AsyncStorage[UserTweetResolver].get('123') # Try to retrieve data. If does not exist enqueue a Background Job and return nil
AsyncStorage[UserTweetResolver].get!('123') # Try to retrieve data. If does not exist imediate call the Resolver and return data
AsyncStorage[UserTweetResolver, namespace: current_site.id].get(9) # Create a new Set using site id namepace
AsyncStorage[UserTweetResolver, expires_in: 60].get(9) # Overwrite global expires_in
class Site
  # site.cache.user_tweets.get(@user.id)
  def cache
    Cache.new(self.slug)
  end

  class Cache
    RESOLVERS = {
      user_tweets: UserTweetsResolver,
    }.freeze

    RESOLVERS.each do |method, resolver|
      define_method method do
        AsyncStorage[resolver, namespace: @namespace]
      end
    end

    def initialize(namespace)
      @namespace = namespace
    end
  end
end

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. 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 tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/marcosgz/async_storage.

License

The gem is available as open source under the terms of the MIT License.