Project

key_value

0.01
No commit activity in last 3 years
No release in over 3 years
Abuse Sql database as Key-Value store
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

 Project Readme

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...