GithubHelp home page GithubHelp logo

riak-client's Introduction

NAME

Riak::Client - Fast and lightweight Perl client for Riak

VERSION

version 1.95

SYNOPSIS

use Riak::Client;

# normal mode
my $client = Riak::Client->new(
  host => '127.0.0.1',
  port => 8087,
  r => 2,
  w => 2,
  dw => 1,
  connection_timeout => 5,
  read_timeout => 5,
  write_timeout => 5,
  no_auto_connect => 0,
);

$client->is_alive() or die "riak is not alive";

# store hashref. will be serialized as JSON
$client->put( 'bucket_name', 'key_name', { some => 'structure' } );

# store text
$client->put( 'bucket_name', 'key_name', 'sometext', 'text/plain' );

# store raw data
$client->put_raw( 'bucket_name', 'key_name', 'rawdata' );

# fetch hashref
my $hash = $client->get( 'bucket_name', 'key_name' );

# fetch raw data
my $text = $client->get_raw( 'bucket_name', 'key_name');

# delete data
$client->del( 'bucket_name', 'key_name');

# list keys in stream
$client->get_keys(foo => sub{
   my ($key, $done) = @_;

   # you should use another client inside this callback!
   $another_client->del(foo => $key);

});

DESCRIPTION

Riak::Client is a fast and light Perl client for Riak using PBC interface

It supports operations like ping, get, exists, put, del, secondary indexes (so-called 2i) setting and querying, and Map Reduce querying.

It started as a fork of Riak::Light to fix some bugs, but actually ended up in a complete rewrite with more features, but the same performance.

ATTRIBUTES

host

Str, Required. Riak IP or hostname.

port

Int, Required. Port of the PBC interface.

r

Int, Default 2. R value setting for this client.

w

Int, Default 2. W value setting for this client.

dw

Int, Default 1. DW value setting for this client.

connection_timeout

Float, Default 5. Timeout for connection operation, in seconds. Set to 0 for no timeout.

read_timeout

Float, Default 5. Timeout for read operation, in seconds. Set to 0 for no timeout.

no_delay

Boolean, Default 0. If set to a true value, TCP_NODELAY will be enabled on the socket, which means deactivating Nagle's algorithm. Use only if you know what you're doing.

no_auto_connect

Bool, Default 0. If set to true, then the module won't automatically connect upon instanciation. Instead, you'll have to call connect() yourself.

METHODS

connect

$client->connect();
$client->connect($coderef);

Connects to the Riak server. On error, will raise an exception. This is automatically done when new() is called, unless the no_auto_connect attribute is set to true. Accepts an optional callback, that will be executed when connected.

ping( [$cb->()] )

my $result = $client->ping();
$client->ping(sub { print "ping successful\n" });

Performs a ping operation. On error, will raise an exception. Accepts an optional callback (a CodeRef), that will be executed upon completion.

# an other example
use Try::Tiny;
try { $client->ping() } catch { "oops... something is wrong: $_" };

See also is_alive().

is_alive( [$cb->($bool)] )

my $is_alive = $client->is_alive();
$client->is_alive($coderef);

Checks if the connection is alive. Returns true or false. On error, will raise an exception. Accepts an optional callback, that will be executed upon completion.

get( $bucket, $key, [$cb->($value)] )

my $value = $client->get($bucket, $key);
$client->get($bucket, $key, $coderef);

Performs a fetch operation. Expects bucket and key names. Returns the value. On error, will raise an exception. Accepts an optional callback, that will be called upon completion, with the value as first argument. If the content_type of the fetched value is 'application/json', automatically decodes the JSON into a Perl structure. If you need the raw data you can use get_raw.

get_raw( $bucket, $key, [$cb->($value)] )

my $value = $client->get_raw($bucket, $key);
$client->get_raw($bucket, $key, $coderef);

Same as get, but no automatic JSON decoding will be performed. If you want JSON to be automatically decoded, you should use get() instead.

$client->put($bucket, $key, $value);
$client->put($bucket, $key, $value, $coderef);
$client->put($bucket, $key, $value, $mime_type, $coderef);
$client->put($bucket, $key, $value, $mime_type, $secondary_indexes, $coderef);
$client->put($bucket, $key, $value, $mime_type, $secondary_indexes, $links, $coderef);

Performs a store operation. Expects bucket and key names, the value, the content type (optional, default is 'application/json'), the indexes to set for this value (optional, default is none), the links to set for this value (optional, default is none), and an optional coderef. On error, will raise an exception

Will encode the structure in json string if necessary. If you need to store the raw data you should use put_raw instead.

IMPORTANT: all the index field names should end by either _int or _bin, depending if the index type is integer or binary.

