간단한 "캐시 무효화"전략, 2부
6998 단어 tutorialnodebeginnersjavascript
"There are only two hard problems in Computer Science: cache invalidation, and naming things."
— Phil Karlton
이것은 우리가 간단한 캐시 미들웨어 구현에 대해 이야기했던 지난 게시물에 이어지며 위의 흐름도에 요약될 수 있습니다. 해당 게시물을 읽지 않은 경우 계속하기 전에 읽어 보십시오. 그 게시물은 "캐시 무효화를 어떻게 할 수 있습니까?"라는 질문으로 끝났습니다. 이제 이 질문을 살펴보겠습니다.
좋아, 이것을 한 번 더 해보자.
질문 캐싱이 필요한 이유는 무엇입니까?
답. 사용자가 데이터를 더 빨리 얻을 수 있도록.
질문 캐시 무효화가 필요한 이유는 무엇입니까?
답. 사용자가 최근 실시간 데이터를 얻을 수 있도록.
캐시 무효화란 무엇입니까?
캐시 무효화는 computer system의 프로세스로서 cache의 항목을 교체하거나 제거합니다.
이 두 가지 방법 중 "제거"가 구현하기 가장 쉽고 캐시가 지워지고 새 데이터로 다시 작성됩니다.
캐시 무효화 전략
여기에는 두 단계만 있지만 구현은 아키텍처마다 크게 다를 수 있습니다.
다시 말하지만 이에 대한 정확한 구현은 다를 수 있습니다.
$afterUpdate
와 같은 낮은 수준에서 캐시 지우기 방법을 추가합니다. 이 게시물에서는 캐시 미들웨어를 확장하여 무효화도 처리할 것입니다. 어떻게 작동하는지 살펴보겠습니다. 이 예에서는 리소스의 데이터를 변경하는 유일한 방법은 POST 요청을 수행하는 것이라고 가정합니다. 미들웨어에
clear
라는 새 메서드를 추가합니다.// middlewares/cache.js
const NodeCache = require('node-cache')
const cache = new NodeCache({ stdTTL: 5 * 60 })
function getUrlFromRequest(req) {
...
}
function set(req, res, next) {
...
}
function get(req, res, next) {
...
}
+ function clear(req, res, next) {
+ cache.keys(function(err, keys) {
+ if (!err) {
+ let resourceUrl = req.baseUrl;
+ const resourceKeys = keys.filter(k => k.includes(resourceUrl));
+ cache.del(resourceKeys);
+ }
+ });
+ return next();
+ }
module.exports = { get, set, clear }
그리고 우리 경로에서 사용
// products/routes.js
router.get(
...
)
router.post(
'/',
productsController.create,
cache.clear, // 👈
responseHandler
)
그리고 완료!
POST
요청이 있을 때마다 데이터가 변경되었으므로 다음 GET
요청이 들어올 때 캐시를 다시 작성할 수 있도록 캐시 지우기를 트리거합니다.cache.clear
에서 정확히 무슨 일이 일어나고 있습니까?// middlewares/cache.js
...
...
function clear(req, res, next) {
cache.keys(function(err, keys) {
if (!err) {
// again, it depends on your application architecture,
// how you would retrive and clear the cache that needs to be cleared.
// You may use query path, query params or anything.
let resourceUrl = req.baseUrl;
const resourceKeys = keys.filter(k => k.includes(resourceUrl));
cache.del(resourceKeys);
}
});
return next();
}
cache.keys
저장된 모든 캐시 키를 반환합니다. req.baseUrl
에는 요청의 기본 경로가 있습니다. 'products'
resourceKeys
는 하위 문자열로 기본 경로가 있는 모든 키를 가져옵니다. (기억하세요? 키는 단순히 GET
리소스를 가리키는 URL이었습니다.) cache.del
키가 가리키는 캐시를 지웁니다. 예를 들어 캐시에 다음과 같은 키가 있는 값이 있는 경우
POST
에 대한 /products/
요청은 이러한 모든 👆 캐시를 지우고 새 GET
요청이 들어올 때 다시 작성됩니다.내 예에서는
POST
요청의 기본 경로 범위 내에 있는 키가 있는 모든 캐시를 지우기만 하면 됩니다.이 설정을 사용하면 이론적으로 캐시 TTL을 무한대로 설정할 수 있습니다. 데이터를 변경할 때마다 캐시가 지워지고 캐시에 항상 최신 데이터가 있기 때문입니다. 하지만 건강을 위해 TTL을 15분으로 유지했습니다. 이제 사용자는 항상 최신 데이터를 더 빠르게 보유하게 되었습니다.
오늘은 그게 다야. 행복한 코딩!
나를 따르라 | Github , 멋진 물건을 만들고 게시합니다. 👨💻
Reference
이 문제에 관하여(간단한 "캐시 무효화"전략, 2부), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vigzmv/a-simple-cache-invalidation-strategy-part-2-4alc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)