我试图缓存Twitter查询的结果,因为它们有速度限制,我似乎无法理解它。我遵循本教程这里。
Cache.js文件看起来是这样的(取自教程):
import NodeCache from 'node-cache';
class Cache {
constructor(ttlSeconds) {
this.cache = new NodeCache({ stdTTL: ttlSeconds, checkperiod: ttlSeconds * 0.2, useClones: false });
}
get(key, storeFunction) {
const value = this.cache.get(key);
if (value) {
return Promise.resolve(value);
}
return storeFunction().then((result) => {
this.cache.set(key, result);
return result;
});
}
del(keys) {
this.cache.del(keys);
}
delStartWith(startStr = '') {
if (!startStr) {
return;
}
const keys = this.cache.keys();
for (const key of keys) {
if (key.indexOf(startStr) === 0) {
this.del(key);
}
}
}
flush() {
this.cache.flushAll();
}
}
export default Cache;我的Twitter查询文件如下所示:
import TwitterCount from "../models/TwitterModel.js";
import { TwitterApi } from 'twitter-api-v2';
import dotenv from "dotenv";
dotenv.config();
import CacheService from '../middleware/Cache.js';
const twitterClient = new TwitterApi(process.env.TWITTER_API_BEARER_TOKEN);
const readOnlyClient = twitterClient.readOnly;
const ttl = 60 * 60 * 1; //cache for 1 hour
const cache = new CacheService(ttl);
export const getCount = async(req, res) => {
try {
const twit = await TwitterCount.findOne({
attributes:['followersCount']
});
const key = `Twit_${String(twit.dataValues.followersCount)}`;
const twitterFollowers = await readOnlyClient.v2.followers('1563787278857785350'); //HejOfficial account Twitter
const results = cache.get( key , () => twitterFollowers.data.length );
if (twit.dataValues.followersCount === results) {
console.log('same results');
} else {
await TwitterCount.create({
followersCount: results
});
console.log("Twitter Data added Successful");
}
res.json(twit);
cache.del(key);
} catch (error) {
console.log(error);
}
}我想我没有正确地使用钥匙。如果您以前遇到过此问题,请提供帮助,或者提供更好的缓存替代方案。
谢谢。
发布于 2022-09-18 09:54:10
尝试使用帐户id作为键,而不是跟随者计数。通过这种方式,您可以缓存帐户追随者一个小时。
像这样的东西应该会让您使用缓存,它没有数据库插入,但是现在可以在getCount方法中处理它们。
export const getCount = async(req, res) => {
const result = await getCountFromAPI("1563787278857785350") //HejOfficial account Twitter
res.json(result);
};
const getCountFromAPI = async(account) => {
const key = `Twit_${account}`;
return cache.get(key, async() => {
const twitterFollowers = await readOnlyClient.v2.followers(account);
return twitterFollowers;
});
};
请注意,如果每次将结果保存到数据库中,则会导致缓存的用途失败。我建议只对这些数据使用API,如果您也想使用数据库,那么缓存可能是不必要的吗?使用时间更新值保存追随者计数和帐户id,如果时间更新超过一小时,则从Twitter再次查询该值。
https://stackoverflow.com/questions/73761258
复制相似问题