Есть бот. Хочу чтобы данные при запросе про пользователя брались из кэша, но вот как лучше это реализовать?
Для этого я сделал json с async функциями redis`a и дополнительными функциями
const redis = {
"asyncGet": promisify(client.get).bind(client),
"asyncSet": promisify(client.setex).bind(client),
"asyncKeys": promisify(client.keys).bind(client),
async allKeys() {
return await this.asyncKeys("*")
},
async get(tgId) {
let value = await this.asyncGet(tgId)
try {
value = JSON.parse( value )
} catch (e) {
await this.asyncSet(tgId, 1, "")
value = null;
}
return value
},
async set(user) {
return await this.asyncSet(user.tgId, 3 * 60, JSON.stringify(user))
}
}
Юзер пишет ->
Если в кеше есть его документ, юзается он
Нет документа, делается запрос, возвращаем и заносим документ сразу в кеш на 3 минуты
async find(tgId) {
let doc;
doc = await this.redis.get(tgId)
if (doc === null) {
const doc = await userSheme.findOne({ tgId: tgId })
if ( doc !== null )
await this.redis.set(doc)
}
return doc
}
Застрял на том что я сделал setInterval, который каждые 2 минуты, заносит изменения юзера в бд, чтобы не сохранять документ каждый раз после команды.
Но проблема в том что JSON.stringify() не переводит в строку функции и не возможно сохранить документ.
setInterval( async () => {
let keys = await redis.allKeys()
for await (let key of keys) {
const user = await redis.get(key)
if (user !== null){
console.log(user)
user.save() // user.save() is not function
}
}
}, 2 * 60 * 1000)
Может есть иные способы реализации, которые намного лучше этого говно кода?