首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NODEJS中的缓存

NODEJS中的缓存
EN

Stack Overflow用户
提问于 2022-09-18 08:42:31
回答 1查看 76关注 0票数 0

我试图缓存Twitter查询的结果,因为它们有速度限制,我似乎无法理解它。我遵循本教程这里

Cache.js文件看起来是这样的(取自教程):

代码语言:javascript
复制
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查询文件如下所示:

代码语言:javascript
复制
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);
}

}

我想我没有正确地使用钥匙。如果您以前遇到过此问题,请提供帮助,或者提供更好的缓存替代方案。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-18 09:54:10

尝试使用帐户id作为键,而不是跟随者计数。通过这种方式,您可以缓存帐户追随者一个小时。

像这样的东西应该会让您使用缓存,它没有数据库插入,但是现在可以在getCount方法中处理它们。

代码语言:javascript
复制
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再次查询该值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73761258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档