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
330
Game of Developer Life... Deconstructed
mariuszgil
1
200
Back to forgotten roots
mariuszgil
1
450
Go micro with microservices
mariuszgil
5
720
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
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
330
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
270
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
2
880
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
130
AIの中の人になってみる
htkym
0
150
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
560
Oxlintはいいぞ(続)
yug1224
1
500
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
120
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
100
業務時間外もAIに働いてもらう話
colorful12
3
9.5k
初めての模倣学習とVLA
natsutan
0
380
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
590
Featured
See All Featured
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
220
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
810
RailsConf 2023
tenderlove
30
1.5k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
580
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
310
Google's AI Overviews - The New Search
badams
0
1.6k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
570
Are puppies a ranking factor?
jonoalderson
2
3.9k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
430
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
510
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
630
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