SlideShare a Scribd company logo
1 of 33
Download to read offline
Follow this topic:
@rjsmelo
Redis & ZeroMQ: How to
scale your application
RICARDO MELO
Presented at #PHPLX – 11 July 2013
@rjsmelo 2
RICARDO MELO
● CTO @ DRI
● PHP, Mysql, Linux and lots of other
OSS
● ZCE, RHCE, LPI 3, ITIL, etc
● +10 years building (and breaking)
things
@rjsmelo 3
About
● 14 Year old academic spin-off
● Pragmatic OSS Orientation
● PHP, Mysql, SugarCRM, Drupal,
JavaScript, Linux, etc.
● Crafters, Integrators
● Always looking for software developers
– Yes, right now!
1999 - 2013 DRI. Some Rights Reserved. 4
Outline
● Redis
● ZeroMQ
● Use Cases
● Conclusions
1999 - 2013 DRI. Some Rights Reserved. 5
Redis
“Redis is an open source, BSD licensed,
advanced key-value store. It is often
referred to as a data structure server
since keys can contain strings, hashes,
lists, sets and sorted sets.”
source: http://redis.io
1999 - 2013 DRI. Some Rights Reserved. 6
Predis
● Pure PHP Redis Client
– https://github.com/nrk/predis
● Use composer:
– composer install
{
"name": "rjsmelo/talk-redis-zmq",
"description": "Sample code for Redis & ZeroMQ presentation",
"require": {
"ext-zmq": "*",
"predis/predis": "dev-master"
},
"license": "Apache-2.0",
"authors": [
{
"name": "Ricardo Melo",
"email": "ricardo.melo@dri.pt"
}
]
}
1999 - 2013 DRI. Some Rights Reserved. 7
Strings
1 <?php
2 //redis_strings.php
3 require_once __DIR__ . '/../vendor/autoload.php';
4 $redis = new PredisClient('tcp://localhost:6379');
5
6 // Using SET
7 $redis->set("SampleKey", "Throw me any thing here....");
8 echo $redis->get("SampleKey") . "n"; // Throw me any thing here....
9
10 // Remove Key
11 $redis->del("SampleKey");
12
13 // Using APPEND
14 $redis->append("SampleKey", "Hello"); // Hello
15 $redis->append("SampleKey", " World!"); // Hello World!
16 echo $redis->get("SampleKey") . "n";
17
18 // Other commands: incr, decr, incrby, getrange, setrange
19 // http://redis.io/commands/#string
1999 - 2013 DRI. Some Rights Reserved. 8
Lists
1 <?php
2 //redis_lists.php
3 require_once __DIR__ . '/../vendor/autoload.php';
4 $redis = new PredisClient('tcp://localhost:6379');
5
6 $redis->del('SampleList');
7
8 // Using {L,R}PUSH
9 $redis->lpush('SampleList', 'a'); // a
10 $redis->lpush('SampleList', 'b'); // b, a
11 $redis->rpush('SampleList', 'c'); // b, a, c
12
13 // Using LLEN
14 echo $redis->llen('SampleList') . "n"; // 3
15
16 // Using LINDEX (note: zero indexed)
17 echo $redis->lindex('SampleList', 1) . "n"; // a
18
19 // Using {L,R}POP
20
21 echo $redis->lpop('SampleList') . "n"; // b
22 echo $redis->rpop('SampleList') . "n"; // c
23
24 // Other commands: lrange, rpoplpush
25 // http://redis.io/commands#list
1999 - 2013 DRI. Some Rights Reserved. 9
Sets
1 <?php
2 //redis_sets.php
3 require_once __DIR__ . '/../vendor/autoload.php';
4 $redis = new PredisClient('tcp://localhost:6379');
5
6 $redis->del('SampleSet');
7 $redis->del('OtherSampleSet');
8
9 // Using SADD
10 $redis->sadd('SampleSet', 'Hello'); // Hello
11 $redis->sadd('SampleSet', 'World'); // Hello, World
12 $redis->sadd('SampleSet', 'World'); // Hello, World
13
14 // Using SMEMBERS
15 var_dump($redis->smembers('SampleSet')); // Hello, World
16
17 // Using SINTER
18 $redis->sadd('OtherSampleSet', 'Hello');
19 $redis->sadd('OtherSampleSet', 'All');
20 var_dump($redis->sinter('SampleSet', 'OtherSampleSet')); // Hello
21
22 // Using SUNION
23 var_dump($redis->sunion('SampleSet', 'OtherSampleSet')); // Hello, World, All
24
25 // Other commands: smove, srandmember, srem, scard
26 // http://redis.io/commands#set
1999 - 2013 DRI. Some Rights Reserved. 10
Hashes
1 <?php
2 //redis_hashes.php
3 require_once __DIR__ . '/../vendor/autoload.php';
4 $redis = new PredisClient('tcp://localhost:6379');
5
6 $redis->del('SampleHash');
7
8 // Using HMSET
9 $redis->hmset("SampleHash", array(
10 'prop_a' => 'aaa',
11 'prop_b' => 'bbb',
12 ));
13
14 // Using HGETALL
15 var_dump($redis->hgetall("SampleHash")); // prop_a=>aaa, prop_b=>bbb
16
17 // Using HSET
18 $redis->hset('SampleHash', 'prop_b', 'ccc');
19
20 //USING HGET
21 echo $redis->hget("SampleHash", 'prop_b') ."n"; // ccc
22
23 // Other commands: hexists, hdel, hlen, hkeys, hvals
24 // http://redis.io/commands/#hash
1999 - 2013 DRI. Some Rights Reserved. 11
Sorted Sets
1 <?php
2 //redis_sorted_sets.php
3 require_once __DIR__ . '/../vendor/autoload.php';
4 $redis = new PredisClient('tcp://localhost:6379');
5
6 $redis->del('SampleSortedSet');
7
8 // Using SADD
9 $redis->zadd('SampleSortedSet', 1, 'Hello'); // Hello(1)
10 $redis->zadd('SampleSortedSet', 2, 'World'); // Hello(1), World(2)
11 $redis->zadd('SampleSortedSet', 3, 'World'); // Hello(1), World(3)
12
13 // Using ZRANGE
14 var_dump($redis->zrange('SampleSortedSet', 0, -1,
array('withscores'=>true))); // Hello(1), World(3)
15
16 // Using ZSCORE
17 echo $redis->zscore('SampleSortedSet', 'World') . "n"; // 3
18
19 // Other commands: zrank, zrevrange, zrangebyscore, zremrangebyscore
20 // http://redis.io/commands#sorted_set
1999 - 2013 DRI. Some Rights Reserved. 12
ZeroMQ
“ØMQ is a high-performance asynchronous
messaging library aimed at use in scalable
distributed or concurrent applications. It provides a
message queue, but unlike message-oriented
middleware, a ØMQ system can run without a
dedicated message broker. With bindings for 30+
languages”
source: https://en.wikipedia.org/wiki/%C3%98MQ
1999 - 2013 DRI. Some Rights Reserved. 13
PHP Module - zmq
#
# ZMQ instalation - http://www.zeromq.org/intro:get-the-software
#
tar xzvf zeromq-3.2.2.tar.gz
cd zeromq-3.2.2
./configure
make
make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
#
# ZMQ PHP Binding Instalation
#
pear channel-discover pear.zero.mq
pecl install pear.zero.mq/zmq-beta
echo "extension=zmq.so" > /etc/php.d/zmq.ini
1999 - 2013 DRI. Some Rights Reserved. 14
Socket Types
● Threads in a process (inproc://)
● Processes in a box (ipc://)
● Processes over the network (tcp://)
● Multicast group (pgm://)
1999 - 2013 DRI. Some Rights Reserved. 15
Pattern: Request - Reply
1999 - 2013 DRI. Some Rights Reserved. 16
Pattern: Request - Reply
1 <?php
2 // zmq_request.php
3 $context = new ZMQContext();
4
5 $requester = new ZMQSocket($context, ZMQ::SOCKET_REQ);
6 $requester->connect("tcp://localhost:5555");
7
8 for ($number = 0 ; $number <= 10 ; $number++) {
9 $mensage = "Hello " . $number . "!";
10 echo "Sending - " . $mensage . "n";
11 $requester->send($mensage);
12 $reply = $requester->recv();
13 echo "Received - " . $reply . "n";
14 }
1 <?php
2 //zmq_reply.php
3 $context = new ZMQContext();
4
5 $responder = new ZMQSocket($context, ZMQ::SOCKET_REP);
6 $responder->bind("tcp://*:5555");
7
8 while (true) {
9 $request = $responder->recv();
10 echo $request . "n";
11 sleep (1); // some work
12 $responder->send("Reply to: " . $request);
13 }
1999 - 2013 DRI. Some Rights Reserved. 17
Pattern: Publish - Subscribe
1999 - 2013 DRI. Some Rights Reserved. 18
Pattern: Publish - Subscribe
1 <?php
2 // zmq_publisher.php
3 $context = new ZMQContext();
4
5 $publisher = $context->getSocket(ZMQ::SOCKET_PUB);
6 $publisher->bind("tcp://*:5556");
7
8 $timezones = array('UTC', 'EST');
9 while (true) {
10 foreach($timezones as $tz) {
11 date_default_timezone_set($tz);
12 $message = date('T:c'); // the message to broadcast
13 $publisher->send($message);
14 }
15 sleep(1);
16 } 1 <?php
2 // zmq_subscriber.php
3 $context = new ZMQContext();
4
5 $subscriber = $context->getSocket(ZMQ::SOCKET_SUB);
6 $subscriber->connect("tcp://localhost:5556");
7
8 $filter = $_SERVER['argc'] > 1 ? $_SERVER['argv'][1] : "UTC";
9 $subscriber->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, $filter);
10
11 while (true) {
12 $message = $subscriber->recv();
13 echo substr($message,4) . "n"; // remove prefix
14 }
1999 - 2013 DRI. Some Rights Reserved. 19
Pattern: Pipeline
20
Pattern: Pipeline
1 <?php
2 // zmq_ventilator.php
3 // extracted from: http://zguide.zeromq.org/
4
5 $context = new ZMQContext();
6
7 // Socket to send messages on
8 $sender = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
9 $sender->bind("tcp://*:5557");
10
11 echo "Press Enter when the workers are ready: ";
12 $fp = fopen('php://stdin', 'r');
13 $line = fgets($fp, 512);
14 fclose($fp);
15 echo "Sending tasks to workersâÀ¦", PHP_EOL;
16
17 // The first message is "0" and signals start of batch
18 $sender->send(0);
19
20 // Send 100 tasks
21 $total_msec = 0; // Total expected cost in msecs
22 for ($task_nbr = 0; $task_nbr < 100; $task_nbr++) {
23 // Random workload from 1 to 100msecs
24 $workload = mt_rand(1, 100);
25 $total_msec += $workload;
26 $sender->send($workload);
27
28 }
29
30 printf ("Total expected cost: %d msecn", $total_msec);
31 sleep (1); // Give 0MQ time to deliver
1999 - 2013 DRI. Some Rights Reserved. 21
Pattern: Pipeline
1 <?php
2 // zmq_worker.php
3 // extracted from: http://zguide.zeromq.org/
4
5 $context = new ZMQContext();
6
7 // Socket to receive messages on
8 $receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL);
9 $receiver->connect("tcp://localhost:5557");
10
11 // Socket to send messages to
12 $sender = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
13 $sender->connect("tcp://localhost:5558");
14
15 // Process tasks forever
16 while (true) {
17 $string = $receiver->recv();
18
19 // Simple progress indicator for the viewer
20 echo $string, PHP_EOL;
21
22 // Do the work
23 usleep($string * 1000);
24
25 // Send results to sink
26 $sender->send("");
27 }
22
Pattern: Pipeline
1 <?php
2 // zmq_sink.php
3 // extracted from: http://zguide.zeromq.org/
4
5 // Prepare our context and socket
6 $context = new ZMQContext();
7 $receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL);
8 $receiver->bind("tcp://*:5558");
9
10 // Wait for start of batch
11 $string = $receiver->recv();
12
13 // Start our clock now
14 $tstart = microtime(true);
15
16 // Process 100 confirmations
17 $total_msec = 0; // Total calculated cost in msecs
18 for ($task_nbr = 0; $task_nbr < 100; $task_nbr++) {
19 $string = $receiver->recv();
20 if ($task_nbr % 10 == 0) {
21 echo ":";
22 } else {
23 echo ".";
24 }
25 }
26
27 $tend = microtime(true);
28
29 $total_msec = ($tend - $tstart) * 1000;
30 echo PHP_EOL;
31 printf ("Total elapsed time: %d msec", $total_msec);
32 echo PHP_EOL;
1999 - 2013 DRI. Some Rights Reserved. 23
Pattern: Pipeline
1999 - 2013 DRI. Some Rights Reserved. 24
Use Case: Service Cluster
Reference: http://zguide.zeromq.org/page:all#Service-Oriented-Reliable-Queuing-Majordomo-Pattern
1999 - 2013 DRI. Some Rights Reserved. 25
Use Case: “Unix Style” Application
● Lots of simple, “focused” programs
– Or in different servers, different languages, etc
● All components collaborate to get the
job done
– cat file | sort | uniq -c
● Glue everything with ZeroMQ
1999 - 2013 DRI. Some Rights Reserved. 26
Use Case: Cache
● We need to cache some values for
speed
● Use SET / GET on Redis
● I could use memcache, but this is a
Redis Talk :-)
● They have similar performance
– http://redis.io/topics/benchmarks
1999 - 2013 DRI. Some Rights Reserved. 27
Use Case: Buffer
● Use Redis as a FIFO (or LIFO)
● Hidden Goods
– Decoupling
– Flow control
– rpoplpush
1999 - 2013 DRI. Some Rights Reserved. 28
Use Case: Background Tasks
● Your application needs to do some
heavy work
– Send Email
– Image Resizing
– Mega Huge map-reduce query to your pentabyte cluster :-)
● You don't want to keep your user
waiting
● Send things to background
1999 - 2013 DRI. Some Rights Reserved. 29
Use Case: Background Tasks
● Use Redis as your Job Queue
– Your application should send job to be run and parameters to the
queue
● Use workers to POP jobs from the
queue and do the heavy work.
● Don't reinvent the well
– Look for php-resqueue
1999 - 2013 DRI. Some Rights Reserved. 30
Conclusions
● Both ZeroMQ and Redis are extremely
fast
● ZeroMQ is great to “glue things” as well
as adding flexibility to scale dynamical
● Redis is great as a queue and allows
you to cope with your load.
Thank you
Follow this topic:
@rjsmelo
QA
Code: https://github.com/rjsmelo/talk-redis-zmq
Feedback: https://joind.in/talk/view/8937
www.dri-global.com
@rjsmelo
ricardo.melo@dri-global.com

