[Design Pattern] Encapsulate a network request lib - 2. Cache the request

Usage of a cached request:

const req = createCacheRequestor();
req.get('/a') // request
req.get('/a') // use cache
req.get('/b') // request
req.get('/b') // use cache

 

What we need to do is resolve following questions:

  • how to cache the request
  • where the save the cache
  • what is the cache key

 

Cache key

Example code:

const req = createCacheRequestor({
    key: (config) {
        return config.pathname // use pathname as a key
    },
    presist: true
})

 

Design

Due to there are many ways to provide presistent feature, different approach may have different params / foramt / apis; therefore we need a stable interface for user to use.

export interface CacheStore {
    has(key: string): Promise<boolean>;
    set<T>(key: string, ...values: T[]): Promise<void>;
    get<T>()key: string): Promise<T>
    // other methods
}
    
export function useCacheStore(isPresist): CacheStore {
    if(!isPersist) {
        return createMemoryStore();
    } else {
        return createStorageStore();
    }
}

 

Cache duration

Usage:

const req = crateCacheRequestor({
    duration: 1000 * 60 * 60,
    isValild(key, config) {
       // return true means cache is valid, return false then cache is invalid
    }
})

Example code:

function createCacheRequestor(cacheOptions) {
    const options = normalizeOptions(cacheOptions);
    const store = useCacheStore(options.persist)
    const req = useRequestor()
    return req;
}

req.on('beforeRequest', async (config) => {
    const key = options.key(config);
    const hasKey = await store.has(key);
    if (hasKey && options.isValid(key, config)) {
        // return cache reuslt
    }
})

req.on('responseBody', (config, resp) => {
    const key = options.key(config)
    store.set(key, resp.toPlain());
})

 

posted @   Zhentiw  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2022-12-01 [Typescript] 123. Hard - Intersection
2021-12-01 [AWS] Assign a public IP address to an EC2 instance after launched
2020-12-01 [Java Spring] Implementing Spring Security
2019-12-01 [Javascript] Sort by multi factors
2019-12-01 [Javascript] Keyword 'in' to check prop exists on Object
2015-12-01 [Javascript] Advanced Reduce: Common Mistakes
点击右上角即可分享
微信分享提示