To query secondary indexes, see query_index.

$client->put('bucket', 'key', { some_values => [1,2,3] });
$client->put('bucket', 'key', { some_values => [1,2,3] }, 'application/json');
$client->put('bucket', 'key', 'text', 'plain/text');

# you can set secondary indexes (2i)
$client->put( 'bucket', 'key', 'text_value', 'plain/text',
              { field1_bin => 'abc', field2_int => 42 }
            );
$client->put( 'bucket', 'key', { some_values => [1,2,3] }, undef,
              { field1_bin => 'abc', field2_int => 42 }
            );

# you can also set links
$client->put( 'bucket', 'key', 'text', 'plain/text', undef,
              { link_tag1 => 'bucket/key',
                link_tag2 => 'other_bucket/key',
              }
            );

# you can set multiple links for the same tag
$client->put( 'bucket', 'key', 'text', 'plain/text', undef,
              { link_tag1 => [ qw( bucket/key bucket2/key2 ) ],
                link_tag2 => 'other_bucket/key',
              }
            );

# you can also use this form (marginally faster)
$client->put( 'bucket', 'key', 'text', 'plain/text', undef,
              [ { tag => 'link_tag1', bucket => 'bucket1', key => 'key1'},
                { tag => 'link_tag2', bucket => 'bucket2', key => 'key2'},
              ],
            );
$client->put_raw('bucket', 'key', encode_json({ some_values => [1,2,3] }), 'application/json');
$client->put_raw('bucket', 'key', 'text');
$client->put_raw('bucket', 'key', 'text', undef, {field_bin => 'foo'});
$client->put_raw('bucket', 'key', 'text', undef, {field_bin => 'foo'}, $links);

For more example, see put.

Perform a store operation. Expects bucket and key names, the value, the content type (optional, default is 'plain/text'), the indexes (optional, default is none), and links (optional, default is none) to set for this value

This method won't encode the data, but pass it as such, trusting it's in the type you've indicated in the passed content-type. If you want the structure to be automatically encoded, use put instead.

IMPORTANT: all the index field names should end by either _int or _bin, depending if the index type is integer or binary.

To query secondary indexes, see query_index.

del ( $bucket, $key, [ $cb->() ] )

$client->del(bucket => key);

Perform a delete operation. Expects bucket and key names.

get_keys( $bucket, $cb->($key, $bool) )

# in default mode
$client->get_keys(foo => sub{
   my ($key, $done) = @_;
   # you should use another client inside this callback!
   $another_client->del(foo => $key);
});

WARNING, this method should not be called on a production Riak cluster, as it can have a big performance impact. See Riak's documentation.

WARNING, because Riak doesn't handles pipelining, you cannot use the same Riak::Client instance inside the callback, it would raise an exception.

Perform a list keys operation. Receive a callback and will call it for each key. The callback will receive two arguments: the key, and a boolean indicating if it's the last key.

The callback is optional. If not provided get_keys() will return an ArrayRef of all the keys. Don't do that, and always provide a callback, to avoid your RAM usage to skyrocket...

exists($bucket, $key, [ $cb->($bool) ] )

$client->exists(bucket => 'key') or warn "key not found";

Perform a fetch operation but with head => 0, and the if there is something stored in the bucket/key.

query_index( $bucket, $index, $value, [ $cb->($key) ] )

Perform a secondary index (2i) query. Expects a bucket name, the index field name, the index value you're searching on, and optionally a callback.

If a callback has been provided, doesn't return anything, but executes the callback on each matching keys. callback will receive the key name as first argument. key name will also be in $_. If no callback is provided, returns and ArrayRef of matching keys.

The index value you're searching on can be of two types. If it's a Scalar, an exact match query will be performed. if the value is an ArrayRef, then a range query will be performed, the first element in the array will be the range_min, the second element the range_max. other elements will be ignored.

Based on the example in put, here is how to query it:

# exact match
my $matching_keys = $client->query_index( 'bucket',  'field2_int', 42 ),

# range match
my $matching_keys = $client->query_index( 'bucket',  'field2_int', [ 40, 50] ),

# range match with callback
$client->query_index( 'bucket',  'field2_int', [ 40, 50], sub { print "key : $_" } ),

get_buckets( [ $cb->($buckets) ] )

WARNING, this method should not be called on a production Riak cluster, as it can have a big performance impact. See Riak's documentation.

get_bucket_props($bucket, [ $cb->($properties) ] )

set_bucket_props($bucket, $properties)

map_reduce

Perform a map/reduce operation.

# using a javascript function
my $json_hash = {
    inputs => 'training',
    query => [{
      map => {
        language =>"javascript",
        source =>"function(riakObject) {
          var val = riakObject.values[0].data.match(/pizza/g);
          return [[riakObject.key, (val ? val.length : 0 )]];
        }"
      }
    }]
};

