SlideShare a Scribd company logo
serwer struktur danych w praktyce
CZEŚĆ!
jestem filip.
PLAN
 co to jest redis?
   typy danych
 zabójcze cechy
redis a memcached
 redis w praktyce
   tips & tricks
NOSQL
REDIS TO...



zaawansowany system klucz-wartość
REDIS TO...



serwer struktur danych
@ANTIREZ
 @pnoordhuis
WebClusters, Redis
YYY...
WebClusters, Redis
STRUKTURY DANYCH
STRING
STRING

redis> SET my:key "value"

redis> GET my:key
"value"
STRING

redis> SET my:incr "10"

redis> INCR my:incr

redis> GET my:incr
"11"
STRING
redis> SET hello:world "Web"

redis> APPEND hello:world "Clusters"

redis> GET hello:world
"WebClusters"

redis> GETRANGE hello:world 0 2
"Web"
LIST
LIST
redis> LPUSH list a
redis> LPUSH list b
redis> RPUSH list c

redis> LRANGE list 0 2
1) "b"
2) "a"
3) "c
LIST
redis> LPUSH list a
redis> LPUSH list b
redis> RPUSH list c

redis> RPOPLPUSH list other:list
"a"

redis> LRANGE list 0 3
1) "c"
2) "b"

redis> LRANGE other:list 0 3
1) "a"
SET
SET
redis> SADD post:1:tag "ruby"
redis> SADD post:1:tag "rails"
redis> SADD post:1:tag "redis"

redis> SADD post:2:tag "redis"
redis> SADD post:2:tag "resque"

redis> SINTER post:1:tag post:2:tag
1) "redis"
SET
redis> SADD post:1:tag "ruby"
redis> SADD post:1:tag "rails"
redis> SADD post:1:tag "redis"

redis> SADD post:2:tag "redis"
redis> SADD post:2:tag "resque"

redis> SUNIONSTORE tag post:1:tag post:2:tag
redis> SMEMBERS tag
1) "rails"
2) "redis"
3) "resque"
4) "ruby"
ZSET
ZSET
redis> ZADD zset 1 3
redis> ZADD zset 2 2
redis> ZADD zset 3 1

redis> ZRANGE zset 0 -1
1) "3"
2) "2"
3) "1"
HASH
HASH
redis> HMSET hash string:1 Hello
string:2 WebClusters

redis> HGETALL hash
1) "string:1"
2) "Hello"
3) "string:2"
4) "WebClusters"
HASH
redis> HSET hash string:1 Bye
redis> HSET hash string:3 2011

redis> HGETALL hash
1) "string:1"
2) "Bye"
3) "string:2"
4) "WebClusters"
5) "string:3"
6) "2011"
RTFM
WebClusters, Redis
WebClusters, Redis
WebClusters, Redis
ZABÓJCZE CECHY
TRANSAKCJE
TRANSAKCJE
redis> SET account:1 30
redis> SET account:2 45

redis> MULTI
redis> INCRBY account:1 15
QUEUED

redis> DECRBY account:2 15
QUEUED

redis> EXEC
1) (integer) 45
2) (integer) 30
PERSYSTENCJA
PERSYSTENCJA



     snapshot
  append-only file
PERSYSTENCJA



   na żądanie
   okresowa
REPLIKACJA
REPLIKACJA
PIPELINING
PIPELINING
http://www.flickr.com/photos/chadelliott2012/5659144073/
PIPELINING
PAMIĘĆ WIRTUALNA
PAMIĘĆ WIRTUALNA
KLASTROWANIE
http://www.flickr.com/photos/15708236@N07/2754478731/
http://www.flickr.com/photos/dan4th/301092024/
4096 #
KLASTROWANIE
KLASTROWANIE

redis> #1 GET foo
-MOVED 3 192.168.1.1:6391

redis> #2 GET foo
"bar"
KLASTROWANIE

redis> #1 CLUSTER HINTS
* magic *

redis> #2 GET foo
"bar"
REDIS-TRIB
MEMCACHED?
X 100 000
SET


memcached            redis




6.926125 s         8.470477 s
PIPELINE SET


memcached             redis




6.926125 s        0.916335 s
GET


memcached            redis




6.904938 s         7.572058 s
PIPELINE GET


memcached             redis




6.904938 s       0.651953 s
MGET


memcached             redis




1.010348 s          0.185136 s
RAM


memcached         redis




 436 KB           1.1 MB
RAM



