Обзор redis storage / symfony camp ua 2011

60
Обзор Redis storage Igor Brovchenko Symfony Camp UA 2011

Upload: igor-brovchenko

Post on 16-Jun-2015

3.631 views

Category:

Technology


0 download

DESCRIPTION

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

TRANSCRIPT

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

Обзор Redis storage

Igor BrovchenkoSymfony Camp UA 2011

Page 2: Обзор Redis storage / Symfony Camp UA 2011
Page 3: Обзор Redis storage / Symfony Camp UA 2011

План

• Что такое Redis

• Возможности

• Типы данных

• Кейсы

• Документация

• Вопросы

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

REmote DIctionary Server

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

like memcached on steroids

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

История

• Автор Salvatore Sanfilippo, @antirez, http://antirez.com/

• Зарелизен в марте 2009

• BSD лицензия

• Спонсируется компанией VMWare

• В марте 2010 VMWare наняла Salvatore

• Позже наняли Pieter Noordhuis (key contributor)

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

Redis

• Быстрый, простой, легкий key-value storage в памяти

• Разные структуры данных (String, Hash, List, Sets, ZSet)

• Expire для данных

• Персистентность через асинхронные snapshots или AOF

• Master-slave репликация

• Атомарные операции и транзакционность

• Поддержка нескольких DB

• Pub/Sub

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

Redis

• Написан на ANSI C и работает во многих POSIX системах

• Существует порт для Windows ( https://github.com/dmajkic/redis )

• Очень легко установить и настроить

• Использует память как основной storage

• Диск используется для персистентности

• Single thread (один поток)

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

Версия

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

Кто использует Redis

• и многие другие компании - http://redis.io/topics/whos-using-redis

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

Клиенты 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

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

Клиенты для 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)

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

Demo http://try.redis-db.com/

https://github.com/alexmchale/try.redis

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

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 100000PING: 111731.84 requests per secondSET: 108114.59 requests per secondGET: 98717.67 requests per secondINCR: 95241.91 requests per secondLPUSH: 104712.05 requests per secondLPOP: 93722.59 requests per second

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

Persistence - Snapshotting

• # redis.confsave 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

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

Persistence - AOF

• Append-only file

• # redis.confappendonly yes

• Как это работает: при каждом изменении данных, все команды записываются в AOF-файл. При перезагрузке Redis - все команды перевыполняются до текущего состояния

• AOF файл становится большим

• BGREWRITEAOF - оптимизация AOF

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

Virtual Memory http://redis.io/topics/virtual-memory

• # redis.confvm-enabled yes

• Позволяет работать данными, которые не помещаются в память

• Прежде чем использовать VM задайте себе вопрос: «Мне действительно нужен VM?»

• Redis - это storage для размещения данных в памяти!

• VM позволяет хранить keys в памяти, а values читать из диска

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

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

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

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

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

Replication http://redis.io/topics/replication

• Master-Slaves

• Slaves-Slave (структура в виде графа)

• Репликация является неблокирующей для мастера

• Репликацию можно использовать для масштабируемости: выполнение тяжелых операций с SORT или для резервирования данных

• # redis.confslaveof 192.168.1.1 6379

• Команда SYNC

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

Sharding

• Распределение данных по нескольким серверам

• Временное решение, пока не реализован Redis Cluster

• Мультиплексный прокси-сервер. Горизонтальное масштабирование

• https://github.com/kni/redis-sharding (Perl) - проект закрыт

• http://github.com/kni/redis-sharding-hs (Haskell) => 4x

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

Databases

• Поддержка нескольких DB

• Настраивается в redis.conf

• 0-15

• По умолчанию DB 0

• SELECT index

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

redis 127.0.0.1:6379> SELECT 1OK

redis 127.0.0.1:6379[1]> SET mykey "Hello"OK

redis 127.0.0.1:6379[1]> GET mykey"Hello"

redis 127.0.0.1:6379[1]> SELECT 0OK

redis 127.0.0.1:6379> GET mykey(nil)

redis 127.0.0.1:6379[1]> SELECT 10OK

redis 127.0.0.1:6379[10]>

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

Key-Value Storage

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

Транзакции http://redis.io/topics/transactions

• Все команды сериализируются и выполняются последовательно

• Должны выполниться все команды, либо ни одной

• Команды:

MULTI EXEC DISCARD WATCH

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

Keys

• Не бинарно безопасны

• Не должны содержать пробельные символы и \r\n

• Рекомендации

• Не использовать слишком длинные keysНе использовать слишком короткие keys

• Как вариант использовать формат keys «object:id:field».Например: «user:100:name» «user:100:email»

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

Действия над Keys

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

Типы данных

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

Strings http://redis.io/commands#string

• Binary Safe

• Максимум 512 Mb

• Основные команды:

SETGETAPPENDSETEXSETNXSTRLEN

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

Strings - Use Cases

• Кеширование

• Инвалидация по признаку (Strings + Sets + DEL)

• Сессии

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

Integers http://redis.io/commands#string

• Атомарные счетчики

• Тип данных Strings

• Команды:

INCRINCRBYDECRDECRBY

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

Integers - Use Cases

• Счетчики

• Генерация уникального ID

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

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

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

Hashes - Use Cases

• Структурные данные (Posts, Users)

• Настройки приложения/пользователя

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

redis 127.0.0.1:6379> HSET user:1000 username james(integer) 1

