2014-12-03 4 views
3

Я знаю, что это очень общий вопрос. Но я хотел бы понять, каково главное архитектурное решение, которое позволяет Redis (или кэши, такие как MemCached, Cassandra) работать с удивительными пределами производительности.Как Redis достигает высокой производительности и производительности?

  1. Как поддерживаются соединения?
  2. Являются ли соединения TCP или HTTP?
  3. Я знаю, что он полностью написан на C. Как память управляется?
  4. Каковы методы синхронизации, используемые для достижения высокой пропускной способности: конкурирующих операций чтения/записи?

В принципе, в чем разница между простой ванильной реализацией машины с кешем памяти и сервером, который может реагировать на команды и поле Redis? Я также понимаю, что ответ должен быть очень большим и должен содержать очень сложные детали для завершения. Но я ищу некоторые общие методы, а не все нюансы.

+1

Small nit, Cassandra не является кешем, это база данных. – RussS

ответ

6

В документации Redis имеется большое количество информации, чтобы понять, как это работает. Теперь, чтобы ответить на ваши вопросы:

1) Как поддерживаются соединения?

Соединения поддерживаются и управляются с использованием цикла событий ae (разработан автором Redis). Все операции сетевого ввода-вывода не блокируются. Вы можете видеть ae как минималистичную реализацию, используя лучший механизм демультиплексирования ввода-вывода платформы (epoll для Linux, kqueue для BSD и т. Д.), Как libevent, libev, libuv и т. Д.

2) Являются ли соединения TCP или HTTP?

Соединения представляют собой TCP, используя протокол Redis, который является простым telnet-совместимым текстовым ориентиром protocol, поддерживающим двоичные данные. Этот протокол обычно более эффективен, чем HTTP.

3) Как управляется память?

Управление памятью осуществляется с помощью распределителя памяти общего назначения. На некоторых платформах это на самом деле системный распределитель памяти. На некоторых других платформах (включая Linux) jemalloc был выбран, так как он обеспечивает хороший баланс между потреблением ЦП, поддержкой параллелизма, фрагментацией и объемом памяти. Исходный код jemalloc является частью дистрибутива Redis.

В отличие от других продуктов (таких как memcached), в Redis нет реализации распределителя slab.

Ряд optimized data structures был реализован поверх распределителя общего назначения для уменьшения объема памяти.

4) Каковы методы синхронизации, используемые для достижения высокой пропускной способности во время конкурирующих операций чтения/записи?

Redis - это однопоточный цикл событий, поэтому синхронизация не требуется, поскольку все команды сериализованы. Теперь некоторые потоки также выполняются в фоновом режиме для внутренних целей. В редких случаях они получают доступ к данным, управляемым основным потоком, используются классические примитивы синхронизации pthread (например, мьютексы).Но 100% доступа к данным, сделанных от имени нескольких клиентских подключений, не требуют синхронизации.

Вы можете найти более подробную информацию там: Redis is single-threaded, then how does it do concurrent I/O?

Какая разница между простой реализацией ванильным из машины с в кэш-памяти, а также сервер, который может реагировать на команды и поле Redis?

Нет никакой разницы. Redis - это простая ванильная реализация машины с кешем памяти и сервером, который может реагировать на команды. Но реализация которого сделано правильно:

  • с использованием единой модели цикла резьбовых событий
  • , используя простые и минималистичные структуры данных, оптимизированные для их соответствующих случаев использования
  • предлагает набор команд тщательно отобранных, чтобы сбалансировать минимализм и полезность
  • постоянно нацеливание лучшее сырье производительности
  • хорошо адаптированы к современным механизмам OS
  • , обеспечивающих различные механизмы сохраняемости becau «подход« один размер подходит всем »- это всего лишь сон.
  • обеспечивая строительные блоки для механизмов HA (система репликации, например)
  • избегая укладки до бесполезных уровней абстракции как блины
  • в результате чистой и понятной база коды, что любой хороший разработчик С может быть комфортно с