Introduction to Aerospike with PHP

Introduction to Aerospike with PHP

34be88398f623c109b61d23e8215bd23?s=128

Mariusz Gil

March 12, 2015
Tweet

Transcript

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

    P H P
  2. about me

  3. frontend application cache data store

  4. data store

  5. data store scaling is hard

  6. SQL way denormalization / partitioning / sharding

  7. id username attribute_1 attribute_2 1 atermida 1 5 2 saturn

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

    3 zeus 3 7 … … … … attribute_n 9 …
  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 … … …
  10. noSQL way scalability / consistency / availability / partitioning

  11. None
  12. None
  13. None
  14. namespaces sets records bins

  15. nodes clusters namespaces sets

  16. id username attr_1 attr_2 attr_3 1 atermida 1 2 saturn

    2 3 zeus [1, 3, 4] … … … … …
  17. simple and complex data types

  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)
  19. record and stream Lua UDFs

  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)
  21. PHP way native client

  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
  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
  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
  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
  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
  27. use cases

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

  31. Thanks! @mariuszgil