Обзор Redis storage / Symfony Camp UA 2011
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Обзор Redis storage / Symfony Camp UA 2011

on

  • 3,974 views

Symfony Camp UA 2011: Обзор Redis storage

Symfony Camp UA 2011: Обзор Redis storage

Statistics

Views

Total Views
3,974
Views on SlideShare
3,229
Embed Views
745

Actions

Likes
6
Downloads
29
Comments
0

17 Embeds 745

http://tigor.com.ua 580
http://feeds.feedburner.com 72
http://feeds2.feedburner.com 41
http://xss.yandex.net 11
http://xss. 8
http://xs 6
http://www.linkedin.com 6
http://www.sfexception.com 4
http://x 3
http://xss 3
http://www.netvibes.com 3
http:// 2
http://a0.twimg.com 2
http://xss.yande 1
http://dashboard.bloglines.com 1
http://theoldreader.com 1
https://drive.jolicloud.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Обзор Redis storage / Symfony Camp UA 2011 Presentation Transcript

  • 1. Обзор Redis storageIgor BrovchenkoSymfony Camp UA 2011
  • 2. План• Что такое Redis• Возможности• Типы данных• Кейсы• Документация• Вопросы
  • 3. REmote DIctionary Server
  • 4. like memcached on steroids
  • 5. История• Автор Salvatore Sanfilippo, @antirez, http://antirez.com/• Зарелизен в марте 2009• BSD лицензия• Спонсируется компанией VMWare• В марте 2010 VMWare наняла Salvatore• Позже наняли Pieter Noordhuis (key contributor)
  • 6. Redis• Быстрый, простой, легкий key-value storage в памяти• Разные структуры данных (String, Hash, List, Sets, ZSet)• Expire для данных• Персистентность через асинхронные snapshots или AOF• Master-slave репликация• Атомарные операции и транзакционность• Поддержка нескольких DB• Pub/Sub
  • 7. Redis• Написан на ANSI C и работает во многих POSIX системах• Существует порт для Windows ( https://github.com/dmajkic/redis )• Очень легко установить и настроить• Использует память как основной storage• Диск используется для персистентности• Single thread (один поток)
  • 8. Версия
  • 9. Кто использует Redis• и многие другие компании - http://redis.io/topics/whos-using-redis
  • 10. Клиенты http://redis.io/clients• redis-cli, telnet• php• c, c#• ruby, python, perl• java, scala• Erlang, Go, Haskell, Lua, Node.js• и многие другие на странице http://redis.io/clients
  • 11. Клиенты для PHP • Predis (https://github.com/nrk/predis) • phpredis (https://github.com/nicolasff/phpredis) • RedisServer (https://github.com/jamm/Memory/blob/master/) • Redisent (https://github.com/jdp/redisent) • Rediska (https://github.com/Shumkov/Rediska)• Symfony 1.x • sfRediskaPlugin (https://github.com/mastermix/sfRediskaPlugin) • sfRedisPlugin (http://www.symfony-project.org/plugins/sfRedisPlugin)• Symfony 2 • SncRedisBundle (https://github.com/snc/SncRedisBundle) • RedisBundle (https://github.com/Seldaek/RedisBundle)
  • 12. Demo http://try.redis-db.com/• https://github.com/alexmchale/try.redis
  • 13. Performance http://redis.io/topics/benchmarks• Высокая производительность• ~50K read/write операций в секунду• 100K+ read/write операций в секунду на регулярном EC2 instance• Xeon L5420 clocked at 2.5 GHz 64 bit: ~$ ./redis-benchmark -q -n 100000 PING: 111731.84 requests per second SET: 108114.59 requests per second GET: 98717.67 requests per second INCR: 95241.91 requests per second LPUSH: 104712.05 requests per second LPOP: 93722.59 requests per second
  • 14. Persistence - Snapshotting• # redis.conf save 60 1000• Как это работает: fork, temporary new RDB file, replace the old file• Надежность• SAVE /opt/local/var/db/redis/dump.rdb• BGSAVE /opt/local/var/db/redis/dump.rdb
  • 15. Persistence - AOF• Append-only file• # redis.conf appendonly yes• Как это работает: при каждом изменении данных, все команды записываются в AOF-файл. При перезагрузке Redis - все команды перевыполняются до текущего состояния• AOF файл становится большим• BGREWRITEAOF - оптимизация AOF
  • 16. Virtual Memory http://redis.io/topics/virtual-memory• # redis.conf vm-enabled yes• Позволяет работать данными, которые не помещаются в память• Прежде чем использовать VM задайте себе вопрос: «Мне действительно нужен VM?»• Redis - это storage для размещения данных в памяти!• VM позволяет хранить keys в памяти, а values читать из диска
  • 17. Virtual Memory• IMPORTANT NOTE: Redis VM is now deprecated. Redis 2.4 will be the latest Redis version featuring Virtual Memory (but it also warns you that Virtual Memory usage is discouraged). We found that using VM has several disadvantages and problems. In the future of Redis we want to simply provide the best in-memory database (but persistent on disk as usually) ever, without considering at least for now the support for databases bigger than RAM. Our future efforts are focused into providing scripting, cluster, and better persistence. http://redis.io/topics/virtual-memory
  • 18. Redis Cluster http://redis.io/topics/cluster-spec• The Redis core team is already hacking on Redis Cluster. We already have have some kind of experimental version in the unstable branch, while a Release Candidate or at least a fully working beta is expected for the end of 2011• Идея • распределенность и отказоустойчивость c функционалом stand alone сервера • Node может выступить как master так и slave• Презентация http://bit.ly/rcluster• Branch 2.4 - https://github.com/antirez/redis
  • 19. Replication http://redis.io/topics/replication• Master-Slaves• Slaves-Slave (структура в виде графа)• Репликация является неблокирующей для мастера• Репликацию можно использовать для масштабируемости: выполнение тяжелых операций с SORT или для резервирования данных• # redis.conf slaveof 192.168.1.1 6379• Команда SYNC
  • 20. Sharding• Распределение данных по нескольким серверам• Временное решение, пока не реализован Redis Cluster • Мультиплексный прокси-сервер. Горизонтальное масштабирование • https://github.com/kni/redis-sharding (Perl) - проект закрыт • http://github.com/kni/redis-sharding-hs (Haskell) => 4x
  • 21. Databases• Поддержка нескольких DB• Настраивается в redis.conf• 0-15• По умолчанию DB 0• SELECT index
  • 22. redis 127.0.0.1:6379> SELECT 1OKredis 127.0.0.1:6379[1]> SET mykey "Hello"OKredis 127.0.0.1:6379[1]> GET mykey"Hello"redis 127.0.0.1:6379[1]> SELECT 0OKredis 127.0.0.1:6379> GET mykey(nil)redis 127.0.0.1:6379[1]> SELECT 10OKredis 127.0.0.1:6379[10]>
  • 23. Key-Value Storage
  • 24. Транзакции http://redis.io/topics/transactions• Все команды сериализируются и выполняются последовательно• Должны выполниться все команды, либо ни одной• Команды: MULTI EXEC DISCARD WATCH
  • 25. Keys• Не бинарно безопасны• Не должны содержать пробельные символы и rn• Рекомендации • Не использовать слишком длинные keys Не использовать слишком короткие keys • Как вариант использовать формат keys «object:id:field». Например: «user:100:name» «user:100:email»
  • 26. Действия над Keys
  • 27. Типы данных
  • 28. Strings http://redis.io/commands#string• Binary Safe• Максимум 512 Mb• Основные команды: SET GET APPEND SETEX SETNX STRLEN
  • 29. Strings - Use Cases• Кеширование • Инвалидация по признаку (Strings + Sets + DEL)• Сессии
  • 30. Integers http://redis.io/commands#string• Атомарные счетчики• Тип данных Strings• Команды: INCR INCRBY DECR DECRBY
  • 31. Integers - Use Cases• Счетчики• Генерация уникального ID
  • 32. Hashes http://redis.io/commands#hash• Напоминает ассоциативный массив в PHP• Один Hash key и несколько fields• User => [username => ‘antirez’, password => ‘P1pp0’, age => 34]• Каждый Hash может хранить 2^32-1 пар field-value• Основные команды: HSET HGET HGETALL HDEL HVALS HKEYS HLEN
  • 33. Hashes - Use Cases• Структурные данные (Posts, Users)• Настройки приложения/пользователя
  • 34. redis 127.0.0.1:6379> HSET user:1000 username james(integer) 1redis 127.0.0.1:6379> HSET user:1000 password bond(integer) 1redis 127.0.0.1:6379> HSET user:1000 age 34(integer) 1redis 127.0.0.1:6379> HGETALL user:10001) "username"2) "james"3) "password"4) "bond"5) "age"6) "34"redis 127.0.0.1:6379> HINCRBY user:1000 age 1(integer) 35redis 127.0.0.1:6379> HVALS user:10001) "james"2) "bond"3) "35"
  • 35. Sets http://redis.io/commands#set• Неупорядоченный набор строк• tags => [tag5, tag3, tag7,]• В Set хранится только одна уникальная копия элемента / Набор уникальных элементов• Максимальное количество элементов в Set 2^32-1• Основные команды: SADD SMEMBERS SISMEMBER SREM
  • 36. Sets - Use Cases• Подсчет уникальных просмотров поста (IP)• Списки AD объявлений• Tags, категории• Relations (Friends/followers)• Кто в онлайне
  • 37. redis 127.0.0.1:6379> SADD news:100:tags tag5(integer) 1redis 127.0.0.1:6379> SADD news:100:tags tag3(integer) 1redis 127.0.0.1:6379> SADD news:100:tags tag7(integer) 1redis 127.0.0.1:6379> SMEMBERS news:100:tags1) "tag7"2) "tag3"3) "tag5"redis 127.0.0.1:6379> SCARD news:100:tags(integer) 3redis 127.0.0.1:6379> SADD news:101:tags tag7(integer) 1redis 127.0.0.1:6379> SADD news:101:tags tag12(integer) 1redis 127.0.0.1:6379> SINTER news:100:tags news:101:tags1) "tag7"
  • 38. Lists http://redis.io/commands#list• Похожи на Sets, за исключением порядка добавление новых элементов• Подходят для создания очередей или стеков• Блокирование• Основные команды: [B]LPUSH [B]LPOP LLEN LINDEX LRANGE
  • 39. Lists - Use Cases• Хранение IDs• Timeline • Очереди или стеки (сообщения, последние комментарии) • Логи, статистика• Background Jobs / Queues https://github.com/seatgeek/djjob https://github.com/jamm/Tasks https://github.com/treffynnon/PHP-at-Job-Queue-Wrapper http://www.restmq.com https://github.com/defunkt/resque
  • 40. redis 127.0.0.1:6379> LPUSH mylist "world"(integer) 1redis 127.0.0.1:6379> LPUSH mylist "hello"(integer) 2redis 127.0.0.1:6379> LRANGE mylist 0 01) "hello"redis 127.0.0.1:6379> LRANGE mylist 0 -11) "hello"2) "world"
  • 41. Sorted Sets http://redis.io/commands#sorted_set• Похожи на Sets, но отсортированы по score значению• Быстрый доступ по score или диапазону score• Основные команды: ZADD ZRANGE ZRANGEBYSCORE ZREVRANGE
  • 42. Sorted Sets - Use Cases• Рейтинг игроков• Индексы для данных (например, age)• Индексы по возрастанию/убыванию score• Cчетчики (downloads, hits, votes)
  • 43. redis 127.0.0.1:6379> ZADD user:age 34 user1(integer) 1redis 127.0.0.1:6379> ZADD user:age 22 user2(integer) 1redis 127.0.0.1:6379> ZADD user:age 40 user3(integer) 1redis 127.0.0.1:6379> ZADD user:age 25 user4(integer) 1redis 127.0.0.1:6379> ZRANGE user:age 1 21) "user4"2) "user1"redis 127.0.0.1:6379> ZRANGEBYSCORE user:age (25 401) "user1"2) "user3"
  • 44. Pub/Sub
  • 45. Pub/Sub http://redis.io/topics/pubsub• В основе парадигма Publish/Subscribe • Сообщения публикуются в каналах, не зная ничего о подписчиках • Подписчики подписываются на каналы, не задумываясь про отправителей• Команды: [P]SUBSCRIBE PUBLISH [P]UNSUBSCRIBE
  • 46. Pub/Sub - Use Cases• Чат• Queues• Логгирование
  • 47. redis 127.0.0.1:6379> SUBSCRIBE room:chattyReading messages... (press Ctrl-C to quit)1) "subscribe"2) "room:chatty"3) (integer) 1redis 127.0.0.1:6379> PUBLISH room:chatty "Hello there!"(integer) 11) "message"2) "room:chatty"3) "Hello there!"redis 127.0.0.1:6379> UNSUBSCRIBE room:chatty1) "unsubscribe"2) "room:chatty"3) (integer) 0
  • 48. Документация
  • 49. Документация http://redis.io/commands
  • 50. Интерактивная документация
  • 51. Professional NoSQL• Shashank Tiwari• http://bit.ly/s7wsrl
  • 52. Redis: The Definitive Guide• Salvatore Sanfilippo, Pieter Noordhuis• Released: April 2012• http://bit.ly/tU6fOD
  • 53. NoSQL Handbook• Mathias Meyer• Released: ????• A handy and outright awesome ebook guide to the world of NoSQL databases. Includes heaps of practical material on how to use NoSQL databases like Redis, MongoDB, CouchDB, Riak and Cassandra.• http://nosqlhandbook.com/• @nosqlhandbook
  • 54. CookBooks• The Redis cookbook http://rediscookbook.org/• Redis tutorial http://simonwillison.net/static/2010/redis-tutorial/• Redis: under the hood http://pauladamsmith.com/articles/redis-under-the-hood.html• Redis Use Cases http://highscalability.com/blog/2010/12/6/what-the-heck-are-you-actually- using-nosql-for.html
  • 55. Документация на русском• http://pyha.ru/wiki/index.php?title=Redis
  • 56. Ложка дегтя• Redis это дополнительное решение. Оно не заменит SQL. Хотя аналог Twitter на нем написан• Redis-сервер - single-threaded. Но можно запустить один Redis-сервер на одно свободное ядро• Redis Cluster еще не готов• Redis нужно столько памяти - сколько у Вас данных• Если много данных, то snapshot будет сохранятся на диск долго. Используете AOF!• Не стоит использовать команду «KEYS pattern» на продакшене, она предназначена для отладки. Читайте доки!
  • 57. Вопросы?• Igor Brovchenko• @tigordev• Igor.Brovchenko@gmail.com• http://ua.linkedin.com/in/IgorBrovchenko• http://tigor.com.ua