Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to Aerospike with PHP

Introduction to Aerospike with PHP

Mariusz Gil

March 12, 2015
Tweet

More Decks by Mariusz Gil

Other Decks in Programming

Transcript

  1. M a r i u s z G i l
    P H P

    View Slide

  2. about me

    View Slide

  3. frontend
    application
    cache
    data store

    View Slide

  4. data store

    View Slide

  5. data store
    scaling is hard

    View Slide

  6. SQL way
    denormalization / partitioning / sharding

    View Slide

  7. id username attribute_1 attribute_2
    1 atermida 1 5
    2 saturn 3 2
    3 zeus 3 7
    … … … …

    View Slide

  8. id username attribute_1 attribute_2
    1 atermida 1
    2 saturn 2
    3 zeus 3 7
    … … … …
    attribute_n
    9

    View Slide

  9. id username
    1 atermida
    2 saturn
    3 zeus
    … …
    user_id attribute_id value
    1 342 1
    2 342 2
    3 343 3
    … … …
    user_id attribute_id value
    1 348 abc
    2 348 abd
    3 900 eee
    … … …

    View Slide

  10. noSQL way
    scalability / consistency / availability / partitioning

    View Slide

  11. View Slide

  12. View Slide

  13. View Slide

  14. namespaces
    sets
    records
    bins

    View Slide

  15. nodes
    clusters
    namespaces
    sets

    View Slide

  16. id username attr_1 attr_2 attr_3
    1 atermida 1
    2 saturn 2
    3 zeus [1, 3, 4]
    … … … … …

    View Slide

  17. simple and complex data types

    View Slide

  18. aql> insert into test.users (PK, username, attr_1) values ('atena', 'atena', 1);
    OK, 1 record affected.
    aql> insert into test.users (PK, username, attr_2) values ('zeus', 'zeus', 2);
    OK, 1 record affected.
    aql> insert into test.users (PK, username, attr_3)
    values ('saturn', 'saturn', 'JSON{"account": "silver", "balance":0}');
    OK, 1 record affected.
    aql> select * from test.users
    +----------+--------+--------+-----------------------------------+
    | username | attr_2 | attr_1 | attr_3 |
    +----------+--------+--------+-----------------------------------+
    | "zeus" | 2 | | |
    | "atena" | | 1 | |
    | "saturn" | | | {"account":"silver", "balance":0} |
    +----------+--------+--------+-----------------------------------+
    3 rows in set (0.375 secs)
    aql> select * from test.users where PK='atena'
    +----------+--------+
    | username | attr_1 |
    +----------+--------+
    | "atena" | 1 |
    +----------+--------+
    1 row in set (0.000 secs)

    View Slide

  19. record and stream Lua UDFs

    View Slide

  20. aql> execute list.push('mylist', 'a') on test.demo where PK = '1'
    +------+
    | push |
    +------+
    | 1 |
    +------+
    1 row in set (0.000 secs)
    aql> execute list.push('mylist', 'b') on test.demo where PK = '1'
    +------+
    | push |
    +------+
    | 2 |
    +------+
    1 row in set (0.000 secs)
    aql> execute list.push('mylist', 'c') on test.demo where PK = '1'
    +------+
    | push |
    +------+
    | 3 |
    +------+
    1 row in set (0.000 secs)
    aql> execute list.peek('mylist', 3) on test.demo where PK = '1'
    +--------------------------+
    | peek |
    +--------------------------+
    | ["c", "b", "a"] |
    +--------------------------+
    1 row in set (0.000 secs)

    View Slide

  21. PHP way
    native client

    View Slide

  22. installation
    # Install dependencies
    sudo apt-get install build-essential autoconf libssl-dev
    sudo apt-get install php5-dev php-pear
    # Build extension
    composer require aerospike/aerospike-client-php "*"
    find vendor/aerospike/aerospike-client-php/ -name "*.sh" -exec chmod +x {} \;
    cd vendor/aerospike/aerospike-client-php/ && composer run-script post-install-cmd
    # Create ini file
    extension=aerospike.so
    aerospike.udf.lua_system_path=/path/to/client-php/sys-lua
    aerospike.udf.lua_user_path=/path/to/client-php/usr-lua

    View Slide

  23. $config = [
    "hosts" => [
    ["addr" => "127.0.0.1", "port" => 3000]
    ]
    ];
    $db = new Aerospike($config);
    $key = $db->initKey("infosphere", "characters", 1234);
    $db->put($key, ["name" => "Scruffy", "Occupation" => "The Janitor"]);
    $db->put($key, [
    "quotes" => [
    "I'm Scruffy. The janitor.",
    "I'm on break.",
    "Scruffy's gonna die like he lived.",
    ]
    ]);
    $db->get($key, $record, ["name", "quotes"]);
    $db->close();
    simple flow

    View Slide

  24. $db->scan("infosphere", "characters", function ($record) {
    var_dump($record);
    }, ["name"]);
    $where = Aerospike::predicateBetween("age", 30, 39);
    $status = $db->query("infosphere", "characters", $where, function ($record) {
    var_dump($record);
    }, ["name", "age"]);
    scans and queries

    View Slide

  25. $status = $db->register('/path/to/my_udf.lua', 'my_udf');
    $key = $db->initKey('test', 'demo', 'foo');
    $db->apply($key, "sample", "list_append", ["things", "!!!"]);
    $status = $db->scanApply("test", "users", "rec_udf", "accumulate", ["balance", "income"], $scan_id);
    $where = Aerospike::predicateBetween("age", 20, 29);
    $status = $db->aggregate("test", "users", $where, "mymod", "group_count", ["first_name"], $names);
    user definied functions

    View Slide

  26. $key = $db->initKey("test", "shows", "Futurama");
    $db->put($key, [
    "creator" => ["Matt Groening", "David X Cohen"],
    "broadcast" => [[1999,2003], [2008,2013]],
    ]);
    $characters = new \Aerospike\LDT\LSet($db, $key, 'characters');
    $characters->add('Professor Hubert J. Farnsworth');
    $characters->addMany([
    "Amy Wong",
    "Hermes Conrad",
    "Dr. John A. Zoidberg",
    "Tarunga Leela",
    "Philip J. Fry",
    "Bender Bending Rodriguez",
    "Scruffy",
    "Cubert Farnsworth”
    ]);
    large data types

    View Slide

  27. use cases

    View Slide

  28. View Slide

  29. View Slide

  30. Don’t trust
    instead, do your own benchmarks in your env

    View Slide

  31. Thanks!
    @mariuszgil

    View Slide