More Related Content

What's hot

Scalable Web Architectures: Common Patterns and Approaches - Web 2.0 Expo NYC
Scalable Web Architectures: Common Patterns and Approaches - Web 2.0 Expo NYCScalable Web Architectures: Common Patterns and Approaches - Web 2.0 Expo NYC
Scalable Web Architectures: Common Patterns and Approaches - Web 2.0 Expo NYCCal Henderson
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)Heungsub Lee
 
Introduction to NoSQL Databases
Introduction to NoSQL DatabasesIntroduction to NoSQL Databases
Introduction to NoSQL DatabasesDerek Stainer
 
Web Components and Security
Web Components and SecurityWeb Components and Security
Web Components and SecurityTyler Peterson
 
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)NAVER CLOUD PLATFORMㅣ네이버 클라우드 플랫폼
 
Domain Driven Design Quickly
Domain Driven Design QuicklyDomain Driven Design Quickly
Domain Driven Design QuicklyMariam Hakobyan
 
Implementing DDD with C#
Implementing DDD with C#Implementing DDD with C#
Implementing DDD with C#Pascal Laurin
 
Alphorm.com-Formation MongoDB Administration
Alphorm.com-Formation MongoDB AdministrationAlphorm.com-Formation MongoDB Administration
Alphorm.com-Formation MongoDB AdministrationAlphorm
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixAndré Déo
 