k 17 - 22 bajty
v 19 - 24 bajty
STRING


memcached             redis




  14 MB              13.9 MB
INTEGER


memcached              redis




  11 MB               10.7 MB
HASH


"an-average-key-1" => "1"
"an-average-key" => "1": "1"
HASH


memcached          redis




  11 MB            9 MB
PRAKTYKA
RESQUE
RESTMQ
TWITTER
WHO’S ONLINE?
STATYSTYKI
WYSZUKIWANIE
SOCIAL GRAPH
TIPS & TRICKS
640K ought to be
enough for anybody
3 != “3”
32 > 64
  W BITACH
http://www.flickr.com/photos/memestate/45986749/
ONE MORE THING
WebClusters, Redis
http://www.flickr.com/photos/15708236@N07/2754478731/
-- hello.lua
-- the first program in every language

io.write("Hello world, from ",_VERSION,"!n")
redis = Redis.new
script = <<LUA
  local value = tonumber(redis.call('get',
KEYS[1]))
  if value == nil then return {err = "Value at
key is not integer"} end
  if value > tonumber(ARGV[1])
  then
    value = value - 1
    redis.call('set', KEYS[1], value)
  end
  return value
LUA

redis.set :x, 4
5.times { puts(redis.eval(script, 1, :x, 0)) }
~/Code/webclusters-redis master $ ./run lua.rb
3
2
1
0
0
https://github.com/filiptepper/webclusters-redis
WebClusters, Redis
O CZYM ZAPOMNIAŁEM?

More Related Content

PDF
Node.js - A Quick Tour II
PDF
Nodejs - A-quick-tour-v3
PDF
Redis begins
PDF
Deep Visibility for Production Microservices
PDF
Elasticsearch 1.x Cluster Installation (VirtualBox)
KEY
Node.js - A practical introduction (v2)
PPTX
A simple introduction to redis
PDF
Nodejs a-practical-introduction-oredev
Node.js - A Quick Tour II
Nodejs - A-quick-tour-v3
Redis begins
Deep Visibility for Production Microservices
Elasticsearch 1.x Cluster Installation (VirtualBox)
Node.js - A practical introduction (v2)
A simple introduction to redis
Nodejs a-practical-introduction-oredev

What's hot (20)

PPTX
This is redis - feature and usecase
PDF
REDIS intro and how to use redis
KEY
Node.js - As a networking tool
PDF
Nodejs - A quick tour (v5)
PDF
Nodejs - Should Ruby Developers Care?
PDF
Redis acc
PDF
Nodejs - A quick tour (v4)
PDF
Distributed Data Processing Workshop - SBU
PPT
Lightweight DAS components in Perl
PDF
Nodejs - A quick tour (v6)
PPTX
Caching solutions with Redis
PDF
Node.js in production
PDF
Dirty - How simple is your database?
PDF
Redis, a 2 minutes introduction
PDF
Redis SoCraTes 2014
PDF
Introduction to redis - version 2
PDF
TWJUG 2016 - Mogilefs, 簡約可靠的儲存方案
PPT
New kid on the block node.js
PDF
Mac OS X Lion で作る WordPress local 環境
PPTX
Backup, Restore, and Disaster Recovery
This is redis - feature and usecase
REDIS intro and how to use redis
Node.js - As a networking tool
Nodejs - A quick tour (v5)
Nodejs - Should Ruby Developers Care?
Redis acc
Nodejs - A quick tour (v4)
Distributed Data Processing Workshop - SBU
Lightweight DAS components in Perl
Nodejs - A quick tour (v6)
Caching solutions with Redis
Node.js in production
Dirty - How simple is your database?
Redis, a 2 minutes introduction
Redis SoCraTes 2014
Introduction to redis - version 2
TWJUG 2016 - Mogilefs, 簡約可靠的儲存方案
New kid on the block node.js
Mac OS X Lion で作る WordPress local 環境
Backup, Restore, and Disaster Recovery
Ad

Similar to WebClusters, Redis (20)

PDF
Introduction to Redis
PDF
Redis memcached pdf
PDF
Webエンジニアのためのはじめてのredis
PDF
Webエンジニアのためのはじめてのredis.pdf
PDF
Speed up your Symfony2 application and build awesome features with Redis
PDF
#SydPHP - The Magic of Redis
PPTX
Introduction to Redis
PDF
Scaling Redis To 1M Ops/Sec: Jane Paek
PDF
Serializing Ruby Objects in Redis
PPT
Introduction to redis
PDF
Redis the better NoSQL
PDF
quickguide-einnovator-9-redis
KEY
Redis - N✮SQL Berlin
PDF
Redis acc 2015_eng
PDF
Redis Everywhere - Sunshine PHP
PPTX
Introduction to Redis
PDF
Redispresentation apac2012
KEY
KeyValue Stores
PPTX
PDF
An Introduction to Redis for Developers.pdf
Introduction to Redis
Redis memcached pdf
Webエンジニアのためのはじめてのredis
Webエンジニアのためのはじめてのredis.pdf
Speed up your Symfony2 application and build awesome features with Redis
#SydPHP - The Magic of Redis
Introduction to Redis
Scaling Redis To 1M Ops/Sec: Jane Paek
Serializing Ruby Objects in Redis
Introduction to redis
Redis the better NoSQL
quickguide-einnovator-9-redis
Redis - N✮SQL Berlin
Redis acc 2015_eng
Redis Everywhere - Sunshine PHP
Introduction to Redis
Redispresentation apac2012
KeyValue Stores
An Introduction to Redis for Developers.pdf
Ad

More from Filip Tepper (7)

KEY
KEY
Getting the most out of your Ruby on Rails applications: from zero to hero
KEY
OpenReaktor, Not Only SQL
KEY
NoSQL i dlaczego go nie potrzebujesz? [OlCamp]
PDF
Pan Oponka - Biografia
KEY
Redis at WRUG
PDF
API. Czy warto i dlaczego tak?
Getting the most out of your Ruby on Rails applications: from zero to hero
OpenReaktor, Not Only SQL
NoSQL i dlaczego go nie potrzebujesz? [OlCamp]
Pan Oponka - Biografia
Redis at WRUG
API. Czy warto i dlaczego tak?

WebClusters, Redis

Editor's Notes

  • #2: dlaczego go nie potrzebujesz dzisiaj, ale je&amp;#x15B;li masz szcz&amp;#x119;&amp;#x15B;cie - mo&amp;#x17C;esz potrzebowa&amp;#x107; go jutro\nnie chce was zniechecic - raczej pokazac dlaczego jest to trudne\n
  • #3: dzi&amp;#x119;kuj&amp;#x119; za zaproszenie, 100% ruby, okolice Javy, Freeport Metrics, pozosta&amp;#x142;e 100% obj-c\njestem praktykiem, nie teoretykiem - nie jestem z wykszta&amp;#x142;cenia informatykiem w prezentacji b&amp;#x119;dzie du&amp;#x17C;o skr&amp;#xF3;t&amp;#xF3;w, uproszcze&amp;#x144; i za&amp;#x142;o&amp;#x17C;e&amp;#x144; a priori - bo to zbyt szeroki temat na nieca&amp;#x142;e p&amp;#xF3;&amp;#x142; godziny, a ja nie jestem a&amp;#x17C; tak m&amp;#x105;dry ;-)\n
  • #4: \n
  • #5: redis to nosql\nplotki o &amp;#x15B;mierci SQL-a s&amp;#x105; mocno przesadzone\nbo i skala problem&amp;#xF3;w wymagaj&amp;#x105;cych nosqla jest ograniczone\n
  • #6: bo mo&amp;#x17C;e dzia&amp;#x142;a&amp;#x107; jak klucz warto&amp;#x15B;&amp;#x107;, optymalizuje warto&amp;#x15B;ci, jest szybki i milusi\n\n
  • #7: bo warto&amp;#x15B;ci&amp;#x105; mo&amp;#x17C;e by&amp;#x107; tak&amp;#x17C;e jedna ze struktur, kt&amp;#xF3;re istniej&amp;#x105; w Redisie\nnie tylko proste &amp;#x142;a&amp;#x144;cuchy tekstowe\n
  • #8: \n
  • #9: \n
  • #10: to nie b&amp;#x119;dzie &amp;#x142;atwa prezentacja - redis, mimo, &amp;#x17C;e to jeden system to ze wzgl&amp;#x119;de na liczne ga&amp;#x142;&amp;#x119;zie i eksperymentalne funkcje\nwymaga czasu na jego poznanie i dostosowanie\nten ekran jest ju&amp;#x17C; dawno nieaktualny - prezentacj&amp;#x119; zacz&amp;#x105;&amp;#x142;em przygotowywa&amp;#x107; miesi&amp;#x105;c temu\n
  • #11: A system rozwija si&amp;#x119; ci&amp;#x105;gle. to jest wiadomo&amp;#x15B;&amp;#x107; z wczorajszego poranka\nwarto &amp;#x15B;ledzi&amp;#x107; jego rozw&amp;#xF3;j\n
  • #12: \n
  • #13: \n
  • #14: \n
  • #15: w redisie mo&amp;#x17C;emy te&amp;#x17C; trzyma&amp;#x107; (jako stringi) integery. i wykonywa&amp;#x107; na nich operacje\n
  • #16: mo&amp;#x17C;na te&amp;#x17C; modyfikowa&amp;#x107; warto&amp;#x15B;ci &amp;#x142;a&amp;#x144;cuch&amp;#xF3;w tekstowych\n
  • #17: sorted by insertion order\nlisty z blokowaniem warto&amp;#x15B;ci, rpoplpush\nbodaj najpopularniejsze zastosowanie redisa w sferze us&amp;#x142;ug - kolejki wiadomo&amp;#x15B;ci\n
  • #18: \n
  • #19: \n
  • #20: zbi&amp;#xF3;r, mo&amp;#x17C;liwe ciekawe operacje UNION, INTERSECTION\n
  • #21: mo&amp;#x17C;na mie&amp;#x107; zastrze&amp;#x17C;enia co do wydajno&amp;#x15B;ci\n
  • #22: \n
  • #23: sortowane zbiory\nrzecz, kt&amp;#xF3;ra wykorzystali&amp;#x15B;my w Blipie\n
  • #24: \n
  • #25: \n
  • #26: \n
  • #27: protok&amp;#xF3;&amp;#x142; Redisa zwraca podstawowe warto&amp;#x15B;ci\nzak&amp;#x142;ada obs&amp;#x142;ug&amp;#x119; tego po stronie klienta\n
  • #28: \n
  • #29: \n
  • #30: \n
  • #31: \n
  • #32: \n
  • #33: \n
  • #34: \n
  • #35: \n
  • #36: snapshot - tworzony jest fork, redis zapisuje stan swojej bazy do pliku binarnego\naof - zapisuje ka&amp;#x17C;d&amp;#x105; komend&amp;#x119; do pliku - 100% pewno&amp;#x15B;ci odzyskania danych, bardzo d&amp;#x142;ugi proces &amp;#x142;adowania\naof - mo&amp;#x17C;liwy jest rewrite\n
  • #37: dla snapshotu\nna &amp;#x17C;&amp;#x105;danie - komendy SAVE lub BGSAVE\nokresowa - je&amp;#x15B;li w okre&amp;#x15B;lonym przedziale czasu dosz&amp;#x142;o do zmian w X kluczy\n
  • #38: po co replikacja? - zabezpieczenie przed padem\nskalowanie ci&amp;#x119;&amp;#x17C;kich operacji - SORT\nreplikacja nie blokuje mastera - replikacja blokuje slave&amp;#x2019;a\n
  • #39: master mo&amp;#x17C;e mie&amp;#x107; wiele slave&amp;#x2019;&amp;#xF3;w\nslave mo&amp;#x17C;e by&amp;#x107; masterem dla kolejnego zestawu slave&amp;#x2019;&amp;#xF3;w\nprzyk&amp;#x142;adowo - mamy zestaw master / slave-slave / slave-slave - zapisujemy dane tylko na ostatnim etapie\n
  • #40: \n
  • #41: bez pipeliningu - czekamy na odpowied&amp;#x17A; na ka&amp;#x17C;de &amp;#x17C;&amp;#x105;danie\nwk&amp;#x142;adamy dane - odpowied&amp;#x17A;, wk&amp;#x142;adamy - odpowied&amp;#x17A;\n
  • #42: ale pr&amp;#x119;dzej czy p&amp;#xF3;&amp;#x17A;niej to mo&amp;#x17C;e by&amp;#x107; za ma&amp;#x142;o - wydajno&amp;#x15B;&amp;#x107; b&amp;#x119;dzie spada&amp;#x107;\n
  • #43: bez pipeliningu - czekamy na odpowied&amp;#x17A; na ka&amp;#x17C;de &amp;#x17C;&amp;#x105;danie\nwk&amp;#x142;adamy dane - odpowied&amp;#x17A;, wk&amp;#x142;adamy - odpowied&amp;#x17A;\n
  • #44: \n
  • #45: minimalne wymaganie redisa - wszystkie klucze zawsze musz&amp;#x105; by&amp;#x107; w pami&amp;#x119;ci\nale ca&amp;#x142;&amp;#x105; reszt&amp;#x119; mo&amp;#x17C;na trzyma&amp;#x107; w pami&amp;#x119;ci wirtualnej\nwarto si&amp;#x119; zastanowi&amp;#x107; czy lepiej nie skorzysta&amp;#x107; z hashy\nale je&amp;#x15B;&amp;#x142;i nie zale&amp;#x17C;y nam na wydajno&amp;#x15B;ci - mo&amp;#x17C;na ustawi&amp;#x107; zerow&amp;#x105; pami&amp;#x119;&amp;#x107; dla warto&amp;#x15B;ci\n
  • #46: \n
  • #47: \n
  • #48: poszczeg&amp;#xF3;lny w&amp;#x119;z&amp;#x142;y w klastrze rozmawiaj&amp;#x105; ze sob&amp;#x105; protoko&amp;#x142;em binarnym\nnormalnie redis korzysta z protoko&amp;#x142;u tekstowego - tutaj zosta&amp;#x142;o to zoptymalizowane\n
  • #49: klaster redisa jest dzielony na 4096 slot&amp;#xF3;w na hashe\nw momencie tworzenia klastra nale&amp;#x17C;y sloty do poszczeg&amp;#xF3;lnych instancji\n
  • #50: tutaj dla u&amp;#x142;atwienia - podzielimy sobie na 6 slot&amp;#xF3;w, kt&amp;#xF3;re zostan&amp;#x105; roz&amp;#x142;o&amp;#x17C;one na 3 w&amp;#x119;z&amp;#x142;ach\n
  • #51: klastrowanie - dummy client\n
  • #52: klastrowanie - sprytny klient\n
  • #53: automatyczne zarz&amp;#x105;dzanie klastrem\nnarz&amp;#x119;dzie pomagaj&amp;#x105;ce w tworzeniu klastra\nsprawdzenie zgodno&amp;#x15B;ci klastra\ndodawanie nowych element&amp;#xF3;w do klastra\n
  • #54: jak si&amp;#x119; to ma do memcached?\nzale&amp;#x17C;y od zastosowania.\n
  • #55: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #56: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #57: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #58: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #59: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #60: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #61: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #62: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #63: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #64: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #65: \n
  • #66: ka&amp;#x17C;dy z test&amp;#xF3;w to 100000 operacji\n
  • #67: \n
  • #68: Resque is a Redis-backed Ruby library for creating background jobs, placing those jobs on multiple queues, and processing them later.\nJedno z pierwszych narz&amp;#x119;dzie powsta&amp;#x142;ych dzi&amp;#x119;ki Redisowi.\nU&amp;#x17C;ywane w GitHubie\n
  • #69: \n
  • #70: \n
  • #71: \n
  • #72: \n
  • #73: \n
  • #74: \n
  • #75: \n
  • #76: bill gates twierdzi, &amp;#x17C;e powiedzia&amp;#x142; wiele g&amp;#x142;upich rzeczy\nale tego nie,\nfragmentacja kt&amp;#xF3;ra jest rozwi&amp;#x105;zywana za pomoc&amp;#x105; r&amp;#xF3;&amp;#x17C;nych malloc&amp;#xF3;w\n
  • #77: redis bardzo dobrze optymalizuje liczby - nie trzyma ich w pami&amp;#x119;ci jako stringi\n
  • #78: w zale&amp;#x17C;no&amp;#x15B;ci od potrzeb - lepiej skompilowa&amp;#x107; Redisa w 32bitowej architekturze\n
  • #79: monitoruj, naucz si&amp;#x119;\nto nowa zabawka, zwykle dzia&amp;#x142;a - problemem nie jest stabilno&amp;#x15B;&amp;#x107;, bo ta jest wy&amp;#x15B;mienita.\n
  • #80: \n
  • #81: skrypty lua\n
  • #82: funkcjonalno&amp;#x15B;&amp;#x107; eksperymentalna\n
  • #83: j&amp;#x119;zyk skryptowy pierwotnie zaprojektowany dla rozszerzenia funkcjonalno&amp;#x15B;ci r&amp;#xF3;&amp;#x17C;nych aplikacji, jednak cz&amp;#x119;sto u&amp;#x17C;ywany jako samodzielny j&amp;#x119;zyk.\n
  • #84: \n
  • #85: \n
  • #86: \n
  • #87: \n
  • #88: \n