SlideShare ist ein Scribd-Unternehmen logo
1 von 20
durable_rules
Who am I?
Why durable_rules?
durable_rules is the result of my personal research, it does not reflect the positions of my
employer.
Agenda
• History
• Rete
• Performance Challenge
• Benchmark
• Demo
• Futures
• Q & A
History
2400 years ago
Modus Ponens: Theophrastus on Hypothetical Syllogisms1
"P implies Q and P is asserted to be true, so therefore Q must be true.”2
1. x eats flies and x lives in water -> x is a frog
2. Kermit eats flies
3. Kermit lives in water
4. Kermit is a frog (MP 1, 2, 3)
1. https://plato.stanford.edu/entries/logic-ancient/#ForModPonModTol
2. https://en.wikipedia.org/wiki/Modus_ponens
An Expert System emulates the decision-making ability of a human. “starts with
the available data and uses inference rules to extract more data (from an end user,
for example) until a goal is reached”1
(deftemplate animal
(slot name))
(defrule rule-1 ”frogs”
(animal (name ?name) (eats flies))
(animal (name ?name) (lives water))
=>
(printout t ?name ” is frog")
(assert (?name is frog)))
> assert (Kermit eats flies)
> assert (Kermit lives water)
> Kermit is frog
1. https://en.wikipedia.org/wiki/Forward_chaining
40 years ago
durable_rules is a framework for real-time coordination of events. To analyze
information about things that happen to infer more complicated circumstances.
var d = require('durable');
d.ruleset('animal', function() {
whenAll: {
first = m.predicate == 'eats' && m.object == 'flies'
m.predicate == 'lives' && m.object == 'water' && m.subject == first.subject
}
run: {
console.log(m.subject + ' is frog');
assert({ subject: first.subject, predicate: 'is', object: 'frog' });
}
});
runAll();
>node animals.js
>curl -H "content-type: application/json" -X POST -d '{"subject": ”Kermit", "predicate": "eats", "object": ”flies"}'
>curl -H "content-type: application/json" -X POST -d '{"subject": ”Kermit", "predicate": ”lives", "object": ”land"}'
>Kermit is frog
Today
Rete
: a network especially of blood vessels or nerves : 1
The Rete algorithm was designed by Charles L. Forgy of Carnegie Mellon
University, first published in a working paper in 1974. 2
1. https://www.merriam-webster.com/dictionary/rete
2. https://en.wikipedia.org/wiki/Rete_algorithm
Kermit eats flies
Classic Rete
predicate == ‘eats’
object == ‘flies’
predicate == ‘lives’
object == ‘water’
subject == subject
assert(frog)
Beta node
Action node
Alpha nodes
• Alpha nodes filter and push forward
• Beta nodes remember and join
• Action nodes schedule execution
> assert(Kermit eats flies)
> assert(Kermit lives water)
> Kermit is frog
Kermit eats flies
Kermit eats flies Kermit lives water
Kermit lives water
Kermit lives water
Kermit eats flies Kermit lives water
Rete D
predicate == ‘eats’
object == ‘flies’
predicate == ‘lives’
object == ‘water’
subject == subject
Animal Queue
• Alpha nodes filter in scripting host
• Beta nodes store and join in Redis
• Actions queued in Redis
assert(frog)
• Actions executed in scripting host
RedisScriptScript
• Work Distribution (massive streams)
• Scale out
• Fault Tolerance
• Multi Language (node.js, Python Ruby)
Why?
Up to 10M/ Sec
Up to 100K/Sec
Up to 30K/Sec
Performance Challenge
1. We have 100000 objects stored in Redis
2. We have 100 objects in a Node.js client
3. We want to generate object pairs that match: first.subject == second.subject
First solution var redis = require('redis'), client = redis.createClient();
// more details here…
var callback = function (err, res) {
var first = JSON.parse(res);
for (var ii = 0; ii < localObjects.length; ++ii) {
if (first.subject == localObjects[ii].subject) {
results.push({first: first, second: localObjects[ii]});
}
}
if (i != 99999) {
++i;
client.lindex('test', i, callback);
}
}
client.lindex('test', i, callback);
“{‘subject’:1, ’object’:’flies’}”
“{‘subject’:2, ’object’:’flies’}”
“{‘subject’:3, ’object’:’flies’}”
“{‘subject’:4, ’object’:’flies’}”
“{‘subject’:5, ’object’:’flies’}”
“{‘subject’:6, ’object’:’flies’}”
“{‘subject’:7, ’object’:’flies’}”
“{‘subject’:8, ’object’:’flies’}”
“{‘subject’:9, ’object’:’flies’}”
“{‘subject’:2, ’object’:’water’}”
“{‘subject’:3, ’object’:’water’}”
, 100000
“{‘subject’:4, ’object’:’flies’}”
“{‘subject’:5, ’object’:’flies’}”
, 100
“{‘subject’:1, ’object’:’flies’}”
“{‘subject’:1, ’object’:’flies’}”
“{‘subject’:1, ’object’:’flies’}”
“{‘subject’:1, ’object’:’flies’}”
“{‘subject’:1, ’object’:’flies’}”
RedisNode.js
Total execution time -> 4067 ms
Second solution
var redis = require('redis'), client = redis.createClient();
// more details here…
var callback = function (err, res) {
var first = JSON.parse(res);
results.push({first: first, second: objects[i]});
if (i != localObjects.length - 1) {
++i;
client.hget('test', localObjects[i].subject, callback);
}
}
client.hget('test', localObjects[i].subject, callback);
“{‘subject’:1, ’object’:’flies’}”
“{‘subject’:2, ’object’:’flies’}”
“{‘subject’:3, ’object’:’flies’}”
“{‘subject’:4, ’object’:’flies’}”
“{‘subject’:5, ’object’:’flies’}”
“{‘subject’:6, ’object’:’flies’}”
“{‘subject’:7, ’object’:’flies’}”
“{‘subject’:8, ’object’:’flies’}”
“{‘subject’:9, ’object’:’flies’}”
“{‘subject’:2, ’object’:’water’}”
“{‘subject’:3, ’object’:’water’}”
, 100000
“{‘subject’:4, ’object’:’flies’}”
“{‘subject’:5, ’object’:’flies’}”
, 100
1
2
3
4
5
6
7
8
9
RedisNode.js
“{‘subject’:3, ’object’:’flies’}”
“{‘subject’:2, ’object’:’flies’}”
Total execution time -> 7 ms
Third solution
var redis = require('redis'), client = redis.createClient();
// more details here…
client.script('load',
'local results = {}n' +
'for i = 1, #ARGV, 1 don' +
' results[i] = redis.call("hget", "test", ARGV[i])n' +
'endn' +
'return resultsn',
function (err, res) {
var hash = res;
var callback = function (err, res) {
for (var ii = 0; ii < localObjects.length; ++ii) {
results.push({first: JSON.parse(res[ii]), second: localObjects[ii]});
}
};
var args = [hash, 0];
for (ii = 0; ii < localObjects.length; ++ii) {
args.push(localObjects[ii].subject);
}
args.push(callback);
client.evalsha.apply(client, args);
}
);
“{‘subject’:1, ’object’:’flies’}”
“{‘subject’:2, ’object’:’flies’}”
“{‘subject’:3, ’object’:’flies’}”
“{‘subject’:4, ’object’:’flies’}”
“{‘subject’:5, ’object’:’flies’}”
“{‘subject’:6, ’object’:’flies’}”
“{‘subject’:7, ’object’:’flies’}”
“{‘subject’:8, ’object’:’flies’}”
“{‘subject’:9, ’object’:’flies’}”
“{‘subject’:2, ’object’:’water’}”
“{‘subject’:3, ’object’:’water’}”
, 100000
“{‘subject’:4, ’object’:’flies’}”
“{‘subject’:5, ’object’:’flies’}”
, 100
1
2
3
4
5
6
7
8
9
RedisNode.js
Total execution time -> 600 micros
“{‘subject’:2, ’object’:’flies’}”
“{‘subject’:3, ’object’:’flies’}”
“{‘subject’:4, ’object’:’flies’}”
“{‘subject’:5, ’object’:’flies’}”
“{‘subject’:2, ’object’:’flies’}”
“{‘subject’:3, ’object’:’flies’}”
“{‘subject’:4, ’object’:’flies’}”
“{‘subject’:5, ’object’:’flies’}”
Results
Benchmark
Miss Manners has decided to throw a party. She wants to seat her
guests such that adjacent people are of opposite sex and share at least
one hobby. The problem has to be solved for 8, 16, 32 and 128 guests.
The Challenge
assign: {
to: 'make’
whenAll: {
seating = m.t == 'seating' && m.path == true
rightGuest = m.t == 'guest' && m.name == seating.rightGuestName
leftGuest = m.t == 'guest' && m.sex != rightGuest.sex && m.hobby == rightGuest.hobby
none(m.t == 'path' && m.pid == seating.tid && m.guestName ==leftGuest.name)
none(m.t == 'chosen' && m.cid == seating.tid && m.guestName == leftGuest.name && m.hobby == rightGuest.hobby)
}
run: {
assert({ t: 'seating',
tid: s.count,
pid: seating.tid,
path: false,
leftSeat: seating.rightSeat,
leftGuestName: seating.rightGuestName,
rightSeat: seating.rightSeat + 1,
rightGuestName: leftGuest.name });
assert({ t: 'path',
pid: s.count,
seat: seating.rightSeat + 1,
guestName: leftGuest.name });
assert({ t: 'chosen',
cid: seating.tid,
guestName: leftGuest.name,
hobby: rightGuest.hobby });
s.count += 1;
}
}
Results
Futures
• Performance
• Richer Queries (array support)
• Facts: Queries (facts, antecedents)
• Events: Bloom Filters
• WebSite
• Service
Q & A
To learn more:
https://github.com/jruizgit/rules
@jruiztwi

Weitere ähnliche Inhalte

Was ist angesagt?

やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
機械学習システムのアーキテクチャアラカルト
機械学習システムのアーキテクチャアラカルト機械学習システムのアーキテクチャアラカルト
機械学習システムのアーキテクチャアラカルトBrainPad Inc.
 
Railsアプリのモジュールはどこに置くべきか問題 (公開版)
Railsアプリのモジュールはどこに置くべきか問題 (公開版)Railsアプリのモジュールはどこに置くべきか問題 (公開版)
Railsアプリのモジュールはどこに置くべきか問題 (公開版)Ken Muryoi
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことBIGLOBE Inc.
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考えるtomo_masakura
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜Preferred Networks
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8Koichiro Matsuoka
 
実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記Hiroyuki Ohnaka
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる増田 亨
 
社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみたIosif Takakura
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみてinfinite_loop
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと増田 亨
 
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINE Corporation
 
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...de:code 2017
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―shinjiigarashi
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで増田 亨
 

Was ist angesagt? (20)

やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
機械学習システムのアーキテクチャアラカルト
機械学習システムのアーキテクチャアラカルト機械学習システムのアーキテクチャアラカルト
機械学習システムのアーキテクチャアラカルト
 
Railsアプリのモジュールはどこに置くべきか問題 (公開版)
Railsアプリのモジュールはどこに置くべきか問題 (公開版)Railsアプリのモジュールはどこに置くべきか問題 (公開版)
Railsアプリのモジュールはどこに置くべきか問題 (公開版)
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考える
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
 
実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
 
社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみて
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版
 
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
 

Ähnlich wie RedisConf17- durable_rules

Fact-Based Monitoring
Fact-Based MonitoringFact-Based Monitoring
Fact-Based MonitoringDatadog
 
Fact based monitoring
Fact based monitoringFact based monitoring
Fact based monitoringDatadog
 
Python fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuanPython fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuanWei-Yuan Chang
 
Akka with Scala
Akka with ScalaAkka with Scala
Akka with ScalaOto Brglez
 
node.js Module Development
node.js Module Developmentnode.js Module Development
node.js Module DevelopmentJay Harris
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformationLars Marius Garshol
 
Building and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsBuilding and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsOhad Kravchick
 
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.jsВсеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.jsYandex
 
Node.js System: The Landing
Node.js System: The LandingNode.js System: The Landing
Node.js System: The LandingHaci Murat Yaman
 
Everything is Permitted: Extending Built-ins
Everything is Permitted: Extending Built-insEverything is Permitted: Extending Built-ins
Everything is Permitted: Extending Built-insAndrew Dupont
 
The dark side of Akka and the remedy
The dark side of Akka and the remedyThe dark side of Akka and the remedy
The dark side of Akka and the remedykrivachy
 
Painless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldPainless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldChristian Melchior
 
Node Boot Camp
Node Boot CampNode Boot Camp
Node Boot CampTroy Miles
 
Celery: The Distributed Task Queue
Celery: The Distributed Task QueueCelery: The Distributed Task Queue
Celery: The Distributed Task QueueRichard Leland
 
55 new things in Java 7 - Devoxx France
55 new things in Java 7 - Devoxx France55 new things in Java 7 - Devoxx France
55 new things in Java 7 - Devoxx FranceDavid Delabassee
 
Async. and Realtime Geo Applications with Node.js
Async. and Realtime Geo Applications with Node.jsAsync. and Realtime Geo Applications with Node.js
Async. and Realtime Geo Applications with Node.jsShoaib Burq
 

Ähnlich wie RedisConf17- durable_rules (20)

Fact-Based Monitoring
Fact-Based MonitoringFact-Based Monitoring
Fact-Based Monitoring
 
Fact based monitoring
Fact based monitoringFact based monitoring
Fact based monitoring
 
Python fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuanPython fundamentals - basic | WeiYuan
Python fundamentals - basic | WeiYuan
 
Akka with Scala
Akka with ScalaAkka with Scala
Akka with Scala
 
Ruby basics
Ruby basicsRuby basics
Ruby basics
 
node.js Module Development
node.js Module Developmentnode.js Module Development
node.js Module Development
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformation
 
Building and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsBuilding and Scaling Node.js Applications
Building and Scaling Node.js Applications
 
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.jsВсеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
 
Node.js System: The Landing
Node.js System: The LandingNode.js System: The Landing
Node.js System: The Landing
 
Everything is Permitted: Extending Built-ins
Everything is Permitted: Extending Built-insEverything is Permitted: Extending Built-ins
Everything is Permitted: Extending Built-ins
 
The dark side of Akka and the remedy
The dark side of Akka and the remedyThe dark side of Akka and the remedy
The dark side of Akka and the remedy
 
Painless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldPainless Persistence in a Disconnected World
Painless Persistence in a Disconnected World
 
Dynamic Python
Dynamic PythonDynamic Python
Dynamic Python
 
Node Boot Camp
Node Boot CampNode Boot Camp
Node Boot Camp
 
ERRest in Depth
ERRest in DepthERRest in Depth
ERRest in Depth
 
Celery: The Distributed Task Queue
Celery: The Distributed Task QueueCelery: The Distributed Task Queue
Celery: The Distributed Task Queue
 
CSC PPT 13.pptx
CSC PPT 13.pptxCSC PPT 13.pptx
CSC PPT 13.pptx
 
55 new things in Java 7 - Devoxx France
55 new things in Java 7 - Devoxx France55 new things in Java 7 - Devoxx France
55 new things in Java 7 - Devoxx France
 
Async. and Realtime Geo Applications with Node.js
Async. and Realtime Geo Applications with Node.jsAsync. and Realtime Geo Applications with Node.js
Async. and Realtime Geo Applications with Node.js
 

Mehr von Redis Labs

Redis Day Bangalore 2020 - Session state caching with redis
Redis Day Bangalore 2020 - Session state caching with redisRedis Day Bangalore 2020 - Session state caching with redis
Redis Day Bangalore 2020 - Session state caching with redisRedis Labs
 
Protecting Your API with Redis by Jane Paek - Redis Day Seattle 2020
Protecting Your API with Redis by Jane Paek - Redis Day Seattle 2020Protecting Your API with Redis by Jane Paek - Redis Day Seattle 2020
Protecting Your API with Redis by Jane Paek - Redis Day Seattle 2020Redis Labs
 
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...Redis Labs
 
SQL, Redis and Kubernetes by Paul Stanton of Windocks - Redis Day Seattle 2020
SQL, Redis and Kubernetes by Paul Stanton of Windocks - Redis Day Seattle 2020SQL, Redis and Kubernetes by Paul Stanton of Windocks - Redis Day Seattle 2020
SQL, Redis and Kubernetes by Paul Stanton of Windocks - Redis Day Seattle 2020Redis Labs
 
Rust and Redis - Solving Problems for Kubernetes by Ravi Jagannathan of VMwar...
Rust and Redis - Solving Problems for Kubernetes by Ravi Jagannathan of VMwar...Rust and Redis - Solving Problems for Kubernetes by Ravi Jagannathan of VMwar...
Rust and Redis - Solving Problems for Kubernetes by Ravi Jagannathan of VMwar...Redis Labs
 
Redis for Data Science and Engineering by Dmitry Polyakovsky of Oracle
Redis for Data Science and Engineering by Dmitry Polyakovsky of OracleRedis for Data Science and Engineering by Dmitry Polyakovsky of Oracle
Redis for Data Science and Engineering by Dmitry Polyakovsky of OracleRedis Labs
 
Practical Use Cases for ACLs in Redis 6 by Jamie Scott - Redis Day Seattle 2020
Practical Use Cases for ACLs in Redis 6 by Jamie Scott - Redis Day Seattle 2020Practical Use Cases for ACLs in Redis 6 by Jamie Scott - Redis Day Seattle 2020
Practical Use Cases for ACLs in Redis 6 by Jamie Scott - Redis Day Seattle 2020Redis Labs
 
Moving Beyond Cache by Yiftach Shoolman Redis Labs - Redis Day Seattle 2020
Moving Beyond Cache by Yiftach Shoolman Redis Labs - Redis Day Seattle 2020Moving Beyond Cache by Yiftach Shoolman Redis Labs - Redis Day Seattle 2020
Moving Beyond Cache by Yiftach Shoolman Redis Labs - Redis Day Seattle 2020Redis Labs
 
Leveraging Redis for System Monitoring by Adam McCormick of SBG - Redis Day S...
Leveraging Redis for System Monitoring by Adam McCormick of SBG - Redis Day S...Leveraging Redis for System Monitoring by Adam McCormick of SBG - Redis Day S...
Leveraging Redis for System Monitoring by Adam McCormick of SBG - Redis Day S...Redis Labs
 
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...Redis Labs
 
Highly Available Persistent Session Management Service by Mohamed Elmergawi o...
Highly Available Persistent Session Management Service by Mohamed Elmergawi o...Highly Available Persistent Session Management Service by Mohamed Elmergawi o...
Highly Available Persistent Session Management Service by Mohamed Elmergawi o...Redis Labs
 
Anatomy of a Redis Command by Madelyn Olson of Amazon Web Services - Redis Da...
Anatomy of a Redis Command by Madelyn Olson of Amazon Web Services - Redis Da...Anatomy of a Redis Command by Madelyn Olson of Amazon Web Services - Redis Da...
Anatomy of a Redis Command by Madelyn Olson of Amazon Web Services - Redis Da...Redis Labs
 
Building a Multi-dimensional Analytics Engine with RedisGraph by Matthew Goos...
Building a Multi-dimensional Analytics Engine with RedisGraph by Matthew Goos...Building a Multi-dimensional Analytics Engine with RedisGraph by Matthew Goos...
Building a Multi-dimensional Analytics Engine with RedisGraph by Matthew Goos...Redis Labs
 
RediSearch 1.6 by Pieter Cailliau - Redis Day Bangalore 2020
RediSearch 1.6 by Pieter Cailliau - Redis Day Bangalore 2020RediSearch 1.6 by Pieter Cailliau - Redis Day Bangalore 2020
RediSearch 1.6 by Pieter Cailliau - Redis Day Bangalore 2020Redis Labs
 
RedisGraph 2.0 by Pieter Cailliau - Redis Day Bangalore 2020
RedisGraph 2.0 by Pieter Cailliau - Redis Day Bangalore 2020RedisGraph 2.0 by Pieter Cailliau - Redis Day Bangalore 2020
RedisGraph 2.0 by Pieter Cailliau - Redis Day Bangalore 2020Redis Labs
 
RedisTimeSeries 1.2 by Pieter Cailliau - Redis Day Bangalore 2020
RedisTimeSeries 1.2 by Pieter Cailliau - Redis Day Bangalore 2020RedisTimeSeries 1.2 by Pieter Cailliau - Redis Day Bangalore 2020
RedisTimeSeries 1.2 by Pieter Cailliau - Redis Day Bangalore 2020Redis Labs
 
RedisAI 0.9 by Sherin Thomas of Tensorwerk - Redis Day Bangalore 2020
RedisAI 0.9 by Sherin Thomas of Tensorwerk - Redis Day Bangalore 2020RedisAI 0.9 by Sherin Thomas of Tensorwerk - Redis Day Bangalore 2020
RedisAI 0.9 by Sherin Thomas of Tensorwerk - Redis Day Bangalore 2020Redis Labs
 
Rate-Limiting 30 Million requests by Vijay Lakshminarayanan and Girish Koundi...
Rate-Limiting 30 Million requests by Vijay Lakshminarayanan and Girish Koundi...Rate-Limiting 30 Million requests by Vijay Lakshminarayanan and Girish Koundi...
Rate-Limiting 30 Million requests by Vijay Lakshminarayanan and Girish Koundi...Redis Labs
 
Three Pillars of Observability by Rajalakshmi Raji Srinivasan of Site24x7 Zoh...
Three Pillars of Observability by Rajalakshmi Raji Srinivasan of Site24x7 Zoh...Three Pillars of Observability by Rajalakshmi Raji Srinivasan of Site24x7 Zoh...
Three Pillars of Observability by Rajalakshmi Raji Srinivasan of Site24x7 Zoh...Redis Labs
 
Solving Complex Scaling Problems by Prashant Kumar and Abhishek Jain of Myntr...
Solving Complex Scaling Problems by Prashant Kumar and Abhishek Jain of Myntr...Solving Complex Scaling Problems by Prashant Kumar and Abhishek Jain of Myntr...
Solving Complex Scaling Problems by Prashant Kumar and Abhishek Jain of Myntr...Redis Labs
 

Mehr von Redis Labs (20)

Redis Day Bangalore 2020 - Session state caching with redis
Redis Day Bangalore 2020 - Session state caching with redisRedis Day Bangalore 2020 - Session state caching with redis
Redis Day Bangalore 2020 - Session state caching with redis
 
Protecting Your API with Redis by Jane Paek - Redis Day Seattle 2020
Protecting Your API with Redis by Jane Paek - Redis Day Seattle 2020Protecting Your API with Redis by Jane Paek - Redis Day Seattle 2020
Protecting Your API with Redis by Jane Paek - Redis Day Seattle 2020
 
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...
 
SQL, Redis and Kubernetes by Paul Stanton of Windocks - Redis Day Seattle 2020
SQL, Redis and Kubernetes by Paul Stanton of Windocks - Redis Day Seattle 2020SQL, Redis and Kubernetes by Paul Stanton of Windocks - Redis Day Seattle 2020
SQL, Redis and Kubernetes by Paul Stanton of Windocks - Redis Day Seattle 2020
 
Rust and Redis - Solving Problems for Kubernetes by Ravi Jagannathan of VMwar...
Rust and Redis - Solving Problems for Kubernetes by Ravi Jagannathan of VMwar...Rust and Redis - Solving Problems for Kubernetes by Ravi Jagannathan of VMwar...
Rust and Redis - Solving Problems for Kubernetes by Ravi Jagannathan of VMwar...
 
Redis for Data Science and Engineering by Dmitry Polyakovsky of Oracle
Redis for Data Science and Engineering by Dmitry Polyakovsky of OracleRedis for Data Science and Engineering by Dmitry Polyakovsky of Oracle
Redis for Data Science and Engineering by Dmitry Polyakovsky of Oracle
 
Practical Use Cases for ACLs in Redis 6 by Jamie Scott - Redis Day Seattle 2020
Practical Use Cases for ACLs in Redis 6 by Jamie Scott - Redis Day Seattle 2020Practical Use Cases for ACLs in Redis 6 by Jamie Scott - Redis Day Seattle 2020
Practical Use Cases for ACLs in Redis 6 by Jamie Scott - Redis Day Seattle 2020
 
Moving Beyond Cache by Yiftach Shoolman Redis Labs - Redis Day Seattle 2020
Moving Beyond Cache by Yiftach Shoolman Redis Labs - Redis Day Seattle 2020Moving Beyond Cache by Yiftach Shoolman Redis Labs - Redis Day Seattle 2020
Moving Beyond Cache by Yiftach Shoolman Redis Labs - Redis Day Seattle 2020
 
Leveraging Redis for System Monitoring by Adam McCormick of SBG - Redis Day S...
Leveraging Redis for System Monitoring by Adam McCormick of SBG - Redis Day S...Leveraging Redis for System Monitoring by Adam McCormick of SBG - Redis Day S...
Leveraging Redis for System Monitoring by Adam McCormick of SBG - Redis Day S...
 
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
 
Highly Available Persistent Session Management Service by Mohamed Elmergawi o...
Highly Available Persistent Session Management Service by Mohamed Elmergawi o...Highly Available Persistent Session Management Service by Mohamed Elmergawi o...
Highly Available Persistent Session Management Service by Mohamed Elmergawi o...
 
Anatomy of a Redis Command by Madelyn Olson of Amazon Web Services - Redis Da...
Anatomy of a Redis Command by Madelyn Olson of Amazon Web Services - Redis Da...Anatomy of a Redis Command by Madelyn Olson of Amazon Web Services - Redis Da...
Anatomy of a Redis Command by Madelyn Olson of Amazon Web Services - Redis Da...
 
Building a Multi-dimensional Analytics Engine with RedisGraph by Matthew Goos...
Building a Multi-dimensional Analytics Engine with RedisGraph by Matthew Goos...Building a Multi-dimensional Analytics Engine with RedisGraph by Matthew Goos...
Building a Multi-dimensional Analytics Engine with RedisGraph by Matthew Goos...
 
RediSearch 1.6 by Pieter Cailliau - Redis Day Bangalore 2020
RediSearch 1.6 by Pieter Cailliau - Redis Day Bangalore 2020RediSearch 1.6 by Pieter Cailliau - Redis Day Bangalore 2020
RediSearch 1.6 by Pieter Cailliau - Redis Day Bangalore 2020
 
RedisGraph 2.0 by Pieter Cailliau - Redis Day Bangalore 2020
RedisGraph 2.0 by Pieter Cailliau - Redis Day Bangalore 2020RedisGraph 2.0 by Pieter Cailliau - Redis Day Bangalore 2020
RedisGraph 2.0 by Pieter Cailliau - Redis Day Bangalore 2020
 
RedisTimeSeries 1.2 by Pieter Cailliau - Redis Day Bangalore 2020
RedisTimeSeries 1.2 by Pieter Cailliau - Redis Day Bangalore 2020RedisTimeSeries 1.2 by Pieter Cailliau - Redis Day Bangalore 2020
RedisTimeSeries 1.2 by Pieter Cailliau - Redis Day Bangalore 2020
 
RedisAI 0.9 by Sherin Thomas of Tensorwerk - Redis Day Bangalore 2020
RedisAI 0.9 by Sherin Thomas of Tensorwerk - Redis Day Bangalore 2020RedisAI 0.9 by Sherin Thomas of Tensorwerk - Redis Day Bangalore 2020
RedisAI 0.9 by Sherin Thomas of Tensorwerk - Redis Day Bangalore 2020
 
Rate-Limiting 30 Million requests by Vijay Lakshminarayanan and Girish Koundi...
Rate-Limiting 30 Million requests by Vijay Lakshminarayanan and Girish Koundi...Rate-Limiting 30 Million requests by Vijay Lakshminarayanan and Girish Koundi...
Rate-Limiting 30 Million requests by Vijay Lakshminarayanan and Girish Koundi...
 
Three Pillars of Observability by Rajalakshmi Raji Srinivasan of Site24x7 Zoh...
Three Pillars of Observability by Rajalakshmi Raji Srinivasan of Site24x7 Zoh...Three Pillars of Observability by Rajalakshmi Raji Srinivasan of Site24x7 Zoh...
Three Pillars of Observability by Rajalakshmi Raji Srinivasan of Site24x7 Zoh...
 
Solving Complex Scaling Problems by Prashant Kumar and Abhishek Jain of Myntr...
Solving Complex Scaling Problems by Prashant Kumar and Abhishek Jain of Myntr...Solving Complex Scaling Problems by Prashant Kumar and Abhishek Jain of Myntr...
Solving Complex Scaling Problems by Prashant Kumar and Abhishek Jain of Myntr...
 

Kürzlich hochgeladen

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
 
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
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
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
 
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
 
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
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
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
 
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
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
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: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
[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
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 

Kürzlich hochgeladen (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
 
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
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
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
 
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...
 
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
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
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...
 
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
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 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: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
[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
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 

RedisConf17- durable_rules

  • 2. Who am I? Why durable_rules? durable_rules is the result of my personal research, it does not reflect the positions of my employer.
  • 3. Agenda • History • Rete • Performance Challenge • Benchmark • Demo • Futures • Q & A
  • 5. 2400 years ago Modus Ponens: Theophrastus on Hypothetical Syllogisms1 "P implies Q and P is asserted to be true, so therefore Q must be true.”2 1. x eats flies and x lives in water -> x is a frog 2. Kermit eats flies 3. Kermit lives in water 4. Kermit is a frog (MP 1, 2, 3) 1. https://plato.stanford.edu/entries/logic-ancient/#ForModPonModTol 2. https://en.wikipedia.org/wiki/Modus_ponens
  • 6. An Expert System emulates the decision-making ability of a human. “starts with the available data and uses inference rules to extract more data (from an end user, for example) until a goal is reached”1 (deftemplate animal (slot name)) (defrule rule-1 ”frogs” (animal (name ?name) (eats flies)) (animal (name ?name) (lives water)) => (printout t ?name ” is frog") (assert (?name is frog))) > assert (Kermit eats flies) > assert (Kermit lives water) > Kermit is frog 1. https://en.wikipedia.org/wiki/Forward_chaining 40 years ago
  • 7. durable_rules is a framework for real-time coordination of events. To analyze information about things that happen to infer more complicated circumstances. var d = require('durable'); d.ruleset('animal', function() { whenAll: { first = m.predicate == 'eats' && m.object == 'flies' m.predicate == 'lives' && m.object == 'water' && m.subject == first.subject } run: { console.log(m.subject + ' is frog'); assert({ subject: first.subject, predicate: 'is', object: 'frog' }); } }); runAll(); >node animals.js >curl -H "content-type: application/json" -X POST -d '{"subject": ”Kermit", "predicate": "eats", "object": ”flies"}' >curl -H "content-type: application/json" -X POST -d '{"subject": ”Kermit", "predicate": ”lives", "object": ”land"}' >Kermit is frog Today
  • 8. Rete : a network especially of blood vessels or nerves : 1 The Rete algorithm was designed by Charles L. Forgy of Carnegie Mellon University, first published in a working paper in 1974. 2 1. https://www.merriam-webster.com/dictionary/rete 2. https://en.wikipedia.org/wiki/Rete_algorithm
  • 9. Kermit eats flies Classic Rete predicate == ‘eats’ object == ‘flies’ predicate == ‘lives’ object == ‘water’ subject == subject assert(frog) Beta node Action node Alpha nodes • Alpha nodes filter and push forward • Beta nodes remember and join • Action nodes schedule execution > assert(Kermit eats flies) > assert(Kermit lives water) > Kermit is frog Kermit eats flies Kermit eats flies Kermit lives water Kermit lives water Kermit lives water Kermit eats flies Kermit lives water
  • 10. Rete D predicate == ‘eats’ object == ‘flies’ predicate == ‘lives’ object == ‘water’ subject == subject Animal Queue • Alpha nodes filter in scripting host • Beta nodes store and join in Redis • Actions queued in Redis assert(frog) • Actions executed in scripting host RedisScriptScript • Work Distribution (massive streams) • Scale out • Fault Tolerance • Multi Language (node.js, Python Ruby) Why? Up to 10M/ Sec Up to 100K/Sec Up to 30K/Sec
  • 11. Performance Challenge 1. We have 100000 objects stored in Redis 2. We have 100 objects in a Node.js client 3. We want to generate object pairs that match: first.subject == second.subject
  • 12. First solution var redis = require('redis'), client = redis.createClient(); // more details here… var callback = function (err, res) { var first = JSON.parse(res); for (var ii = 0; ii < localObjects.length; ++ii) { if (first.subject == localObjects[ii].subject) { results.push({first: first, second: localObjects[ii]}); } } if (i != 99999) { ++i; client.lindex('test', i, callback); } } client.lindex('test', i, callback); “{‘subject’:1, ’object’:’flies’}” “{‘subject’:2, ’object’:’flies’}” “{‘subject’:3, ’object’:’flies’}” “{‘subject’:4, ’object’:’flies’}” “{‘subject’:5, ’object’:’flies’}” “{‘subject’:6, ’object’:’flies’}” “{‘subject’:7, ’object’:’flies’}” “{‘subject’:8, ’object’:’flies’}” “{‘subject’:9, ’object’:’flies’}” “{‘subject’:2, ’object’:’water’}” “{‘subject’:3, ’object’:’water’}” , 100000 “{‘subject’:4, ’object’:’flies’}” “{‘subject’:5, ’object’:’flies’}” , 100 “{‘subject’:1, ’object’:’flies’}” “{‘subject’:1, ’object’:’flies’}” “{‘subject’:1, ’object’:’flies’}” “{‘subject’:1, ’object’:’flies’}” “{‘subject’:1, ’object’:’flies’}” RedisNode.js Total execution time -> 4067 ms
  • 13. Second solution var redis = require('redis'), client = redis.createClient(); // more details here… var callback = function (err, res) { var first = JSON.parse(res); results.push({first: first, second: objects[i]}); if (i != localObjects.length - 1) { ++i; client.hget('test', localObjects[i].subject, callback); } } client.hget('test', localObjects[i].subject, callback); “{‘subject’:1, ’object’:’flies’}” “{‘subject’:2, ’object’:’flies’}” “{‘subject’:3, ’object’:’flies’}” “{‘subject’:4, ’object’:’flies’}” “{‘subject’:5, ’object’:’flies’}” “{‘subject’:6, ’object’:’flies’}” “{‘subject’:7, ’object’:’flies’}” “{‘subject’:8, ’object’:’flies’}” “{‘subject’:9, ’object’:’flies’}” “{‘subject’:2, ’object’:’water’}” “{‘subject’:3, ’object’:’water’}” , 100000 “{‘subject’:4, ’object’:’flies’}” “{‘subject’:5, ’object’:’flies’}” , 100 1 2 3 4 5 6 7 8 9 RedisNode.js “{‘subject’:3, ’object’:’flies’}” “{‘subject’:2, ’object’:’flies’}” Total execution time -> 7 ms
  • 14. Third solution var redis = require('redis'), client = redis.createClient(); // more details here… client.script('load', 'local results = {}n' + 'for i = 1, #ARGV, 1 don' + ' results[i] = redis.call("hget", "test", ARGV[i])n' + 'endn' + 'return resultsn', function (err, res) { var hash = res; var callback = function (err, res) { for (var ii = 0; ii < localObjects.length; ++ii) { results.push({first: JSON.parse(res[ii]), second: localObjects[ii]}); } }; var args = [hash, 0]; for (ii = 0; ii < localObjects.length; ++ii) { args.push(localObjects[ii].subject); } args.push(callback); client.evalsha.apply(client, args); } ); “{‘subject’:1, ’object’:’flies’}” “{‘subject’:2, ’object’:’flies’}” “{‘subject’:3, ’object’:’flies’}” “{‘subject’:4, ’object’:’flies’}” “{‘subject’:5, ’object’:’flies’}” “{‘subject’:6, ’object’:’flies’}” “{‘subject’:7, ’object’:’flies’}” “{‘subject’:8, ’object’:’flies’}” “{‘subject’:9, ’object’:’flies’}” “{‘subject’:2, ’object’:’water’}” “{‘subject’:3, ’object’:’water’}” , 100000 “{‘subject’:4, ’object’:’flies’}” “{‘subject’:5, ’object’:’flies’}” , 100 1 2 3 4 5 6 7 8 9 RedisNode.js Total execution time -> 600 micros “{‘subject’:2, ’object’:’flies’}” “{‘subject’:3, ’object’:’flies’}” “{‘subject’:4, ’object’:’flies’}” “{‘subject’:5, ’object’:’flies’}” “{‘subject’:2, ’object’:’flies’}” “{‘subject’:3, ’object’:’flies’}” “{‘subject’:4, ’object’:’flies’}” “{‘subject’:5, ’object’:’flies’}”
  • 16. Benchmark Miss Manners has decided to throw a party. She wants to seat her guests such that adjacent people are of opposite sex and share at least one hobby. The problem has to be solved for 8, 16, 32 and 128 guests.
  • 17. The Challenge assign: { to: 'make’ whenAll: { seating = m.t == 'seating' && m.path == true rightGuest = m.t == 'guest' && m.name == seating.rightGuestName leftGuest = m.t == 'guest' && m.sex != rightGuest.sex && m.hobby == rightGuest.hobby none(m.t == 'path' && m.pid == seating.tid && m.guestName ==leftGuest.name) none(m.t == 'chosen' && m.cid == seating.tid && m.guestName == leftGuest.name && m.hobby == rightGuest.hobby) } run: { assert({ t: 'seating', tid: s.count, pid: seating.tid, path: false, leftSeat: seating.rightSeat, leftGuestName: seating.rightGuestName, rightSeat: seating.rightSeat + 1, rightGuestName: leftGuest.name }); assert({ t: 'path', pid: s.count, seat: seating.rightSeat + 1, guestName: leftGuest.name }); assert({ t: 'chosen', cid: seating.tid, guestName: leftGuest.name, hobby: rightGuest.hobby }); s.count += 1; } }
  • 19. Futures • Performance • Richer Queries (array support) • Facts: Queries (facts, antecedents) • Events: Bloom Filters • WebSite • Service
  • 20. Q & A To learn more: https://github.com/jruizgit/rules @jruiztwi