React.js - The Dawn of Virtual DOM
React.js - The Dawn of Virtual DOMReact.js - The Dawn of Virtual DOM
React.js - The Dawn of Virtual DOMJimit Shah
 
React Js Simplified
React Js SimplifiedReact Js Simplified
React Js SimplifiedSunil Yadav
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to RedisKnoldus Inc.
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to RedisArnab Mitra
 
Domain Driven Design com Python
Domain Driven Design com PythonDomain Driven Design com Python
Domain Driven Design com PythonFrederico Cabral
 
Top 10 Mistakes When Migrating From Oracle to PostgreSQL
Top 10 Mistakes When Migrating From Oracle to PostgreSQLTop 10 Mistakes When Migrating From Oracle to PostgreSQL
Top 10 Mistakes When Migrating From Oracle to PostgreSQLJim Mlodgenski
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유beom kyun choi
 

What's hot (20)

Scalable Web Architectures: Common Patterns and Approaches - Web 2.0 Expo NYC
Scalable Web Architectures: Common Patterns and Approaches - Web 2.0 Expo NYCScalable Web Architectures: Common Patterns and Approaches - Web 2.0 Expo NYC
Scalable Web Architectures: Common Patterns and Approaches - Web 2.0 Expo NYC
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
 
Introduction to NoSQL Databases
Introduction to NoSQL DatabasesIntroduction to NoSQL Databases
Introduction to NoSQL Databases
 
