Upload
-
View
298
Download
0
Embed Size (px)
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
Удаление по маске
Страшные истории