6. История
• Автор Salvatore Sanfilippo, @antirez, http://antirez.com/
• Зарелизен в марте 2009
• BSD лицензия
• Спонсируется компанией VMWare
• В марте 2010 VMWare наняла Salvatore
• Позже наняли Pieter Noordhuis (key contributor)
7. Redis
• Быстрый, простой, легкий key-value storage в памяти
• Разные структуры данных (String, Hash, List, Sets, ZSet)
• Expire для данных
• Персистентность через асинхронные snapshots или AOF
• Master-slave репликация
• Атомарные операции и транзакционность
• Поддержка нескольких DB
• Pub/Sub
8. Redis
• Написан на ANSI C и работает во многих POSIX системах
• Существует порт для Windows ( https://github.com/dmajkic/redis )
• Очень легко установить и настроить
• Использует память как основной storage
• Диск используется для персистентности
• Single thread (один поток)
14. 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
15. 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
16. Persistence - AOF
• Append-only file
• # redis.conf
appendonly yes
• Как это работает: при каждом изменении данных, все команды
записываются в AOF-файл. При перезагрузке Redis - все команды
перевыполняются до текущего состояния
• AOF файл становится большим
• BGREWRITEAOF - оптимизация AOF
17. Virtual Memory http://redis.io/topics/virtual-memory
• # redis.conf
vm-enabled yes
• Позволяет работать данными, которые не помещаются в память
• Прежде чем использовать VM задайте себе вопрос: «Мне действительно
нужен VM?»
• Redis - это storage для размещения данных в памяти!
• VM позволяет хранить keys в памяти, а values читать из диска
18. 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
19. 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
20. Replication http://redis.io/topics/replication
• Master-Slaves
• Slaves-Slave (структура в виде графа)
• Репликация является неблокирующей для мастера
• Репликацию можно использовать для масштабируемости: выполнение
тяжелых операций с SORT или для резервирования данных
• # redis.conf
slaveof 192.168.1.1 6379
• Команда SYNC
21. Sharding
• Распределение данных по нескольким серверам
• Временное решение, пока не реализован Redis Cluster
• Мультиплексный прокси-сервер. Горизонтальное масштабирование
• https://github.com/kni/redis-sharding (Perl) - проект закрыт
• http://github.com/kni/redis-sharding-hs (Haskell) => 4x
23. redis 127.0.0.1:6379> SELECT 1
OK
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 0
OK
redis 127.0.0.1:6379> GET mykey
(nil)
redis 127.0.0.1:6379[1]> SELECT 10
OK
redis 127.0.0.1:6379[10]>
26. Keys
• Не бинарно безопасны
• Не должны содержать пробельные символы и rn
• Рекомендации
• Не использовать слишком длинные keys
Не использовать слишком короткие keys
• Как вариант использовать формат keys «object:id:field».
Например:
«user:100:name»
«user:100:email»
29. Strings http://redis.io/commands#string
• Binary Safe
• Максимум 512 Mb
• Основные команды:
SET
GET
APPEND
SETEX
SETNX
STRLEN
30. Strings - Use Cases
• Кеширование
• Инвалидация по признаку (Strings + Sets + DEL)
• Сессии
31. Integers http://redis.io/commands#string
• Атомарные счетчики
• Тип данных Strings
• Команды:
INCR
INCRBY
DECR
DECRBY
32. Integers - Use Cases
• Счетчики
• Генерация уникального ID
33. 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
34. Hashes - Use Cases
• Структурные данные (Posts, Users)
• Настройки приложения/пользователя
36. Sets http://redis.io/commands#set
• Неупорядоченный набор строк
• tags => [tag5, tag3, tag7,]
• В Set хранится только одна уникальная копия элемента / Набор
уникальных элементов
• Максимальное количество элементов в Set 2^32-1
• Основные команды:
SADD SMEMBERS SISMEMBER SREM
37. Sets - Use Cases
• Подсчет уникальных просмотров поста (IP)
• Списки AD объявлений
• Tags, категории
• Relations (Friends/followers)
• Кто в онлайне
39. Lists http://redis.io/commands#list
• Похожи на Sets, за исключением порядка добавление новых элементов
• Подходят для создания очередей или стеков
• Блокирование
• Основные команды:
[B]LPUSH [B]LPOP LLEN LINDEX LRANGE
40. 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
42. Sorted Sets http://redis.io/commands#sorted_set
• Похожи на Sets, но отсортированы по score значению
• Быстрый доступ по score или диапазону score
• Основные команды:
ZADD ZRANGE ZRANGEBYSCORE ZREVRANGE
43. Sorted Sets - Use Cases
• Рейтинг игроков
• Индексы для данных (например, age)
• Индексы по возрастанию/убыванию score
• Cчетчики (downloads, hits, votes)
46. Pub/Sub http://redis.io/topics/pubsub
• В основе парадигма Publish/Subscribe
• Сообщения публикуются в каналах, не зная ничего о подписчиках
• Подписчики подписываются на каналы, не задумываясь про
отправителей
• Команды:
[P]SUBSCRIBE PUBLISH [P]UNSUBSCRIBE
53. Redis: The Definitive Guide
• Salvatore Sanfilippo, Pieter Noordhuis
• Released: April 2012
• http://bit.ly/tU6fOD
54. 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
55. 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
59. Ложка дегтя
• Redis это дополнительное решение. Оно не заменит SQL. Хотя аналог
Twitter на нем написан
• Redis-сервер - single-threaded. Но можно запустить один Redis-сервер
на одно свободное ядро
• Redis Cluster еще не готов
• Redis нужно столько памяти - сколько у Вас данных
• Если много данных, то snapshot будет сохранятся на диск долго.
Используете AOF!
• Не стоит использовать команду «KEYS pattern» на продакшене, она
предназначена для отладки. Читайте доки!