Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Introduction to Aerospike with PHP
Mariusz Gil
March 12, 2015
Programming
8
580
Introduction to Aerospike with PHP
Mariusz Gil
March 12, 2015
Tweet
Share
More Decks by Mariusz Gil
See All by Mariusz Gil
Aspect Oriented Programming
mariuszgil
1
220
Designing and implementing GraphQL API
mariuszgil
1
33
Discovering unknown with EventStorming ConFoo
mariuszgil
0
170
Game of Developer Life... Deconstructed
mariuszgil
1
140
Back to forgotten roots
mariuszgil
1
310
Go micro with microservices
mariuszgil
5
450
Machine Learning for the rescue
mariuszgil
0
300
Discovering graph structures
mariuszgil
3
470
Processing events at scale
mariuszgil
2
330
Other Decks in Programming
See All in Programming
Swift Concurrencyによる安全で快適な非同期処理
tattn
2
130
Angular's new Standalone Components: How Will They Affect My Architecture? @iJS London 2022
manfredsteyer
PRO
0
380
人類には難しいZynqで組み込みRust
ikemori
0
480
JGS594 Lecture 23
javiergs
PRO
0
400
バンドル最適化マニアクス at tfconf
mizchi
3
1.9k
書籍『良いコード/悪いコードで学ぶ設計入門』でエンジニアリングの当たり前を変える
minodriven
3
1k
Develop your CI tools
xgouchet
2
180
확장 가능한 테라폼 코드 관리 (Scalable Terraform Code Management)
posquit0
1
310
Where and how to run UI tests (Droidcon London, 2021)
nonews
0
200
Is Rust a great language for building Kubernetes ecosystem
deepu105
0
140
実録mruby組み込み体験
coe401_
0
100
UI State Modeling 어떤게 좋을까?
laco2951
1
200
Featured
See All Featured
Music & Morning Musume
bryan
35
4.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
337
17k
Build The Right Thing And Hit Your Dates
maggiecrowley
19
1.1k
Robots, Beer and Maslow
schacon
152
7.1k
Atom: Resistance is Futile
akmur
255
20k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
268
11k
A better future with KSS
kneath
225
15k
The Cult of Friendly URLs
andyhume
68
4.7k
Teambox: Starting and Learning
jrom
121
7.6k
Thoughts on Productivity
jonyablonski
43
2.2k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
498
130k
The Invisible Side of Design
smashingmag
289
48k
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