# using an erlang function
my $json_hash = {
    inputs => 'messages',
    query => [{
      map => {
        language => 'erlang',
        module => 'mr_example',
        function => 'get_keys'
      }
    }]
};

$client->map_reduce($json_hash, sub { ... });

BENCHMARKS

Note: These benchmarks are the one provided by Riak::Light.

GETS

Rate Data::Riak (REST) Riak::Tiny (REST) Net::Riak (REST) Data::Riak::Fast (REST) Net::Riak (PBC) Riak::Client Riak::Light (PBC) Riak::Client (PBC)
  Data::Riak (REST)              427/s                --              -30%             -31%                    -43%            -65%                           -90%               -91%
  Riak::Tiny (REST)              611/s               43%                --              -2%                    -19%            -51%                           -86%               -87%
  Net::Riak (REST)               623/s               46%                2%               --                    -17%            -50%                           -86%               -87%
  Data::Riak::Fast (REST)        755/s               77%               24%              21%                      --            -39%                           -83%               -84%
  Net::Riak (PBC)               1238/s              190%              103%              99%                     64%              --                           -72%               -74%
  Riak::Light (PBC)             4348/s              917%              612%             598%                    476%            251%                             --                -8%
  Riak::Client (PBC)            4706/s             1001%              671%             655%                    524%            280%                             8%                 --

PUTS

Rate Net::Riak (REST) Data::Riak (REST) Riak::Tiny (REST) Data::Riak::Fast (REST) Net::Riak (PBC) Riak::Light (PBC) Riak::Client (PBC)
  Net::Riak (REST)               542/s               --              -15%              -29%                    -55%            -57%              -90%               -92%
  Data::Riak (REST)              635/s              17%                --              -17%                    -47%            -49%              -89%               -90%
  Riak::Tiny (REST)              765/s              41%               20%                --                    -36%            -39%              -86%               -88%
  Data::Riak::Fast (REST)       1198/s             121%               89%               57%                      --             -4%              -79%               -82%
  Net::Riak (PBC)               1254/s             131%               97%               64%                      5%              --              -78%               -81%
  Riak::Light (PBC)             5634/s             939%              787%              637%                    370%            349%                --               -14%
  Riak::Client (PBC)            6557/s            1110%              933%              757%                    448%            423%               16%                 --

SEE ALSO

Net::Riak

Data::Riak

Data::Riak::Fast

Action::Retry

Riak::Light

CONTRIBUTORS

Ivan Kruglov <[email protected]>

AUTHOR

Damien Krotkine <[email protected]>

COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Damien Krotkine.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

riak-client's People

Contributors

dams avatar peczenyj avatar

Stargazers

Pavel avatar Nikolay Mishin avatar Pablo Luis Zorzoli avatar Matthew Broberg avatar  avatar Andrea Guzzo avatar  avatar Ivan Kruglov avatar

Watchers

 avatar  avatar Toby Inkster avatar James Cloos avatar Ivan Kruglov avatar

Forkers

mishin

riak-client's Issues

Tests fail (with Google::ProtocolBuffers 0.12?)

See subject. Test log:

#   Failed test 'Riak/Client.pm loaded ok'
#   at t/00-compile.t line 36.
#          got: '512'
#     expected: '0'
Can't use string ("1") as an ARRAY ref while "strict refs" in use at /opt/perl-5.24.1-RC4/lib/site_perl/5.24.1/Google/ProtocolBuffers.pm line 308.
Compilation failed in require at /tmpfs/.cpan-build-cpansand/2016102621/Riak-Client-1.96-0/blib/lib/Riak/Client.pm line 12.
BEGIN failed--compilation aborted at /tmpfs/.cpan-build-cpansand/2016102621/Riak-Client-1.96-0/blib/lib/Riak/Client.pm line 12.
Compilation failed in require at -e line 1.

#   Failed test 'Riak/Client/PBC.pm loaded ok'
#   at t/00-compile.t line 36.
#          got: '512'
#     expected: '0'
Can't use string ("1") as an ARRAY ref while "strict refs" in use at /opt/perl-5.24.1-RC4/lib/site_perl/5.24.1/Google/ProtocolBuffers.pm line 308.
Compilation failed in require at -e line 1.
# Looks like you failed 2 tests of 2.
t/00-compile.t ............ 
Dubious, test returned 2 (wstat 512, 0x200)
Failed 2/2 subtests 
...

Google::ProtocolBuffers 0.12 seems also to break other distributions, see
csirtgadgets/google-protocolbuffers-perl#24

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.