KyotoTycoon client for Ruby. # Feature / Fixture * Usable console as `$ bin/kyototycoon-console -h localhost -p 1991` like a Sequel(v0.5.4+) * Always Keep-Alive connect (v0.5.0+) * You can choise key/value encoding from URI or Base64 * You can use MessagePack tranparency * Benchmark scripts appended(they are connect to localhost:19999) # Install $ gem install kyototycoon # Example ## Simple case @kt = KyotoTycoon.new('localhost', 1978) # traditional style @kt.set('foo', 123) p @kt.get('foo') # => "123". carefully, it is String, not Integer, by default # Ruby's hash style @kt['bar'] = 42 p @kt['bar'] # => "42". @kt[:baz] = :aaa # => key/value are automatically #to_s @kt.delete(:foo) ## Complex case # KT#configure for instance setting store. KyotoTycoon.configure(:generic) do |kt| kt.db = '*' # on memory end # connect any host, any port KyotoTycoon.configure(:favicon, 'remotehost', 12345) do |kt| kt.db = 'favicons.kch' # DB file as KT known end @kt = KyotoTycoon.create(:generic) # got KT instance by KT#configure(:generic) rules # set/bulk_set/get/bulk_get uses msgpack. default as :default @kt.serializer = :msgpack # KT library logging logger = Logger.new(STDERR) logger.level = Logger::WARN @kt.logger = logger # or you can use these: # @kt.logger = 'ktlib.log' # @kt.logger = STDOUT # @kt.logger = Logger.new(STDOUT) # standby server @kt.connect_timeout = 0.5 # => wait 0.5 sec for connection open @kt.servers << ['server2', 1978] # standby server that will use when primary server (a.k.a. KT#new(host, port)) is dead. @kt.servers << ['server3', 1978] # same as above # key/value encoding from :U or :B(default). default as base64 because it seems better than URL encode for me. @kt.colenc = :U # get/set @kt.set('foo', 42, 100) # => expire at 100 seconds after @kt['foo'] # => 42. it is interger by msgpack serializer works # delete all record @kt.clear # bulk set/get @kt.set_bulk({ 'foo' => 'foo', 'bar' => 'bar', }) @kt.get_bulk([:foo, 'bar']) # => {'_foo' => 'foo', '_bar' => 'bar', 'num' => '2'} @kt.remove_bulk([:foo, :bar]) # it can store when msgpack using. @kt['baz'] = {'a' => 'a', 'b' => 'b'} @kt['baz'] # => {'a' => 'a', 'b' => 'b} # increment @kt.increment('bar') # => 1 @kt.increment('bar') # => 2 @kt.increment('bar', 10) # => 12 @kt.increment('bar', -5) # => 7 # shorthand @kt.incr('foo') # => 1 @kt.decr('foo') # => 0 # delete keys @kt.delete(:foo, :bar, :baz) # prefix keys @kt.match_prefix('fo') # => all start with 'fo' keys @kt.match_regex('^fo') # => save as above @kt.match_regex(/^fo/) # => save as above # reporting / statistics p @kt.report p @kt.status all_record_count = @kt.status['count'] # Requirements - msgpack(optional) # Other case for `ktremotemgr slave | ...` $ cat foo.rb require "rubygems" require "kyototycoon" KyotoTycoon::Stream.run($stdin) do |line| case line.cmd when 'clear' puts "all record cleared!" when 'set' puts "#{line.key} get #{line.value} value" when 'remove' puts "#{line.key} is removed at #{line.time.strftime('%Y-%m-%d %H:%M:%S')}" end end $ ktremotemgr slave -uw | ruby foo.rb # Trap KyotoTycoon is based on HTTP so all variable types are become String. It means `(@kt["counter"] ||= 1) < 10` does not work by default. Using :msgpack serializer for avoid this trap.