Умное кэширование в Rails

Preview:

Citation preview

Умное кэширование в Rails

?

«Premature optimizationis the root of all evil»

Donald Knuth

Два вида кэширования:

Вредное

Жизненно необходимое

Когда нужно кэшировать?

Если за время жизникэш будет прочтен

более 1 раза

Если работа с кэшем экономит

ресурсы сервера

Что кэшировать?

«Горячие» данные

Результаты сложныхили долгих операций

Части ответа сервера

Ответ сервера целиком

Где хранить кэш?

Память приложения

● «Горячие» данные● Результаты операций

Memcached

● «Горячие» данные● Результаты операций● Фрагменты ответа

База данных :)

● «Горячие» данные● Результаты операций

Redis

● «Горячие» данные● Результаты операций

Файловая система

● Результаты операций● Фрагменты ответа● Ответ целиком

Кэширующий proxy-сервер

● Фрагменты ответа● Ответ целиком

Например...

«Горячие» данные

Muuviz

Ответы пользователей

Статистика

Вопросы пользователям

~ 10.000 записей

SQL — 300msRedis — 20ms

Переменная — 0ms

~ 10.000 записей

SQL — 300msRedis — 20ms

Переменная — 0ms

Результаты операций

Railorz RPG Engine

Character Inventory Item

Item Attack DefenceSword 3Bow 2Shield 1Armor 3

5 4

На каждого игрока:

В среднем — 10 предметов

Максимум (сейчас) — 128

Считать каждый раз — безумно дорого и долго

Выход:

serialize :inventory_effects

или

class InventoryEffect < AR::Bbelongs_to :character

end

Лучший выбор:

Зависит от задачи

Фрагменты ответа

<% cache 'disisdakey' do %> ...неприлично медленная

операция...<% end %>

Лучший выбор:memcached

@user.cache_key

'users/9-20101027173032'

@user.save!

'users/9-20101027198122'

Кэш «протухает» автоматически

Не только для моделей

def daily_cache_key 'my_key/%s' % Time.now.end_of_day.to_i

end

cache(daily_cache_key)

Ответ целиком

class MyController < AC::B caches_page :show

end

Nginx

location / { try_files $uri @passenger;

} location @passenger { passenger_enabled on;

}

Проблемы

Выбор хранилища

Нет «серебрянной пули»

Контентные проекты:

● memcached● База данных● Файловая система

Игровые приложения:

● memcached● Redis● Память приложения

«Протухание» кэша

« There are only two hard things in Computer Science: cache invalidation and naming things »

Phil Karlton

«Протухание» кэша

Память приложения

База данных

before_save :update_cache

def update_cache self.cache = {…}

end

Memcached

Автоматическое «протухание»

Можем удалять только зная ключ

Redis

Redis — это не кэш!

Это хранилище данных

Удаление ключей по маске

Файловая система

Observer

Удаление по маске

Страшные истории

Вопросы?

Алексей Дмитриев

rene.dekart@gmail.comhttp://railorz.ru@dekart1234

Recommended