Skip to content
Abuse Sql database as Key-Value Store
Ruby
Find file
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib
spec
Gemfile
Gemfile.lock
Rakefile
Readme.md
VERSION
key_value.gemspec

Readme.md

Abuse Sql database as Key-Value Store that can be 750k-qps-crazy-fast via HandlerSocket

Install

sudo gem install key_value

# Gemfile
gem 'key_value', :require => false # so migrations do not fail because of missing table

Migration

rails g migration create_key_value and paste in:

class CreateKeyValue < ActiveRecord::Migration
  def self.up
    create_table :key_values do |t|
      t.string :key, :null => false
      t.text :value, :null => false
    end
    add_index :key_values, :key, :unique => true
  end

  def self.down
    drop_table :key_values
  end
end

rake db:migrate

Usage

# set & get
KeyValue['xxx'] = {:baz=>'foo'})
KeyValue['xxx'] -> {:baz=>'foo'}

# delete
KeyValue['xxx'] = nil
or KeyValue.del('xxx')

# increment
KeyValue.inc('xxx') # !! Not atomic
or KeyValue.inc('xxx', 5) # increment by 5

# cache
result = KeyValue.cache('xxx'){ ..something expensive.. }

# defaults (in case the value is not stored yet)
KeyValue.defaults['xxx'] = 1
KeyValue['xxx'] -> 1
KeyValue['xxx'] = 2
KeyValue['xxx'] -> 2
KeyValue['xxx'] = nil
KeyValue['xxx'] -> 1

HandlerSocket (Ubuntu natty guide):

KeyValue.handler_socket = true
# or Hash with any of these keys :host :port :database :timeout :listen_backlog :sndbuf :rcvbuf

# all read requests use HandlerSocket
KeyValue['xxx'] # -> same as before but faster :)

TODO

  • HandlerSocket insert+update support
  • Multi-get support KeyValue.keys('xxx*') + KeyValue.multi_get(['xxx1', 'xxx2'])
  • make test database configurable

Authors

Roman Heinrich
Michael Grosser
Hereby placed under public domain, do what you want, just do not hold anyone accountable...

Something went wrong with that request. Please try again.