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); });
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')); });
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' });