Осторожно, закэшировано! – Простому фронтендеру? – Как кэшировать?



Осторожно, закэшировано! – Простому фронтендеру? – Как кэшировать?

0 0


frontend-fellows-cache

Материалы к докладу про кеширование

On Github Zhigalov / frontend-fellows-cache

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

Сергей Жигалов

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

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

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

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

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

Статика (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

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

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: ,
    name: 'Сергей',
    twitter: '@sergey_zhigalov',
    email: 'zhigalov@yandex-team.ru'
});
1
Осторожно, закэшировано! Сергей Жигалов