Задать вопрос
@Hanry654

Как правильно кешировать данные в боте, через redis + mongoose?

Есть бот. Хочу чтобы данные при запросе про пользователя брались из кэша, но вот как лучше это реализовать?

Для этого я сделал 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)


Может есть иные способы реализации, которые намного лучше этого говно кода?
  • Вопрос задан
  • 48 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы