Я собираюсь добавить в свое приложение кеш в памяти, например redis, и у меня возникли некоторые проблемы с пониманием того, как все это сочетается друг с другом.
const postLoader = new DataLoader(async keys => {
// ... sql code to get multiple posts by ids
})
const postRepository = {
async get(id) {
let post = await cachingImplementation.get("post:" + id)
if (!post) {
post = await postLoader.load(id)
}
return post
}
}
Я понимаю необходимость пакетных запросов к базе данных, но применим ли тот же принцип к запросам к серверу Redis?
В этом сценарии, если я запустил метод postRepository.get
10 раз за один тик, мне пришлось бы сделать 10 разных запросов к серверу redis.
Это проблема? Следует ли переместить фактический источник выборки (кеш или базу данных) в резолвер загрузчика данных, чтобы он вместо непосредственного выполнения кода sql сначала просматривал кеш, а затем - базу данных.
Например
cache = {
1: ...,
2: ...
}
Если я прошу сообщения с идентификаторами 1,2,3, в кеше их будет только два. Поэтому мне пришлось бы отфильтровать существующие и запросить базу данных для оставшихся, или просто проверить, соответствует ли запрошенный идентификатор длине возвращаемых строк, и если это не так, запросить базу данных для всего.
Каковы недостатки обоих подходов? Есть ли предпочтительное решение?