Осторожно, закэшировано!


Сергей Жигалов
Яндекс

Простому фронтендеру?

Сделать мое приложение на порядок быстрее потратив на это несколько часов.

Простому фронтендеру?

Пережить нагрузку в черную пятницу.

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

Статика (HTTP запросы)

Получение данных

Шаблоны

Результаты вычислений

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

Показать список сортов кофе


var app = express();
        

app.get('/', (req, res) => {
    fetchProducts()
        .then(data => res.json(data));
});
        

app.listen(3000);
        

Без кэша

В переменной


var cache;
        

app.get('/', (req, res) => {
    cache = cache || fetchProducts();
    cache
        .then(data => res.json(data))
        .catch(err => cache = null);
});
        

В переменной

lru-cache


var LRU = require('lru-cache');
var cache = LRU({ maxAge: 3000 });
        

app.get('/', (req, res) => {
    if (!cache.has('coffee')) {
      cache.set('coffee', fetchProducts());
    }

    cache
        .get('coffee')
        .then(data => res.json(data))
        .catch(err => cache.del('coffee'));
});
        

lru-cache

Single cache
Multiple cache
Union cache

Распределенный кэш

redisio

var redis = require('redis');
var cache = redis.createClient();
        

bluebird.promisifyAll(
    redis.RedisClient.prototype
);
        

cache.getAsync('coffee')
        
    .then(data => {
        if (data) {
            return JSON.parse(data);
        }

        return fetchProducts().then(data => {
            client.set('coffee', JSON.stringify(data));
            return data;
        });
    })
    .then(data => res.json(data));

Кэш - это

Быстрый доступ

"Горячие" данные

Не всегда актуальные

Ограничение по размеру

Эффективность кэша

Hit Rate = Попадание в кэш / Количество запросов

Разогрев кэша


// ...
app.listen(3000);

cache.set('coffee', fetchProducts());
            

Советы


Кэшировать после всех оптимизаций

Кэш - вспомогательная компонента

Все должно работать и без кэша

Спасибо!


cache.set('speaker', {
    face: My face!,
    name: 'Сергей',
    twitter: '@sergey_zhigalov',
    email: 'zhigalov@yandex-team.ru'
});