Web Components and Security
Web Components and SecurityWeb Components and Security
Web Components and Security
 
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)
 
Domain Driven Design Quickly
Domain Driven Design QuicklyDomain Driven Design Quickly
Domain Driven Design Quickly
 
Implementing DDD with C#
Implementing DDD with C#Implementing DDD with C#
Implementing DDD with C#
 
Alphorm.com-Formation MongoDB Administration
Alphorm.com-Formation MongoDB AdministrationAlphorm.com-Formation MongoDB Administration
Alphorm.com-Formation MongoDB Administration
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com Zabbix
 
React.js - The Dawn of Virtual DOM
React.js - The Dawn of Virtual DOMReact.js - The Dawn of Virtual DOM
React.js - The Dawn of Virtual DOM
 
React Js Simplified
React Js SimplifiedReact Js Simplified
React Js Simplified
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to Redis
 
Redis introduction
Redis introductionRedis introduction
Redis introduction
 
DDD in PHP
DDD in PHPDDD in PHP
DDD in PHP
 
Daos
DaosDaos
Daos
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to Redis
 
Domain Driven Design com Python
Domain Driven Design com PythonDomain Driven Design com Python
Domain Driven Design com Python
 
Top 10 Mistakes When Migrating From Oracle to PostgreSQL
Top 10 Mistakes When Migrating From Oracle to PostgreSQLTop 10 Mistakes When Migrating From Oracle to PostgreSQL
Top 10 Mistakes When Migrating From Oracle to PostgreSQL
 
Vue.js
Vue.jsVue.js
Vue.js
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 

Viewers also liked

Europycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQEuropycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQfcrippa
 
Overview of ZeroMQ
Overview of ZeroMQOverview of ZeroMQ
Overview of ZeroMQpieterh
 
Software Architecture over ZeroMQ
Software Architecture over ZeroMQSoftware Architecture over ZeroMQ
Software Architecture over ZeroMQpieterh
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The AnswerIan Barber
 
FOSDEM 2011 - 0MQ
FOSDEM 2011 - 0MQFOSDEM 2011 - 0MQ
FOSDEM 2011 - 0MQpieterh
 
Build reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQBuild reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQRobin Xiao
 
RestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueRestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueGleicon Moraes
 
ZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsJames Dennis
 
Redis everywhere - PHP London
Redis everywhere - PHP LondonRedis everywhere - PHP London
Redis everywhere - PHP LondonRicard Clau
 
ZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 VersionZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 VersionIan Barber
 
Incremental Development with Lisp: Building a Game and a Website
Incremental Development with Lisp: Building a Game and a WebsiteIncremental Development with Lisp: Building a Game and a Website
Incremental Development with Lisp: Building a Game and a WebsiteJames Long
 
p5.js について
p5.js についてp5.js について
p5.js についてreona396
 
ZeroMQ e Redis: soluzioni open source per l'integrazione di componenti
ZeroMQ e Redis: soluzioni open source per l'integrazione di componentiZeroMQ e Redis: soluzioni open source per l'integrazione di componenti
ZeroMQ e Redis: soluzioni open source per l'integrazione di componentiMatteo Fortini
 
Zmq in context of openstack
Zmq in context of openstackZmq in context of openstack
Zmq in context of openstackYatin Kumbhare
 
Lisp for Python Programmers
Lisp for Python ProgrammersLisp for Python Programmers
Lisp for Python ProgrammersVsevolod Dyomkin
 
Asynchronous PHP and Real-time Messaging
Asynchronous PHP and Real-time MessagingAsynchronous PHP and Real-time Messaging
Asynchronous PHP and Real-time MessagingSteve Rhoades
 
4 evolution-of-programming-languages
4 evolution-of-programming-languages4 evolution-of-programming-languages
4 evolution-of-programming-languagesRohit Shrivastava
 
Introduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalkIntroduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalkMahmoud Said
 
Building ZingMe News Feed System
Building ZingMe News Feed SystemBuilding ZingMe News Feed System
Building ZingMe News Feed SystemChau Thanh
 

Viewers also liked (20)

Europycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQEuropycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQ
 
Overview of ZeroMQ
Overview of ZeroMQOverview of ZeroMQ
Overview of ZeroMQ
 
Software Architecture over ZeroMQ
Software Architecture over ZeroMQSoftware Architecture over ZeroMQ
Software Architecture over ZeroMQ
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The Answer
 