redis 127.0.0.1:6379> HSET user:1000 password bond(integer) 1

redis 127.0.0.1:6379> HSET user:1000 age 34(integer) 1

redis 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) 35

redis 127.0.0.1:6379> HVALS user:10001) "james"2) "bond"3) "35"

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

Sets http://redis.io/commands#set

• Неупорядоченный набор строк

• tags => [tag5, tag3, tag7,]

• В Set хранится только одна уникальная копия элемента / Набор уникальных элементов

• Максимальное количество элементов в Set 2^32-1

• Основные команды:

SADD SMEMBERS SISMEMBER SREM

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

Sets - Use Cases

• Подсчет уникальных просмотров поста (IP)

• Списки AD объявлений

• Tags, категории

• Relations (Friends/followers)

• Кто в онлайне

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

redis 127.0.0.1:6379> SADD news:100:tags tag5(integer) 1

redis 127.0.0.1:6379> SADD news:100:tags tag3(integer) 1

redis 127.0.0.1:6379> SADD news:100:tags tag7(integer) 1

redis 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) 3

redis 127.0.0.1:6379> SADD news:101:tags tag7(integer) 1

redis 127.0.0.1:6379> SADD news:101:tags tag12(integer) 1

redis 127.0.0.1:6379> SINTER news:100:tags news:101:tags1) "tag7"

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

Lists http://redis.io/commands#list

• Похожи на Sets, за исключением порядка добавление новых элементов

• Подходят для создания очередей или стеков

• Блокирование

• Основные команды:

[B]LPUSH [B]LPOP LLEN LINDEX LRANGE

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

Lists - Use Cases

• Хранение IDs

• Timeline

• Очереди или стеки (сообщения, последние комментарии)

• Логи, статистика

• Background Jobs / Queues

https://github.com/seatgeek/djjobhttps://github.com/jamm/Taskshttps://github.com/treffynnon/PHP-at-Job-Queue-Wrapperhttp://www.restmq.comhttps://github.com/defunkt/resque

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

redis 127.0.0.1:6379> LPUSH mylist "world"(integer) 1

redis 127.0.0.1:6379> LPUSH mylist "hello"(integer) 2

redis 127.0.0.1:6379> LRANGE mylist 0 01) "hello"

redis 127.0.0.1:6379> LRANGE mylist 0 -11) "hello"2) "world"

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

Sorted Sets http://redis.io/commands#sorted_set

• Похожи на Sets, но отсортированы по score значению

• Быстрый доступ по score или диапазону score

• Основные команды:

ZADD ZRANGE ZRANGEBYSCORE ZREVRANGE

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

Sorted Sets - Use Cases

• Рейтинг игроков

• Индексы для данных (например, age)

• Индексы по возрастанию/убыванию score

• Cчетчики (downloads, hits, votes)

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

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) 1

redis 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"

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

Pub/Sub

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

Pub/Sub http://redis.io/topics/pubsub

• В основе парадигма Publish/Subscribe

• Сообщения публикуются в каналах, не зная ничего о подписчиках

• Подписчики подписываются на каналы, не задумываясь про отправителей

• Команды:

[P]SUBSCRIBE PUBLISH [P]UNSUBSCRIBE

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

Pub/Sub - Use Cases

• Чат

• Queues

• Логгирование

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

redis 127.0.0.1:6379> SUBSCRIBE room:chattyReading messages... (press Ctrl-C to quit)1) "subscribe"2) "room:chatty"3) (integer) 1

redis 127.0.0.1:6379> PUBLISH room:chatty "Hello there!"(integer) 1

1) "message"2) "room:chatty"3) "Hello there!"

redis 127.0.0.1:6379> UNSUBSCRIBE room:chatty1) "unsubscribe"2) "room:chatty"3) (integer) 0

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

Документация

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

Документация http://redis.io/commands

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

Интерактивная документация

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

Professional NoSQL

• Shashank Tiwari

• http://bit.ly/s7wsrl

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

Redis: The Definitive Guide

• Salvatore Sanfilippo, Pieter Noordhuis

• Released: April 2012

• http://bit.ly/tU6fOD

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

NoSQL Handbook

• Mathias Meyer

• Released: ????

• A handy and outright awesome ebook guideto the world of NoSQL databases. Includesheaps of practical material on how to use NoSQL databases like Redis, MongoDB,CouchDB, Riak and Cassandra.

• http://nosqlhandbook.com/

• @nosqlhandbook

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

Документация на русском

• http://pyha.ru/wiki/index.php?title=Redis

Page 57: Обзор Redis storage / Symfony Camp UA 2011
Page 58: Обзор Redis storage / Symfony Camp UA 2011
Page 59: Обзор Redis storage / Symfony Camp UA 2011

Ложка дегтя

• Redis это дополнительное решение. Оно не заменит SQL. Хотя аналог Twitter на нем написан

• Redis-сервер - single-threaded. Но можно запустить один Redis-сервер на одно свободное ядро

• Redis Cluster еще не готов

• Redis нужно столько памяти - сколько у Вас данных

• Если много данных, то snapshot будет сохранятся на диск долго. Используете AOF!

• Не стоит использовать команду «KEYS pattern» на продакшене, она предназначена для отладки. Читайте доки!

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

Вопросы?

• Igor Brovchenko

• @tigordev

[email protected]

• http://ua.linkedin.com/in/IgorBrovchenko

• http://tigor.com.ua