Fast and lightweight Perl client for Riak
Perl Perl 6 Protocol Buffer
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
benchmarks
lib/Riak
pbc
t
.gitignore
Changes
README.md
dist.ini
perlcriticrc
perltidyrc

README.md

Riak-Light

Fast and lightweight Perl client for Riak CPAN version

    # create a new instance - using pbc only
    my $client = Riak::Light->new(
      host => '127.0.0.1',
      port => 8087
    );
    
    $client->is_alive() or die "ops, riak is not alive";

    # store hashref into bucket 'foo', key 'bar'
    # will serializer as 'application/json'
    $client->put( foo => bar => { baz => 1024 });
    
    # store text into bucket 'foo', key 'bar' 
    $client->put( foo => baz => "sometext", 'text/plain');
    $client->put_raw( foo => baz => "sometext");  # does not encode !

    # fetch hashref from bucket 'foo', key 'bar'
    my $hash = $client->get( foo => 'bar');
    my $text = $client->get_raw( foo => 'baz');   # does not decode !

    # delete hashref from bucket 'foo', key 'bar'
    $client->del(foo => 'bar');
    
    # check if exists (like get but using less bytes in the response)
    $client->exists(foo => 'baz') or warn "ops, foo => bar does not exist";
    
    # list keys in stream (callback only)
    $client->get_keys(foo => sub{
       my $key = $_[0];
       
       # you should use another client inside this callback!
       $another_client->del(foo => $key);
    });

Install

It is available on CPAN

cpan Riak::Light

https://metacpan.org/release/Riak-Light/

Test Coverage

---------------------------- ------ ------ ------ ------ ------ ------ ------
File                           stmt   bran   cond    sub    pod   time  total
---------------------------- ------ ------ ------ ------ ------ ------ ------
blib/lib/Riak/Light.pm        100.0  100.0  100.0  100.0   80.0   48.4   99.5
...b/Riak/Light/Connector.pm  100.0  100.0    n/a  100.0    0.0   32.4   96.6
.../lib/Riak/Light/Driver.pm  100.0  100.0    n/a  100.0    0.0    4.0   93.3
blib/lib/Riak/Light/PBC.pm    100.0    n/a    n/a  100.0    n/a   10.1  100.0
...lib/Riak/Light/Timeout.pm  100.0    n/a    n/a  100.0    n/a    0.7  100.0
...ak/Light/Timeout/Alarm.pm  100.0  100.0    n/a  100.0    0.0    0.7   94.3
...k/Light/Timeout/Select.pm  100.0    n/a    n/a  100.0    0.0    0.4   90.2
...t/Timeout/SelectOnRead.pm  100.0    n/a    n/a  100.0    0.0    0.2   91.3
...ght/Timeout/SetSockOpt.pm  100.0  100.0    n/a  100.0    0.0    0.5   96.8
.../Light/Timeout/TimeOut.pm  100.0  100.0    n/a  100.0    0.0    0.9   94.9
blib/lib/Riak/Light/Util.pm   100.0    n/a    n/a  100.0    0.0    1.7   87.5
Total                         100.0  100.0  100.0  100.0   15.4  100.0   96.1
---------------------------- ------ ------ ------ ------ ------ ------ ------

Simple Benchmark

Using Perl 5.12.2 under MacOSX 10.8.3 / 4GB Ram / 2.4 GHz Intel Core 2 Duo and Riak 1.3.0 (localhost)

Only GET (benchmark/compare_all_only_get.pl)

                         Rate Data::Riak (REST) Net::Riak (REST) Riak::Tiny (REST) Data::Riak::Fast (REST) Net::Riak (PBC) Riak::Light (PBC)
Data::Riak (REST)        318/s                --             -33%              -42%                    -46%            -69%              -92%
Net::Riak (REST)         478/s               50%               --              -12%                    -20%            -54%              -87%
Riak::Tiny (REST)        544/s               71%              14%                --                     -8%            -47%              -86%
Data::Riak::Fast (REST)  594/s               87%              24%                9%                      --            -42%              -84%
Net::Riak (PBC)         1031/s              224%             116%               89%                     73%              --              -73%
Riak::Light (PBC)       3774/s             1086%             690%              593%                    535%            266%                --               --

Only PUT (benchmark/compare_all_only_put.pl)

                          Rate Net::Riak (REST) Data::Riak (REST) Riak::Tiny (REST) Net::Riak (PBC) Data::Riak::Fast (REST) Riak::Light (PBC)
Net::Riak (REST)         418/s               --              -16%              -22%            -55%                    -58%              -88%
Data::Riak (REST)        499/s              19%                --               -7%            -46%                    -50%              -86%
Riak::Tiny (REST)        534/s              28%                7%                --            -42%                    -46%              -85%
Net::Riak (PBC)          924/s             121%               85%               73%              --                     -6%              -74%
Data::Riak::Fast (REST)  988/s             137%               98%               85%              7%                      --              -73%
Riak::Light (PBC)       3604/s             763%              623%              575%            290%                    265%                --

Timeout Providers (benchmark/compare_timeout_providers.pl)

                Rate Riak::Light 6 Riak::Light 3 Riak::Light 2 Riak::Light 4 Riak::Light 5 Riak::Light 1
Riak::Light 6 2158/s            --          -16%          -21%          -21%          -32%          -38%
Riak::Light 3 2564/s           19%            --           -6%           -6%          -20%          -26%
Riak::Light 2 2727/s           26%            6%            --            0%          -15%          -22%
Riak::Light 4 2727/s           26%            6%            0%            --          -15%          -22%
Riak::Light 5 3191/s           48%           24%           17%           17%            --           -9%
Riak::Light 1 3488/s           62%           36%           28%           28%            9%            --

where

1 - undef / no IO timeout
2 - using Time::HiRes (alarm)
3 - using IO::Select (DEFAULT)
4 - using IO::Select only in read operations
5 - using setsockopt
6 - using Time::Out

Features

  • be PBC only (ok)
  • supports timeout (ok)
  • use Moo (ok)
  • doesn't create an object per key (ok)
  • support an option to not die, but return undef (deprecated, will be removed to the next version)
  • be optimized for speed. (ok)
  • try to get 100% coverage. (ok)
  • benchmark with Data::Riak, Net::Riak REST, etc... (ok)
  • documentation (ok)
  • support raw data (ok)
  • support list keys (ok)
  • debug/trace mode (to do)
  • vclock support (in progress)
  • refactor to use Moo::Roles instead other objects (to do)
  • extract timeout provider to an external project (to do)