FOSDEM 2011 - 0MQ
FOSDEM 2011 - 0MQFOSDEM 2011 - 0MQ
FOSDEM 2011 - 0MQ
 
Build reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQBuild reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQ
 
RestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueRestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message Queue
 
ZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 Labs
 
Redis everywhere - PHP London
Redis everywhere - PHP LondonRedis everywhere - PHP London
Redis everywhere - PHP London
 
ZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 VersionZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 Version
 
Incremental Development with Lisp: Building a Game and a Website
Incremental Development with Lisp: Building a Game and a WebsiteIncremental Development with Lisp: Building a Game and a Website
Incremental Development with Lisp: Building a Game and a Website
 
ZeroMQ in PHP
ZeroMQ in PHPZeroMQ in PHP
ZeroMQ in PHP
 
p5.js について
p5.js についてp5.js について
p5.js について
 
ZeroMQ e Redis: soluzioni open source per l'integrazione di componenti
ZeroMQ e Redis: soluzioni open source per l'integrazione di componentiZeroMQ e Redis: soluzioni open source per l'integrazione di componenti
ZeroMQ e Redis: soluzioni open source per l'integrazione di componenti
 
Zmq in context of openstack
Zmq in context of openstackZmq in context of openstack
Zmq in context of openstack
 
Lisp for Python Programmers
Lisp for Python ProgrammersLisp for Python Programmers
Lisp for Python Programmers
 
Asynchronous PHP and Real-time Messaging
Asynchronous PHP and Real-time MessagingAsynchronous PHP and Real-time Messaging
Asynchronous PHP and Real-time Messaging
 
4 evolution-of-programming-languages
4 evolution-of-programming-languages4 evolution-of-programming-languages
4 evolution-of-programming-languages
 
Introduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalkIntroduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalk
 
Building ZingMe News Feed System
Building ZingMe News Feed SystemBuilding ZingMe News Feed System
Building ZingMe News Feed System
 

Similar to Redis & ZeroMQ: How to scale your application

OWASP TOP 10 for PHP Programmers
OWASP TOP 10 for PHP ProgrammersOWASP TOP 10 for PHP Programmers
OWASP TOP 10 for PHP Programmersrjsmelo
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday DeveloperRoss Tuck
 
The Truth About Lambdas in PHP
The Truth About Lambdas in PHPThe Truth About Lambdas in PHP
The Truth About Lambdas in PHPSharon Levy
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous phpWim Godden
 
ZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionIan Barber
 
4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebookguoqing75
 
Facebook的缓存系统
Facebook的缓存系统Facebook的缓存系统
Facebook的缓存系统yiditushe
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous phpWim Godden
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframeworkRadek Benkel
 
Melhorando sua API com DSLs
Melhorando sua API com DSLsMelhorando sua API com DSLs
Melhorando sua API com DSLsAugusto Pascutti
 
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSLPHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSLiMasters
 
Drupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdfDrupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdfLuca Lusso
 
2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pagessparkfabrik
 
Debugging: Rules & Tools
Debugging: Rules & ToolsDebugging: Rules & Tools
Debugging: Rules & ToolsIan Barber
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Kang-min Liu
 
Debugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionDebugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionIan Barber
 
PHP Data Objects
PHP Data ObjectsPHP Data Objects
PHP Data ObjectsWez Furlong
 
PHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP LimogesPHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP Limoges✅ William Pinaud
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applicationselliando dias
 

Similar to Redis & ZeroMQ: How to scale your application (20)

OWASP TOP 10 for PHP Programmers
OWASP TOP 10 for PHP ProgrammersOWASP TOP 10 for PHP Programmers
OWASP TOP 10 for PHP Programmers
 
Fatc
FatcFatc
Fatc
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday Developer
 
The Truth About Lambdas in PHP
The Truth About Lambdas in PHPThe Truth About Lambdas in PHP
The Truth About Lambdas in PHP
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous php
 
ZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 Version
 
4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook
 
Facebook的缓存系统
Facebook的缓存系统Facebook的缓存系统
Facebook的缓存系统
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous php
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframework
 
Melhorando sua API com DSLs
Melhorando sua API com DSLsMelhorando sua API com DSLs
Melhorando sua API com DSLs
 
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSLPHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
 
Drupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdfDrupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdf
 
2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages
 
Debugging: Rules & Tools
Debugging: Rules & ToolsDebugging: Rules & Tools
Debugging: Rules & Tools
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 
Debugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionDebugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 Version
 
PHP Data Objects
PHP Data ObjectsPHP Data Objects
PHP Data Objects
 
PHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP LimogesPHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP Limoges
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 

More from rjsmelo

Docker and Running multiple versions of PHP @ CareerZoo Dublin
Docker and Running multiple versions of PHP @ CareerZoo DublinDocker and Running multiple versions of PHP @ CareerZoo Dublin
Docker and Running multiple versions of PHP @ CareerZoo Dublinrjsmelo
 
Docker & PHP - Practical use case
Docker & PHP - Practical use caseDocker & PHP - Practical use case
Docker & PHP - Practical use caserjsmelo
 
PHP QA Tools
PHP QA ToolsPHP QA Tools
PHP QA Toolsrjsmelo
 
PHPUnit your bug exterminator
PHPUnit your bug exterminatorPHPUnit your bug exterminator
PHPUnit your bug exterminatorrjsmelo
 
A Certificação LPI
A Certificação LPIA Certificação LPI
A Certificação LPIrjsmelo
 
