Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Introduction to Aerospike with PHP
Search
Mariusz Gil
March 12, 2015
Programming
880
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Introduction to Aerospike with PHP
Mariusz Gil
March 12, 2015
More Decks by Mariusz Gil
See All by Mariusz Gil
Aspect Oriented Programming
mariuszgil
1
350
Designing and implementing GraphQL API
mariuszgil
1
120
Discovering unknown with EventStorming ConFoo
mariuszgil
0
320
Game of Developer Life... Deconstructed
mariuszgil
1
200
Back to forgotten roots
mariuszgil
1
440
Go micro with microservices
mariuszgil
5
710
Machine Learning for the rescue
mariuszgil
0
460
Discovering graph structures
mariuszgil
3
560
Processing events at scale
mariuszgil
2
400
Other Decks in Programming
See All in Programming
メールのエイリアス機能を履き違えない
isshinfunada
0
240
AIが無かった頃の素敵な出会いの話
codmoninc
1
430
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
500
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
140
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
510
「人を評価する AI」の設計と実装
ryoyanara
0
200
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
150
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
450
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
580
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
500
リアルな遅延を測る仕様
kota_yata
1
100
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
490
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
240
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
430
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
210
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
660
Facilitating Awesome Meetings
lara
57
7.1k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
Writing Fast Ruby
sferik
630
63k
Transcript
M a r i u s z G i l
P H P
about me
frontend application cache data store
data store
data store scaling is hard
SQL way denormalization / partitioning / sharding
id username attribute_1 attribute_2 1 atermida 1 5 2 saturn
3 2 3 zeus 3 7 … … … …
id username attribute_1 attribute_2 1 atermida 1 2 saturn 2
3 zeus 3 7 … … … … attribute_n 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 … … …
noSQL way scalability / consistency / availability / partitioning
None
None
None
namespaces sets records bins
nodes clusters namespaces sets
id username attr_1 attr_2 attr_3 1 atermida 1 2 saturn
2 3 zeus [1, 3, 4] … … … … …
simple and complex data types
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)
record and stream Lua UDFs
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)
PHP way native client
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
$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
$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
$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
$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
use cases
None
None
Don’t trust instead, do your own benchmarks in your env
Thanks! @mariuszgil