Как я могу сохранить и обновить базу данных в кеше redis? - PullRequest
0 голосов
/ 28 января 2020

После запроса к базе данных я получаю массив объектов, которые я назвал queryResult. Как я могу:

  1. Сохранить массив объектов в кеше redis?

  2. Обновить кэш redis по мере заполнения базы данных?

Вот пример того, как может выглядеть queryResult:

const queryResult=[
{
  username: 'name1',
  prop1: 'some string',
  prop2: 'another string',
  prop3: 'another string 2'
},
{
  username: 'name2',
  prop1: 'some string',
  prop2: 'another string',
  prop3: 'another string 2'
},
{
  username: 'name3',
  prop1: 'some string',
  prop2: 'another string',
  prop3: 'another string 2'
},...
]

Я пытался использовать get, hget, set, hmset et c но они не работали. Вот последнее, что я попробовал:

Промежуточное программное обеспечение кэша

function cache(req, res, next) {
    const { username } = req.params;

    client.get(username, (err, data) = {
        if(err) throw err;
        if(data !== null){
        return res.send(setResponse(username, JSON.parse(data)));
    }
    next();
})
}

// controller/function handler
async function getRepos(req, res, next) {
    try {
        console.log('fetching...');
        const { username } = req.params;
        const resp = await fetch(`https://api.github.com/users/${username}`);

        const result = await resp.json();

        // set redis cache
        client.set(username, JSON.stringify(result));
        return res.send(setResponse(username, result));
    } catch (error) {
        console.error(error);
    }
}


app.get('/repos/:username', cache, getRepos);

1 Ответ

0 голосов
/ 28 января 2020

Так что я смог найти способ обойти это. Ключ заключается в возможности преобразования объектов в строки и наоборот при необходимости.

function setResponse(username, result){
    const val=JSON.stringify({...result});
    return `<h2>${username} has ${val} repos</h2>`
}
//cache middleware
function cache(req, res, next){
    const { username } = req.params;

    client.get(username, (err,data) => {
        if(err) throw err;
        if(data !== null){
            console.log('DATA', typeof data);
            return res.send(setResponse(username, JSON.parse(data)));
        }
        next();
    })
}
async function getRepos(req, res, next){
    try{
        console.log('fetching...');
        const { username } = req.params;
        const resp= await fetch(`https://api.github.com/users/${username}`);

        const result=await resp.json();
        console.log('RES',typeof result);

        //const repos=data.public_repos;

        // set redis cache
        client.setex(username, 3600, JSON.stringify({...result}));
        return res.send(setResponse(username, result));
    } catch(error){
        console.error(error);
    }
}

app.get('/repos/:username', cache, getRepos);

Примечание: это может быть не лучшим Решение проблемы. Другие решения все еще приветствуются.

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