PHP and Application Security - OWASP Road Show 2013
PHP and Application Security - OWASP Road Show 2013PHP and Application Security - OWASP Road Show 2013
PHP and Application Security - OWASP Road Show 2013rjsmelo
 
PHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicaçõesPHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicaçõesrjsmelo
 

More from rjsmelo (7)

Docker and Running multiple versions of PHP @ CareerZoo Dublin
Docker and Running multiple versions of PHP @ CareerZoo DublinDocker and Running multiple versions of PHP @ CareerZoo Dublin
Docker and Running multiple versions of PHP @ CareerZoo Dublin
 
Docker & PHP - Practical use case
Docker & PHP - Practical use caseDocker & PHP - Practical use case
Docker & PHP - Practical use case
 
PHP QA Tools
PHP QA ToolsPHP QA Tools
PHP QA Tools
 
PHPUnit your bug exterminator
PHPUnit your bug exterminatorPHPUnit your bug exterminator
PHPUnit your bug exterminator
 
A Certificação LPI
A Certificação LPIA Certificação LPI
A Certificação LPI
 
PHP and Application Security - OWASP Road Show 2013
PHP and Application Security - OWASP Road Show 2013PHP and Application Security - OWASP Road Show 2013
PHP and Application Security - OWASP Road Show 2013
 
PHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicaçõesPHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicações
 

Recently uploaded

Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 

Recently uploaded (20)

Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 

