Abuse Sql database as Key-Value Store that can be 750k-qps-crazy-fast via HandlerSocket
sudo gem install key_value
# Gemfile
gem 'key_value', :require => false # so migrations do not fail because of missing table
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
# 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 :)
- HandlerSocket insert+update support
- Multi-get support
KeyValue.keys('xxx*')
+KeyValue.multi_get(['xxx1', 'xxx2'])
- make test database configurable
Roman Heinrich
Michael Grosser
Hereby placed under public domain, do what you want, just do not hold anyone accountable...