SlideShare a Scribd company logo
redis 
überall 
Mariano Vallés! 
@zucaritask
redis 
/rədɪs/ 
@zucaritask
redis 
/rədɪs/ 
in memory key-value cache and store 
@zucaritask
redis 
/rədɪs/ 
in memory key-value cache and store 
Considered a data structure server since keys 
can contain strings, hashes, lists, sets … 
@zucaritask
First: Nested hashes 
In redis: 
[ ! 
] a hash has values 
[ ] those values can be hashes
First: Nested hashes 
In redis: 
! ✓ 
[ ] a hash has values 
[ ] those values can be hashes
First: Nested hashes 
In redis: 
✓ 
[ ] a hash has values 
[ ] those values can be hashes 
! 
✘
First: Nested hashes 
:001 
> 
$redis.hgetall(“levels:1234"). 
! 
{ 
easy_10: 
“{"progress":0,"goal":10,"started_at":1415278026,"finished_at":0}", 
easy_20: 
"{"progress":0,"goal":20,"started_at":1415278050,"finished_at":0}" 
}
First: Nested hashes 
:001 
> 
$redis.hgetall(“levels:1234"). 
! 
{ 
easy_10: 
“{"progress":0,"goal":10,"started_at":1415278026,"finished_at":0}", 
easy_20: 
"{"progress":0,"goal":20,"started_at":1415278050,"finished_at":0}" 
} 
:002 
> 
$redis.hgetall(“levels:1234").inject({}) 
do 
|result, 
(key, 
value)| 
result[key] 
= 
JSON.parse(value); 
result 
end 
=> 
{ 
easy_10: 
{progress: 
0, 
goal: 
10, 
started_at: 
1415278026, 
finished_at: 
0} 
easy_20: 
{progress: 
0, 
:goal: 
20, 
started_at: 
1415278050, 
finished_at: 
0} 
}
Redis hash 
:001 
> 
$redis.hgetall(“levels:1234"). 
! 
{ 
easy_10: 
“{"progress":0,"goal":10,"started_at":1415278026,"finished_at":0}", 
easy_20: 
"{"progress":0,"goal":20,"started_at":1415278050,"finished_at":0}" 
} 
:002 
>$redis.hgetall(“levels:1234").inject({}) 
do 
|result, 
(key, 
value)| 
result[key] 
= 
JSON.parse(value); 
result 
end 
=> 
{ 
easy_10: 
{:progress 
=> 
0, 
:goal 
=> 
10, 
started_at: 
1415278026, 
finished_at: 
0} 
easy_20: 
{:progress 
=> 
0, 
:goal 
=> 
20, 
started_at: 
1415278050, 
finished_at: 
0} 
}
Redis hash 
:001 
> 
$redis.hgetall(“levels:1234"). 
! 
{ 
! 
easy_10: 
“{"progress":0,"goal":10,"started_at":1415278026,"finished_at":0}", 
easy_20: 
"{"progress":0,"goal":20,"started_at":1415278050,"finished_at":0}" 
} 
deal with 
le crowd 
:002 
>$redis.hgetall(“levels:1234").inject({}) 
do 
|result, 
(key, 
value)| 
result[key] 
= 
JSON.parse(value); 
result 
end 
=> 
{ 
easy_10: 
{:progress 
=> 
0, 
:goal 
=> 
10, 
started_at: 
1415278026, 
finished_at: 
0} 
easy_20: 
{:progress 
=> 
0, 
:goal 
=> 
20, 
started_at: 
1415278050, 
finished_at: 
0} 
}
First: Nested hashes 
From: 
{ 
easy_10: 
“{"progress":0,"goal":10,"started_at":1415278026,"finished_at":easy_20: 
"{"progress":0,"goal":20,"started_at":1415278050,"finished_at":}
First: Nested hashes 
From: 
{ 
easy_10: 
“{"progress":0,"goal":10,"started_at":1415278026,"finished_at":easy_20: 
"{"progress":0,"goal":20,"started_at":1415278050,"finished_at":} 
To:
First: Nested hashes 
From: 
{ 
easy_10: 
“{"progress":0,"goal":10,"started_at":1415278026,"finished_at":easy_20: 
"{"progress":0,"goal":20,"started_at":1415278050,"finished_at":} 
To: 
{ 
easy_10: 
"0,10,1415278026,0", 
easy_20: 
"4,20,1415278050,0" 
}
First: Nested hashes 
{ 
easy_10: 
"0,10,1415278026,0", 
easy_20: 
"4,20,1415278050,0" 
} To:
First: Nested hashes 
goal 
{ 
easy_10: 
"0,10,1415278026,0", 
easy_20: 
"4,20,1415278050,0" 
} To: 
progress 
started_at 
finished at
In redis: 
[ ] hashes are memory efficient 
[ ] millions of hashes are memory 
efficient 
! 
Last: Avoiding hashes
Last: Avoiding hashes 
In redis: 
[ ] hashes are memory efficient 
[ ] millions of hashes are memory 
efficient 
! ✓
Last: Avoiding hashes 
In redis: 
✓ 
[ ] hashes are memory efficient 
[ ] millions of hashes are memory 
efficient 
! 
✘
Last: Avoiding hashes
Last: Avoiding hashes 
:01 
> 
$redis.hgetall(“counter:1234”)
Last: Avoiding hashes 
:01 
> 
$redis.hgetall(“counter:1234”) 
=> 
{ 
popup_shown: 
1, 
extra_life_given: 
0 
}
the crowd 
has no mercy
the crowd 
has no mercy 
de a l w i th i t
Last: Avoiding hashes 
From: 
To: 
:01 
> 
$redis.hgetall(“counter:1234”) 
=> 
{ 
popup_shown: 
1, 
extra_life_given: 
0 
}
Last: Avoiding hashes 
From: 
To: 
:01 
> 
$redis.hgetall(“counter:1234”) 
=> 
{ 
popup_shown: 
1, 
extra_life_given: 
0 
} 
:01 
> 
$redis.get(“counter:1234”) 
=> 
"u0000u0001"
Last: Avoiding hashes 
From: 
To: 
:01 
> 
$redis.hgetall(“counter:1234”) 
=> 
{ 
popup_shown: 
1, 
extra_life_given: 
0 
} 
:01 
> 
$redis.get(“counter:1234”) 
=> 
"u0000u0001" 
A sequence of binary data
Last: Avoiding hashes 
From: 
To: 
:01 
> 
$redis.hgetall(“counter:1234”) 
=> 
{ 
popup_shown: 
1, 
extra_life_given: 
0 
} 
:01 
> 
$redis.get(“counter:1234”) 
=> 
"u0000u0001" 
A sequence of binary data 
Less memory usage FTW!
Last: Avoiding hashes 
class 
Counter 
! 
COUNTERS 
= 
%w[ 
VERSION 
popup_shown 
extra_life_given 
] 
! 
def 
set(key, 
value) 
$redis.setrange( 
user_id, 
COUNTERS.index(key), 
[value].pack("C*") 
) 
end 
! 
def 
[](key) 
char 
= 
$redis.getrange(user_id, 
index, 
index) 
char.unpack("C*").first.to_i 
end 
end
Last: Avoiding hashes 
class 
Counter 
! 
COUNTERS 
= 
%w[ 
VERSION 
popup_shown 
extra_life_given 
] 
! 
def 
set(key, 
value) 
$redis.setrange( 
user_id, 
COUNTERS.index(key), 
[value].pack("C*") 
) 
end 
! 
def 
[](key) 
char 
= 
$redis.getrange(user_id, 
index, 
index) 
char.unpack("C*").first.to_i 
end 
end
Last: Avoiding hashes 
class 
Counter 
! 
COUNTERS 
= 
%w[ 
VERSION 
popup_shown 
extra_life_given 
] 
! 
def 
set(key, 
value) 
$redis.setrange( 
user_id, 
COUNTERS.index(key), 
[value].pack("C*") 
) 
end 
! 
def 
[](key) 
char 
= 
$redis.getrange(user_id, 
index, 
index) 
char.unpack("C*").first.to_i 
end 
end
Last: Avoiding hashes 
class 
Counter 
! 
COUNTERS 
= 
%w[ 
VERSION 
popup_shown 
extra_life_given 
] 
! 
def 
set(key, 
value) 
$redis.setrange( 
user_id, 
COUNTERS.index(key), 
[value].pack("C*") 
) 
end 
! 
def 
set the value for a part of a string 
[](key) 
char 
= 
$redis.getrange(user_id, 
index, 
index) 
char.unpack("C*").first.to_i 
end 
end
Last: Avoiding hashes 
class 
Counter 
! 
COUNTERS 
= 
%w[ 
VERSION 
popup_shown 
extra_life_given 
] 
! 
def 
set(key, 
value) 
$redis.setrange( 
user_id, 
COUNTERS.index(key), 
[value].pack("C*") 
) 
end 
! 
def 
set the value for a part of a string 
starting in this position 
[](key) 
char 
= 
$redis.getrange(user_id, 
index, 
index) 
char.unpack("C*").first.to_i 
end 
end
Last: Avoiding hashes 
class 
Counter 
! 
COUNTERS 
= 
%w[ 
VERSION 
popup_shown 
extra_life_given 
] 
! 
def 
set(key, 
value) 
$redis.setrange( 
user_id, 
COUNTERS.index(key), 
[value].pack("C*") 
) 
end 
! 
def 
set the value for a part of a string 
starting in this position 
turn an integer into an 8-bit unsigned char 
[](key) 
char 
= 
$redis.getrange(user_id, 
index, 
index) 
char.unpack("C*").first.to_i 
end 
end
Last: Avoiding hashes
Last: Avoiding hashes 
:01 
> 
[0].pack(“C*”) 
=> 
"x00"
Last: Avoiding hashes 
:01 
> 
[0].pack(“C*”) 
=> 
"x00" 
:02 
> 
[256].pack(“C*”) 
=> 
"x00"
Last: Avoiding hashes 
Ac h t u n g , 8 bits ! 
:01 
> 
[0].pack(“C*”) 
=> 
"x00" 
:02 
> 
[256].pack(“C*”) 
=> 
"x00"
redis 
überall 
but 
@zucaritask 
use 
beware of the crowds

More Related Content

What's hot

Introduccion administracion
Introduccion administracionIntroduccion administracion
Introduccion administracion
MARSHY LABK
 
Gta v savegame
Gta v savegameGta v savegame
Gta v savegame
hozayfa999
 
Aggregation Pipeline Power++: MongoDB 4.2 파이프 라인 쿼리, 업데이트 및 구체화된 뷰 소개 [MongoDB]
Aggregation Pipeline Power++: MongoDB 4.2 파이프 라인 쿼리, 업데이트 및 구체화된 뷰 소개 [MongoDB]Aggregation Pipeline Power++: MongoDB 4.2 파이프 라인 쿼리, 업데이트 및 구체화된 뷰 소개 [MongoDB]
Aggregation Pipeline Power++: MongoDB 4.2 파이프 라인 쿼리, 업데이트 및 구체화된 뷰 소개 [MongoDB]
MongoDB
 
Codigos
CodigosCodigos
Codigos
Manuel Valero
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
Guilherme Blanco
 
Daily notes
Daily notesDaily notes
Daily notes
meghendra168
 
You Got Async in my PHP!
You Got Async in my PHP!You Got Async in my PHP!
You Got Async in my PHP!
Chris Tankersley
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome Town
Ross Tuck
 
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Masahiro Nagano
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object Calisthenics
Guilherme Blanco
 
Things I Believe Now That I'm Old
Things I Believe Now That I'm OldThings I Believe Now That I'm Old
Things I Believe Now That I'm Old
Ross Tuck
 
distill
distilldistill
Devs for Leokz e 7Masters - WTF Oriented Programming
Devs for Leokz e 7Masters - WTF Oriented ProgrammingDevs for Leokz e 7Masters - WTF Oriented Programming
Devs for Leokz e 7Masters - WTF Oriented Programming
Fabio Akita
 
wget.pl
wget.plwget.pl
PHP tips and tricks
PHP tips and tricks PHP tips and tricks
PHP tips and tricks
Damien Seguy
 
Everything About PowerShell
Everything About PowerShellEverything About PowerShell
Everything About PowerShell
Gaetano Causio
 
Php
PhpPhp
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and Hobgoblins
Ross Tuck
 
Groovy puzzlers jug-moscow-part 2
Groovy puzzlers jug-moscow-part 2Groovy puzzlers jug-moscow-part 2
Groovy puzzlers jug-moscow-part 2
Evgeny Borisov
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
Sanketkumar Biswas
 

What's hot (20)

Introduccion administracion
Introduccion administracionIntroduccion administracion
Introduccion administracion
 
Gta v savegame
Gta v savegameGta v savegame
Gta v savegame
 
Aggregation Pipeline Power++: MongoDB 4.2 파이프 라인 쿼리, 업데이트 및 구체화된 뷰 소개 [MongoDB]
Aggregation Pipeline Power++: MongoDB 4.2 파이프 라인 쿼리, 업데이트 및 구체화된 뷰 소개 [MongoDB]Aggregation Pipeline Power++: MongoDB 4.2 파이프 라인 쿼리, 업데이트 및 구체화된 뷰 소개 [MongoDB]
Aggregation Pipeline Power++: MongoDB 4.2 파이프 라인 쿼리, 업데이트 및 구체화된 뷰 소개 [MongoDB]
 
Codigos
CodigosCodigos
Codigos
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
 
Daily notes
Daily notesDaily notes
Daily notes
 
You Got Async in my PHP!
You Got Async in my PHP!You Got Async in my PHP!
You Got Async in my PHP!
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome Town
 
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object Calisthenics
 
Things I Believe Now That I'm Old
Things I Believe Now That I'm OldThings I Believe Now That I'm Old
Things I Believe Now That I'm Old
 
distill
distilldistill
distill
 
Devs for Leokz e 7Masters - WTF Oriented Programming
Devs for Leokz e 7Masters - WTF Oriented ProgrammingDevs for Leokz e 7Masters - WTF Oriented Programming
Devs for Leokz e 7Masters - WTF Oriented Programming
 
wget.pl
wget.plwget.pl
wget.pl
 
PHP tips and tricks
PHP tips and tricks PHP tips and tricks
PHP tips and tricks
 
Everything About PowerShell
Everything About PowerShellEverything About PowerShell
Everything About PowerShell
 
Php
PhpPhp
Php
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and Hobgoblins
 
Groovy puzzlers jug-moscow-part 2
Groovy puzzlers jug-moscow-part 2Groovy puzzlers jug-moscow-part 2
Groovy puzzlers jug-moscow-part 2
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 

Viewers also liked

Information systems and technologys in the economic by Klimushin_Orlov_Serenok
Information systems and technologys in the economic by Klimushin_Orlov_SerenokInformation systems and technologys in the economic by Klimushin_Orlov_Serenok
Information systems and technologys in the economic by Klimushin_Orlov_Serenok
Artem Serenok
 
Формування системи законодавчого забезпечення охорони здоров'я в Україні
Формування системи законодавчого забезпечення охорони здоров'я в УкраїніФормування системи законодавчого забезпечення охорони здоров'я в Україні
Формування системи законодавчого забезпечення охорони здоров'я в УкраїніArtem Serenok
 
Transmedia storytelling
Transmedia storytellingTransmedia storytelling
Transmedia storytelling
baldwind1976
 
Серенок А.О. - Автореферат дисертаційної роботи "Механізми взаємодії органів ...
Серенок А.О. - Автореферат дисертаційної роботи "Механізми взаємодії органів ...Серенок А.О. - Автореферат дисертаційної роботи "Механізми взаємодії органів ...
Серенок А.О. - Автореферат дисертаційної роботи "Механізми взаємодії органів ...
Artem Serenok
 
НОРМАТИВНО-ПРАВОВІ ЗАСАДИ ОБІГУ ЛІКАРСЬКИХ ЗАСОБІВ В УКРАЇНІ
НОРМАТИВНО-ПРАВОВІ ЗАСАДИ ОБІГУ ЛІКАРСЬКИХ ЗАСОБІВ В УКРАЇНІНОРМАТИВНО-ПРАВОВІ ЗАСАДИ ОБІГУ ЛІКАРСЬКИХ ЗАСОБІВ В УКРАЇНІ
НОРМАТИВНО-ПРАВОВІ ЗАСАДИ ОБІГУ ЛІКАРСЬКИХ ЗАСОБІВ В УКРАЇНІArtem Serenok
 
How I earned 0.00009BTC - Lighning.io 2014
How I earned 0.00009BTC - Lighning.io 2014How I earned 0.00009BTC - Lighning.io 2014
How I earned 0.00009BTC - Lighning.io 2014
zucaritask
 
An Analysis of a Checkpointing Mechanism for a Stream Processing System
An Analysis of a Checkpointing Mechanism for a Stream Processing SystemAn Analysis of a Checkpointing Mechanism for a Stream Processing System
An Analysis of a Checkpointing Mechanism for a Stream Processing System
zucaritask
 
Introduction to the EDF Innovation Exchange
Introduction to the EDF Innovation ExchangeIntroduction to the EDF Innovation Exchange
Introduction to the EDF Innovation Exchange
edf_innovex
 
Green Portfolio Framework 7 09
Green Portfolio Framework 7 09Green Portfolio Framework 7 09
Green Portfolio Framework 7 09
edf_innovex
 
Climate Change: Current Policy Landscape and Implications for U.S. Industry
Climate Change: Current Policy Landscape and Implications for U.S. IndustryClimate Change: Current Policy Landscape and Implications for U.S. Industry
Climate Change: Current Policy Landscape and Implications for U.S. Industry
edf_innovex
 
Green Returns: Key Environmental Performance Areas
Green Returns: Key Environmental Performance AreasGreen Returns: Key Environmental Performance Areas
Green Returns: Key Environmental Performance Areasedf_innovex
 
Green Returns: Why It Matters, What It Takes, How It Works
Green Returns: Why It Matters, What It Takes, How It WorksGreen Returns: Why It Matters, What It Takes, How It Works
Green Returns: Why It Matters, What It Takes, How It Worksedf_innovex
 
Green Returns - Case Studies
Green Returns - Case StudiesGreen Returns - Case Studies
Green Returns - Case Studiesedf_innovex
 
EcoValuScreen
EcoValuScreenEcoValuScreen
EcoValuScreen
edf_innovex
 
20 Years of Partnerships. What's Next?
20 Years of Partnerships. What's Next?20 Years of Partnerships. What's Next?
20 Years of Partnerships. What's Next?
edf_innovex
 

Viewers also liked (15)

Information systems and technologys in the economic by Klimushin_Orlov_Serenok
Information systems and technologys in the economic by Klimushin_Orlov_SerenokInformation systems and technologys in the economic by Klimushin_Orlov_Serenok
Information systems and technologys in the economic by Klimushin_Orlov_Serenok
 
Формування системи законодавчого забезпечення охорони здоров'я в Україні
Формування системи законодавчого забезпечення охорони здоров'я в УкраїніФормування системи законодавчого забезпечення охорони здоров'я в Україні
Формування системи законодавчого забезпечення охорони здоров'я в Україні
 
Transmedia storytelling
Transmedia storytellingTransmedia storytelling
Transmedia storytelling
 
Серенок А.О. - Автореферат дисертаційної роботи "Механізми взаємодії органів ...
Серенок А.О. - Автореферат дисертаційної роботи "Механізми взаємодії органів ...Серенок А.О. - Автореферат дисертаційної роботи "Механізми взаємодії органів ...
Серенок А.О. - Автореферат дисертаційної роботи "Механізми взаємодії органів ...
 
НОРМАТИВНО-ПРАВОВІ ЗАСАДИ ОБІГУ ЛІКАРСЬКИХ ЗАСОБІВ В УКРАЇНІ
НОРМАТИВНО-ПРАВОВІ ЗАСАДИ ОБІГУ ЛІКАРСЬКИХ ЗАСОБІВ В УКРАЇНІНОРМАТИВНО-ПРАВОВІ ЗАСАДИ ОБІГУ ЛІКАРСЬКИХ ЗАСОБІВ В УКРАЇНІ
НОРМАТИВНО-ПРАВОВІ ЗАСАДИ ОБІГУ ЛІКАРСЬКИХ ЗАСОБІВ В УКРАЇНІ
 
How I earned 0.00009BTC - Lighning.io 2014
How I earned 0.00009BTC - Lighning.io 2014How I earned 0.00009BTC - Lighning.io 2014
How I earned 0.00009BTC - Lighning.io 2014
 
An Analysis of a Checkpointing Mechanism for a Stream Processing System
An Analysis of a Checkpointing Mechanism for a Stream Processing SystemAn Analysis of a Checkpointing Mechanism for a Stream Processing System
An Analysis of a Checkpointing Mechanism for a Stream Processing System
 
Introduction to the EDF Innovation Exchange
Introduction to the EDF Innovation ExchangeIntroduction to the EDF Innovation Exchange
Introduction to the EDF Innovation Exchange
 
Green Portfolio Framework 7 09
Green Portfolio Framework 7 09Green Portfolio Framework 7 09
Green Portfolio Framework 7 09
 
Climate Change: Current Policy Landscape and Implications for U.S. Industry
Climate Change: Current Policy Landscape and Implications for U.S. IndustryClimate Change: Current Policy Landscape and Implications for U.S. Industry
Climate Change: Current Policy Landscape and Implications for U.S. Industry
 
Green Returns: Key Environmental Performance Areas
Green Returns: Key Environmental Performance AreasGreen Returns: Key Environmental Performance Areas
Green Returns: Key Environmental Performance Areas
 
Green Returns: Why It Matters, What It Takes, How It Works
Green Returns: Why It Matters, What It Takes, How It WorksGreen Returns: Why It Matters, What It Takes, How It Works
Green Returns: Why It Matters, What It Takes, How It Works
 
Green Returns - Case Studies
Green Returns - Case StudiesGreen Returns - Case Studies
Green Returns - Case Studies
 
EcoValuScreen
EcoValuScreenEcoValuScreen
EcoValuScreen
 
20 Years of Partnerships. What's Next?
20 Years of Partnerships. What's Next?20 Years of Partnerships. What's Next?
20 Years of Partnerships. What's Next?
 

Similar to redis überall

Modern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapModern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter Bootstrap
Howard Lewis Ship
 
Wx::Perl::Smart
Wx::Perl::SmartWx::Perl::Smart
Wx::Perl::Smart
lichtkind
 
Apache Spark for Library Developers with William Benton and Erik Erlandson
 Apache Spark for Library Developers with William Benton and Erik Erlandson Apache Spark for Library Developers with William Benton and Erik Erlandson
Apache Spark for Library Developers with William Benton and Erik Erlandson
Databricks
 
Refactor like a boss
Refactor like a bossRefactor like a boss
Refactor like a boss
gsterndale
 
Laziness in Swift
Laziness in Swift Laziness in Swift
Laziness in Swift
SwiftWro
 
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Workhorse Computing
 
ddd+scala
ddd+scaladdd+scala
ddd+scala
潤一 加藤
 
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
MongoSF
 
Open Source Search: An Analysis
Open Source Search: An AnalysisOpen Source Search: An Analysis
Open Source Search: An Analysis
Justin Finkelstein
 
07 php
07 php07 php
07 php
CBRIARCSC
 
Presentaion
PresentaionPresentaion
Presentaion
CBRIARCSC
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kirill Rozov
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday Developer
Ross Tuck
 
Wrong
WrongWrong
MongoDB
MongoDB MongoDB
Compose Async with RxJS
Compose Async with RxJSCompose Async with RxJS
Compose Async with RxJS
Kyung Yeol Kim
 
Design Patterns the Ruby way - ConFoo 2015
Design Patterns the Ruby way - ConFoo 2015Design Patterns the Ruby way - ConFoo 2015
Design Patterns the Ruby way - ConFoo 2015
Fred Heath
 
When Bad Things Come In Good Packages
When Bad Things Come In Good PackagesWhen Bad Things Come In Good Packages
When Bad Things Come In Good Packages
Saumil Shah
 
Where's My SQL? Designing Databases with ActiveRecord Migrations
Where's My SQL? Designing Databases with ActiveRecord MigrationsWhere's My SQL? Designing Databases with ActiveRecord Migrations
Where's My SQL? Designing Databases with ActiveRecord Migrations
Eleanor McHugh
 
Assiciate Expressions to Names in Scala
Assiciate Expressions to Names in ScalaAssiciate Expressions to Names in Scala
Assiciate Expressions to Names in Scala
Kexin Xie
 

Similar to redis überall (20)

Modern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapModern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter Bootstrap
 
Wx::Perl::Smart
Wx::Perl::SmartWx::Perl::Smart
Wx::Perl::Smart
 
Apache Spark for Library Developers with William Benton and Erik Erlandson
 Apache Spark for Library Developers with William Benton and Erik Erlandson Apache Spark for Library Developers with William Benton and Erik Erlandson
Apache Spark for Library Developers with William Benton and Erik Erlandson
 
Refactor like a boss
Refactor like a bossRefactor like a boss
Refactor like a boss
 
Laziness in Swift
Laziness in Swift Laziness in Swift
Laziness in Swift
 
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
 
ddd+scala
ddd+scaladdd+scala
ddd+scala
 
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
 
Open Source Search: An Analysis
Open Source Search: An AnalysisOpen Source Search: An Analysis
Open Source Search: An Analysis
 
07 php
07 php07 php
07 php
 
Presentaion
PresentaionPresentaion
Presentaion
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday Developer
 
Wrong
WrongWrong
Wrong
 
MongoDB
MongoDB MongoDB
MongoDB
 
Compose Async with RxJS
Compose Async with RxJSCompose Async with RxJS
Compose Async with RxJS
 
Design Patterns the Ruby way - ConFoo 2015
Design Patterns the Ruby way - ConFoo 2015Design Patterns the Ruby way - ConFoo 2015
Design Patterns the Ruby way - ConFoo 2015
 
When Bad Things Come In Good Packages
When Bad Things Come In Good PackagesWhen Bad Things Come In Good Packages
When Bad Things Come In Good Packages
 
Where's My SQL? Designing Databases with ActiveRecord Migrations
Where's My SQL? Designing Databases with ActiveRecord MigrationsWhere's My SQL? Designing Databases with ActiveRecord Migrations
Where's My SQL? Designing Databases with ActiveRecord Migrations
 
Assiciate Expressions to Names in Scala
Assiciate Expressions to Names in ScalaAssiciate Expressions to Names in Scala
Assiciate Expressions to Names in Scala
 

Recently uploaded

Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
Uni Systems S.M.S.A.
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
Matthew Sinclair
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
sonjaschweigert1
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AIEnchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Vladimir Iglovikov, Ph.D.
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
DianaGray10
 
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with SlackLet's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
shyamraj55
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
Octavian Nadolu
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
danishmna97
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
Data structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdfData structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdf
TIPNGVN2
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
Edge AI and Vision Alliance
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
Neo4j
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
Matthew Sinclair
 
Large Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial ApplicationsLarge Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial Applications
Rohit Gautam
 
Mind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AIMind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AI
Kumud Singh
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
James Anderson
 
Building RAG with self-deployed Milvus vector database and Snowpark Container...
Building RAG with self-deployed Milvus vector database and Snowpark Container...Building RAG with self-deployed Milvus vector database and Snowpark Container...
Building RAG with self-deployed Milvus vector database and Snowpark Container...
Zilliz
 

Recently uploaded (20)

Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AIEnchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
 
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with SlackLet's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
Data structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdfData structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdf
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
 
Large Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial ApplicationsLarge Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial Applications
 
Mind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AIMind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AI
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
 
Building RAG with self-deployed Milvus vector database and Snowpark Container...
Building RAG with self-deployed Milvus vector database and Snowpark Container...Building RAG with self-deployed Milvus vector database and Snowpark Container...
Building RAG with self-deployed Milvus vector database and Snowpark Container...
 

redis überall

  • 1. redis überall Mariano Vallés! @zucaritask
  • 3. redis /rədɪs/ in memory key-value cache and store @zucaritask
  • 4. redis /rədɪs/ in memory key-value cache and store Considered a data structure server since keys can contain strings, hashes, lists, sets … @zucaritask
  • 5. First: Nested hashes In redis: [ ! ] a hash has values [ ] those values can be hashes
  • 6. First: Nested hashes In redis: ! ✓ [ ] a hash has values [ ] those values can be hashes
  • 7. First: Nested hashes In redis: ✓ [ ] a hash has values [ ] those values can be hashes ! ✘
  • 8. First: Nested hashes :001 > $redis.hgetall(“levels:1234"). ! { easy_10: “{"progress":0,"goal":10,"started_at":1415278026,"finished_at":0}", easy_20: "{"progress":0,"goal":20,"started_at":1415278050,"finished_at":0}" }
  • 9. First: Nested hashes :001 > $redis.hgetall(“levels:1234"). ! { easy_10: “{"progress":0,"goal":10,"started_at":1415278026,"finished_at":0}", easy_20: "{"progress":0,"goal":20,"started_at":1415278050,"finished_at":0}" } :002 > $redis.hgetall(“levels:1234").inject({}) do |result, (key, value)| result[key] = JSON.parse(value); result end => { easy_10: {progress: 0, goal: 10, started_at: 1415278026, finished_at: 0} easy_20: {progress: 0, :goal: 20, started_at: 1415278050, finished_at: 0} }
  • 10. Redis hash :001 > $redis.hgetall(“levels:1234"). ! { easy_10: “{"progress":0,"goal":10,"started_at":1415278026,"finished_at":0}", easy_20: "{"progress":0,"goal":20,"started_at":1415278050,"finished_at":0}" } :002 >$redis.hgetall(“levels:1234").inject({}) do |result, (key, value)| result[key] = JSON.parse(value); result end => { easy_10: {:progress => 0, :goal => 10, started_at: 1415278026, finished_at: 0} easy_20: {:progress => 0, :goal => 20, started_at: 1415278050, finished_at: 0} }
  • 11. Redis hash :001 > $redis.hgetall(“levels:1234"). ! { ! easy_10: “{"progress":0,"goal":10,"started_at":1415278026,"finished_at":0}", easy_20: "{"progress":0,"goal":20,"started_at":1415278050,"finished_at":0}" } deal with le crowd :002 >$redis.hgetall(“levels:1234").inject({}) do |result, (key, value)| result[key] = JSON.parse(value); result end => { easy_10: {:progress => 0, :goal => 10, started_at: 1415278026, finished_at: 0} easy_20: {:progress => 0, :goal => 20, started_at: 1415278050, finished_at: 0} }
  • 12. First: Nested hashes From: { easy_10: “{"progress":0,"goal":10,"started_at":1415278026,"finished_at":easy_20: "{"progress":0,"goal":20,"started_at":1415278050,"finished_at":}
  • 13. First: Nested hashes From: { easy_10: “{"progress":0,"goal":10,"started_at":1415278026,"finished_at":easy_20: "{"progress":0,"goal":20,"started_at":1415278050,"finished_at":} To:
  • 14. First: Nested hashes From: { easy_10: “{"progress":0,"goal":10,"started_at":1415278026,"finished_at":easy_20: "{"progress":0,"goal":20,"started_at":1415278050,"finished_at":} To: { easy_10: "0,10,1415278026,0", easy_20: "4,20,1415278050,0" }
  • 15. First: Nested hashes { easy_10: "0,10,1415278026,0", easy_20: "4,20,1415278050,0" } To:
  • 16. First: Nested hashes goal { easy_10: "0,10,1415278026,0", easy_20: "4,20,1415278050,0" } To: progress started_at finished at
  • 17. In redis: [ ] hashes are memory efficient [ ] millions of hashes are memory efficient ! Last: Avoiding hashes
  • 18. Last: Avoiding hashes In redis: [ ] hashes are memory efficient [ ] millions of hashes are memory efficient ! ✓
  • 19. Last: Avoiding hashes In redis: ✓ [ ] hashes are memory efficient [ ] millions of hashes are memory efficient ! ✘
  • 21. Last: Avoiding hashes :01 > $redis.hgetall(“counter:1234”)
  • 22. Last: Avoiding hashes :01 > $redis.hgetall(“counter:1234”) => { popup_shown: 1, extra_life_given: 0 }
  • 23.
  • 24. the crowd has no mercy
  • 25. the crowd has no mercy de a l w i th i t
  • 26. Last: Avoiding hashes From: To: :01 > $redis.hgetall(“counter:1234”) => { popup_shown: 1, extra_life_given: 0 }
  • 27. Last: Avoiding hashes From: To: :01 > $redis.hgetall(“counter:1234”) => { popup_shown: 1, extra_life_given: 0 } :01 > $redis.get(“counter:1234”) => "u0000u0001"
  • 28. Last: Avoiding hashes From: To: :01 > $redis.hgetall(“counter:1234”) => { popup_shown: 1, extra_life_given: 0 } :01 > $redis.get(“counter:1234”) => "u0000u0001" A sequence of binary data
  • 29. Last: Avoiding hashes From: To: :01 > $redis.hgetall(“counter:1234”) => { popup_shown: 1, extra_life_given: 0 } :01 > $redis.get(“counter:1234”) => "u0000u0001" A sequence of binary data Less memory usage FTW!
  • 30. Last: Avoiding hashes class Counter ! COUNTERS = %w[ VERSION popup_shown extra_life_given ] ! def set(key, value) $redis.setrange( user_id, COUNTERS.index(key), [value].pack("C*") ) end ! def [](key) char = $redis.getrange(user_id, index, index) char.unpack("C*").first.to_i end end
  • 31. Last: Avoiding hashes class Counter ! COUNTERS = %w[ VERSION popup_shown extra_life_given ] ! def set(key, value) $redis.setrange( user_id, COUNTERS.index(key), [value].pack("C*") ) end ! def [](key) char = $redis.getrange(user_id, index, index) char.unpack("C*").first.to_i end end
  • 32. Last: Avoiding hashes class Counter ! COUNTERS = %w[ VERSION popup_shown extra_life_given ] ! def set(key, value) $redis.setrange( user_id, COUNTERS.index(key), [value].pack("C*") ) end ! def [](key) char = $redis.getrange(user_id, index, index) char.unpack("C*").first.to_i end end
  • 33. Last: Avoiding hashes class Counter ! COUNTERS = %w[ VERSION popup_shown extra_life_given ] ! def set(key, value) $redis.setrange( user_id, COUNTERS.index(key), [value].pack("C*") ) end ! def set the value for a part of a string [](key) char = $redis.getrange(user_id, index, index) char.unpack("C*").first.to_i end end
  • 34. Last: Avoiding hashes class Counter ! COUNTERS = %w[ VERSION popup_shown extra_life_given ] ! def set(key, value) $redis.setrange( user_id, COUNTERS.index(key), [value].pack("C*") ) end ! def set the value for a part of a string starting in this position [](key) char = $redis.getrange(user_id, index, index) char.unpack("C*").first.to_i end end
  • 35. Last: Avoiding hashes class Counter ! COUNTERS = %w[ VERSION popup_shown extra_life_given ] ! def set(key, value) $redis.setrange( user_id, COUNTERS.index(key), [value].pack("C*") ) end ! def set the value for a part of a string starting in this position turn an integer into an 8-bit unsigned char [](key) char = $redis.getrange(user_id, index, index) char.unpack("C*").first.to_i end end
  • 37. Last: Avoiding hashes :01 > [0].pack(“C*”) => "x00"
  • 38. Last: Avoiding hashes :01 > [0].pack(“C*”) => "x00" :02 > [256].pack(“C*”) => "x00"
  • 39. Last: Avoiding hashes Ac h t u n g , 8 bits ! :01 > [0].pack(“C*”) => "x00" :02 > [256].pack(“C*”) => "x00"
  • 40. redis überall but @zucaritask use beware of the crowds