Redis & ZeroMQ: How to scale your application

  • 1. Follow this topic: @rjsmelo Redis & ZeroMQ: How to scale your application RICARDO MELO Presented at #PHPLX – 11 July 2013
  • 2. @rjsmelo 2 RICARDO MELO ● CTO @ DRI ● PHP, Mysql, Linux and lots of other OSS ● ZCE, RHCE, LPI 3, ITIL, etc ● +10 years building (and breaking) things
  • 3. @rjsmelo 3 About ● 14 Year old academic spin-off ● Pragmatic OSS Orientation ● PHP, Mysql, SugarCRM, Drupal, JavaScript, Linux, etc. ● Crafters, Integrators ● Always looking for software developers – Yes, right now!
  • 4. 1999 - 2013 DRI. Some Rights Reserved. 4 Outline ● Redis ● ZeroMQ ● Use Cases ● Conclusions
  • 5. 1999 - 2013 DRI. Some Rights Reserved. 5 Redis “Redis is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.” source: http://redis.io
  • 6. 1999 - 2013 DRI. Some Rights Reserved. 6 Predis ● Pure PHP Redis Client – https://github.com/nrk/predis ● Use composer: – composer install { "name": "rjsmelo/talk-redis-zmq", "description": "Sample code for Redis & ZeroMQ presentation", "require": { "ext-zmq": "*", "predis/predis": "dev-master" }, "license": "Apache-2.0", "authors": [ { "name": "Ricardo Melo", "email": "ricardo.melo@dri.pt" } ] }
  • 7. 1999 - 2013 DRI. Some Rights Reserved. 7 Strings 1 <?php 2 //redis_strings.php 3 require_once __DIR__ . '/../vendor/autoload.php'; 4 $redis = new PredisClient('tcp://localhost:6379'); 5 6 // Using SET 7 $redis->set("SampleKey", "Throw me any thing here...."); 8 echo $redis->get("SampleKey") . "n"; // Throw me any thing here.... 9 10 // Remove Key 11 $redis->del("SampleKey"); 12 13 // Using APPEND 14 $redis->append("SampleKey", "Hello"); // Hello 15 $redis->append("SampleKey", " World!"); // Hello World! 16 echo $redis->get("SampleKey") . "n"; 17 18 // Other commands: incr, decr, incrby, getrange, setrange 19 // http://redis.io/commands/#string
  • 8. 1999 - 2013 DRI. Some Rights Reserved. 8 Lists 1 <?php 2 //redis_lists.php 3 require_once __DIR__ . '/../vendor/autoload.php'; 4 $redis = new PredisClient('tcp://localhost:6379'); 5 6 $redis->del('SampleList'); 7 8 // Using {L,R}PUSH 9 $redis->lpush('SampleList', 'a'); // a 10 $redis->lpush('SampleList', 'b'); // b, a 11 $redis->rpush('SampleList', 'c'); // b, a, c 12 13 // Using LLEN 14 echo $redis->llen('SampleList') . "n"; // 3 15 16 // Using LINDEX (note: zero indexed) 17 echo $redis->lindex('SampleList', 1) . "n"; // a 18 19 // Using {L,R}POP 20 21 echo $redis->lpop('SampleList') . "n"; // b 22 echo $redis->rpop('SampleList') . "n"; // c 23 24 // Other commands: lrange, rpoplpush 25 // http://redis.io/commands#list
  • 9. 1999 - 2013 DRI. Some Rights Reserved. 9 Sets 1 <?php 2 //redis_sets.php 3 require_once __DIR__ . '/../vendor/autoload.php'; 4 $redis = new PredisClient('tcp://localhost:6379'); 5 6 $redis->del('SampleSet'); 7 $redis->del('OtherSampleSet'); 8 9 // Using SADD 10 $redis->sadd('SampleSet', 'Hello'); // Hello 11 $redis->sadd('SampleSet', 'World'); // Hello, World 12 $redis->sadd('SampleSet', 'World'); // Hello, World 13 14 // Using SMEMBERS 15 var_dump($redis->smembers('SampleSet')); // Hello, World 16 17 // Using SINTER 18 $redis->sadd('OtherSampleSet', 'Hello'); 19 $redis->sadd('OtherSampleSet', 'All'); 20 var_dump($redis->sinter('SampleSet', 'OtherSampleSet')); // Hello 21 22 // Using SUNION 23 var_dump($redis->sunion('SampleSet', 'OtherSampleSet')); // Hello, World, All 24 25 // Other commands: smove, srandmember, srem, scard 26 // http://redis.io/commands#set
  • 10. 1999 - 2013 DRI. Some Rights Reserved. 10 Hashes 1 <?php 2 //redis_hashes.php 3 require_once __DIR__ . '/../vendor/autoload.php'; 4 $redis = new PredisClient('tcp://localhost:6379'); 5 6 $redis->del('SampleHash'); 7 8 // Using HMSET 9 $redis->hmset("SampleHash", array( 10 'prop_a' => 'aaa', 11 'prop_b' => 'bbb', 12 )); 13 14 // Using HGETALL 15 var_dump($redis->hgetall("SampleHash")); // prop_a=>aaa, prop_b=>bbb 16 17 // Using HSET 18 $redis->hset('SampleHash', 'prop_b', 'ccc'); 19 20 //USING HGET 21 echo $redis->hget("SampleHash", 'prop_b') ."n"; // ccc 22 23 // Other commands: hexists, hdel, hlen, hkeys, hvals 24 // http://redis.io/commands/#hash
  • 11. 1999 - 2013 DRI. Some Rights Reserved. 11 Sorted Sets 1 <?php 2 //redis_sorted_sets.php 3 require_once __DIR__ . '/../vendor/autoload.php'; 4 $redis = new PredisClient('tcp://localhost:6379'); 5 6 $redis->del('SampleSortedSet'); 7 8 // Using SADD 9 $redis->zadd('SampleSortedSet', 1, 'Hello'); // Hello(1) 10 $redis->zadd('SampleSortedSet', 2, 'World'); // Hello(1), World(2) 11 $redis->zadd('SampleSortedSet', 3, 'World'); // Hello(1), World(3) 12 13 // Using ZRANGE 14 var_dump($redis->zrange('SampleSortedSet', 0, -1, array('withscores'=>true))); // Hello(1), World(3) 15 16 // Using ZSCORE 17 echo $redis->zscore('SampleSortedSet', 'World') . "n"; // 3 18 19 // Other commands: zrank, zrevrange, zrangebyscore, zremrangebyscore 20 // http://redis.io/commands#sorted_set
  • 12. 1999 - 2013 DRI. Some Rights Reserved. 12 ZeroMQ “ØMQ is a high-performance asynchronous messaging library aimed at use in scalable distributed or concurrent applications. It provides a message queue, but unlike message-oriented middleware, a ØMQ system can run without a dedicated message broker. With bindings for 30+ languages” source: https://en.wikipedia.org/wiki/%C3%98MQ
  • 13. 1999 - 2013 DRI. Some Rights Reserved. 13 PHP Module - zmq # # ZMQ instalation - http://www.zeromq.org/intro:get-the-software # tar xzvf zeromq-3.2.2.tar.gz cd zeromq-3.2.2 ./configure make make install echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf ldconfig # # ZMQ PHP Binding Instalation # pear channel-discover pear.zero.mq pecl install pear.zero.mq/zmq-beta echo "extension=zmq.so" > /etc/php.d/zmq.ini
  • 14. 1999 - 2013 DRI. Some Rights Reserved. 14 Socket Types ● Threads in a process (inproc://) ● Processes in a box (ipc://) ● Processes over the network (tcp://) ● Multicast group (pgm://)
  • 15. 1999 - 2013 DRI. Some Rights Reserved. 15 Pattern: Request - Reply
  • 16. 1999 - 2013 DRI. Some Rights Reserved. 16 Pattern: Request - Reply 1 <?php 2 // zmq_request.php 3 $context = new ZMQContext(); 4 5 $requester = new ZMQSocket($context, ZMQ::SOCKET_REQ); 6 $requester->connect("tcp://localhost:5555"); 7 8 for ($number = 0 ; $number <= 10 ; $number++) { 9 $mensage = "Hello " . $number . "!"; 10 echo "Sending - " . $mensage . "n"; 11 $requester->send($mensage); 12 $reply = $requester->recv(); 13 echo "Received - " . $reply . "n"; 14 } 1 <?php 2 //zmq_reply.php 3 $context = new ZMQContext(); 4 5 $responder = new ZMQSocket($context, ZMQ::SOCKET_REP); 6 $responder->bind("tcp://*:5555"); 7 8 while (true) { 9 $request = $responder->recv(); 10 echo $request . "n"; 11 sleep (1); // some work 12 $responder->send("Reply to: " . $request); 13 }
  • 17. 1999 - 2013 DRI. Some Rights Reserved. 17 Pattern: Publish - Subscribe
  • 18. 1999 - 2013 DRI. Some Rights Reserved. 18 Pattern: Publish - Subscribe 1 <?php 2 // zmq_publisher.php 3 $context = new ZMQContext(); 4 5 $publisher = $context->getSocket(ZMQ::SOCKET_PUB); 6 $publisher->bind("tcp://*:5556"); 7 8 $timezones = array('UTC', 'EST'); 9 while (true) { 10 foreach($timezones as $tz) { 11 date_default_timezone_set($tz); 12 $message = date('T:c'); // the message to broadcast 13 $publisher->send($message); 14 } 15 sleep(1); 16 } 1 <?php 2 // zmq_subscriber.php 3 $context = new ZMQContext(); 4 5 $subscriber = $context->getSocket(ZMQ::SOCKET_SUB); 6 $subscriber->connect("tcp://localhost:5556"); 7 8 $filter = $_SERVER['argc'] > 1 ? $_SERVER['argv'][1] : "UTC"; 9 $subscriber->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, $filter); 10 11 while (true) { 12 $message = $subscriber->recv(); 13 echo substr($message,4) . "n"; // remove prefix 14 }
  • 19. 1999 - 2013 DRI. Some Rights Reserved. 19 Pattern: Pipeline
  • 20. 20 Pattern: Pipeline 1 <?php 2 // zmq_ventilator.php 3 // extracted from: http://zguide.zeromq.org/ 4 5 $context = new ZMQContext(); 6 7 // Socket to send messages on 8 $sender = new ZMQSocket($context, ZMQ::SOCKET_PUSH); 9 $sender->bind("tcp://*:5557"); 10 11 echo "Press Enter when the workers are ready: "; 12 $fp = fopen('php://stdin', 'r'); 13 $line = fgets($fp, 512); 14 fclose($fp); 15 echo "Sending tasks to workersâÀ¦", PHP_EOL; 16 17 // The first message is "0" and signals start of batch 18 $sender->send(0); 19 20 // Send 100 tasks 21 $total_msec = 0; // Total expected cost in msecs 22 for ($task_nbr = 0; $task_nbr < 100; $task_nbr++) { 23 // Random workload from 1 to 100msecs 24 $workload = mt_rand(1, 100); 25 $total_msec += $workload; 26 $sender->send($workload); 27 28 } 29 30 printf ("Total expected cost: %d msecn", $total_msec); 31 sleep (1); // Give 0MQ time to deliver
  • 21. 1999 - 2013 DRI. Some Rights Reserved. 21 Pattern: Pipeline 1 <?php 2 // zmq_worker.php 3 // extracted from: http://zguide.zeromq.org/ 4 5 $context = new ZMQContext(); 6 7 // Socket to receive messages on 8 $receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL); 9 $receiver->connect("tcp://localhost:5557"); 10 11 // Socket to send messages to 12 $sender = new ZMQSocket($context, ZMQ::SOCKET_PUSH); 13 $sender->connect("tcp://localhost:5558"); 14 15 // Process tasks forever 16 while (true) { 17 $string = $receiver->recv(); 18 19 // Simple progress indicator for the viewer 20 echo $string, PHP_EOL; 21 22 // Do the work 23 usleep($string * 1000); 24 25 // Send results to sink 26 $sender->send(""); 27 }
  • 22. 22 Pattern: Pipeline 1 <?php 2 // zmq_sink.php 3 // extracted from: http://zguide.zeromq.org/ 4 5 // Prepare our context and socket 6 $context = new ZMQContext(); 7 $receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL); 8 $receiver->bind("tcp://*:5558"); 9 10 // Wait for start of batch 11 $string = $receiver->recv(); 12 13 // Start our clock now 14 $tstart = microtime(true); 15 16 // Process 100 confirmations 17 $total_msec = 0; // Total calculated cost in msecs 18 for ($task_nbr = 0; $task_nbr < 100; $task_nbr++) { 19 $string = $receiver->recv(); 20 if ($task_nbr % 10 == 0) { 21 echo ":"; 22 } else { 23 echo "."; 24 } 25 } 26 27 $tend = microtime(true); 28 29 $total_msec = ($tend - $tstart) * 1000; 30 echo PHP_EOL; 31 printf ("Total elapsed time: %d msec", $total_msec); 32 echo PHP_EOL;
  • 23. 1999 - 2013 DRI. Some Rights Reserved. 23 Pattern: Pipeline
  • 24. 1999 - 2013 DRI. Some Rights Reserved. 24 Use Case: Service Cluster Reference: http://zguide.zeromq.org/page:all#Service-Oriented-Reliable-Queuing-Majordomo-Pattern
  • 25. 1999 - 2013 DRI. Some Rights Reserved. 25 Use Case: “Unix Style” Application ● Lots of simple, “focused” programs – Or in different servers, different languages, etc ● All components collaborate to get the job done – cat file | sort | uniq -c ● Glue everything with ZeroMQ
  • 26. 1999 - 2013 DRI. Some Rights Reserved. 26 Use Case: Cache ● We need to cache some values for speed ● Use SET / GET on Redis ● I could use memcache, but this is a Redis Talk :-) ● They have similar performance – http://redis.io/topics/benchmarks
  • 27. 1999 - 2013 DRI. Some Rights Reserved. 27 Use Case: Buffer ● Use Redis as a FIFO (or LIFO) ● Hidden Goods – Decoupling – Flow control – rpoplpush
  • 28. 1999 - 2013 DRI. Some Rights Reserved. 28 Use Case: Background Tasks ● Your application needs to do some heavy work – Send Email – Image Resizing – Mega Huge map-reduce query to your pentabyte cluster :-) ● You don't want to keep your user waiting ● Send things to background
  • 29. 1999 - 2013 DRI. Some Rights Reserved. 29 Use Case: Background Tasks ● Use Redis as your Job Queue – Your application should send job to be run and parameters to the queue ● Use workers to POP jobs from the queue and do the heavy work. ● Don't reinvent the well – Look for php-resqueue
  • 30. 1999 - 2013 DRI. Some Rights Reserved. 30 Conclusions ● Both ZeroMQ and Redis are extremely fast ● ZeroMQ is great to “glue things” as well as adding flexibility to scale dynamical ● Redis is great as a queue and allows you to cope with your load.
  • 32. Follow this topic: @rjsmelo QA Code: https://github.com/rjsmelo/talk-redis-zmq Feedback: https://joind.in/talk/view/8937