У меня есть простой механизм кэширования, который включает в себя проверку наличия элемента в кэше базы данных (table:id#id_number
), а затем, если нет, я проверяю, находится ли этот элемент в базе данных.Если он есть в базе данных, я кеширую этот элемент.Если это не так, то, очевидно, нет.
Проблема в том, что в моей нынешней ситуации это будет происходить часто.Каждый раз, когда кто-то посещает первую страницу, я буду видеть, существует ли идентификатор 10, затем если существует идентификатор 9 и т.д.база данных каждый раз, когда кто-то посещает мою главную страницу.
Мое решение сейчас очень грязное и может легко привести к путанице в будущем.Сейчас я кеширую, существует ли идентификатор в базе данных , вероятно (pexists:table:id#id_number
).Если он, вероятно, не существует, я просто предполагаю, что он не существует, или если кэш не установлен.Если он, вероятно, существует, я проверяю, находится ли он в кеше.Если это не так, только тогда ударит по моей базе данных.Затем я кеширую результат из моей базы данных и выясню, существует ли он.
Я спрашиваю, есть ли лучший способ добиться этого эффекта.
/*
This method takes an amount (how many posts you need) and start
(the post id we want to start at). If, for example,
the DB has ids 1, 2, 4, 7, 9, and we ask for
amount=3 and start=7, we should return the items
with ids 7, 4, and 2.
*/
const parametersValidity = await this.assureIsValidPollsRequestAsync(
amount,
start
);
const validParameters = parametersValidity.result;
if (!validParameters) {
throw new Error(parametersValidity.err);
}
let polls = [];
for (
let i=start, pollId=start;
(i > start - amount && pollId > 0);
i--, pollId--
) {
// There is probably no poll logged in the database.
if(!(await this.pollProbablyExists(pollId))) {
i++;
continue;
}
let poll;
const cacheHash = `polls:id#${pollId}`;
if(await cache.existsAsync(cacheHash)) {
poll =
await this.findKeysFromCacheHash(
cacheHash,
"Id", "Title", "Description", "Option1", "Option2", "AuthorId"
);
} else {
// Simulates a slow database retreival thingy
// for testing.
await new Promise(resolve => {
setTimeout(resolve, 500)
});
poll = await this.getPollById(pollId);
if(typeof poll !== "undefined") {
this.insertKeysIntoCacheHash(
cacheHash, 60 * 60 * 3 /* 3 hours to expire */,
poll
);
}
}
if(typeof poll === "undefined") {
// This would happen if a user deleted a poll
// when the exists:polls:id#poll_id key in cache
// hadn't expired yet.
cache.setAsync(`exists:${cacheHash}`, 0);
cache.expire(`exists:polls:id#${pollId}`, 60 * 60 * 10 /* 10 hours. */);
i++;
} else {
polls.push(poll);
cache.setAsync(`exists:${cacheHash}`, 1);
}
}
return polls;