Кэширование, существует ли элемент в базе данных - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть простой механизм кэширования, который включает в себя проверку наличия элемента в кэше базы данных (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;

1 Ответ

0 голосов
/ 20 ноября 2018

Если я правильно понимаю, вы хотите избежать частых попаданий этих несуществующих ключей в базу данных.

Если это так, то лучшим и более простым способом является кэширование несуществующих ключей.

  • Если ключ существует в базе данных, вы можете кэшировать его в Redis с помощью значения, полученного из базы данных.
  • Если ключ не существует в базе данных, также кэшируйте его в Redis, но со специальным значением .

Например, вы кэшируете счет игроков в Redis. Если игрок не существует, вы также кешируете ключ, но с -1 в качестве счета. При поиске в кеше, если ключ существует, но кэшированное значение равно -1 , это означает, что ключ не существует в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...