npm i f-cache-memorycache memory library
import CacheMemory from 'f-cache-memory'
const cache = new CacheMemory()
cache.setCache('aaa', 111)
cache.setCache('bbb', 222)
console.log(cache.getCache('aaa'))
console.log(cache.getNowCache())
console.log(cache.getPreviousCache())
cache.setCache('ccc', 333)
console.log(cache.getNowCache())
console.log(cache.getPreviousCache())
console.log(cache.getNextCache())
console.log(cache.getCacheToArray())
const localCache = new CacheMemory(100, 100000, (data) => {
localStorage.setItem('localCache', JSON.stringify(data))
})
localCache.setCache('aaa', 111)
localCache.setCache('bbb', 222)
const initCache = new CacheMemory()
const localStorageCache = localStorage.getItem('localCache')
if (localStorageCache) {
initCache.initCache(JSON.parse(localStorageCache))
}
console.log(initCache.getCacheToArray())Vue:
const cacheList = ref<[string, any][]>([])
const localCache = new CacheMemory(100, 100000, (data) => {
cacheList.value = data
})React:
const [cacheList, setCacheList] = useState<[string, any][]>([])
const localCache = new CacheMemory(100, 100000, (data) => {
setCacheList(data)
})export interface CacheValueType {
dateTime: number;
data: any;
}| parameter | default | description | version |
|---|---|---|---|
size?: number |
100 |
How many can be cached at most | |
expiration?: number |
Number.MAX_SAFE_INTEGER |
Set the cache validity period in milliseconds, and if it exceeds the time, it will be deleted | |
change?: (data: [string, CacheValueType][]) => void |
- | When the cache changes, external data can be synchronized within this method | change in v0.0.7+ |
| api | parameter | typeof return | description | version |
|---|---|---|---|---|
initCache |
data: [string, CacheValueType][] |
- | Initialize cached data | initCache in v0.0.7+ |
hasCache |
key: string |
boolean |
Verify if it is in cache | |
setCache |
key: string, data: any, expiration?: number |
- | Set cache, expiration sets the cache validity period in milliseconds, with priority higher than the initialized expiration parameter. If not set, it defaults to the initialized expiration parameter |
expiration in v0.0.3+ |
getCache |
key: string |
any |
Retrieve cache | |
deleteCache |
key: string |
- | Delete Cache | |
deleteCacheByStarts |
url: string |
- | Delete cache based on the prefix of key values | |
clearCache |
- | - | Clear Cache | |
cacheSize |
- | number |
Cache Size | |
getNowCache |
- | any |
Retrieve the current cache, which defaults to the last one, getPreviousCache/getNextCache/goPostionCache/goAbsPostionCache will affect the current cached value |
|
getPreviousCache |
- | any |
Cache the previous cache in the set order | |
getNextCache |
- | any |
Cache the next cache in the set order | |
goPostionCache |
num: number |
any |
Retrieve cache relative to the current cache, where 1 is the next and -1 is the previous | |
goAbsPostionCache |
num: number |
any |
Retrieve the numth cache in the order set | |
getCacheToArray |
needTime: boolean = false |
[string, CacheValueType][] | [string, any][] |
Convert to an array in the order set. If the parameter is false, return the set data directly. If it is true, return {dateTime: expiration time, data: set data} |
dateTime parameter in v0.0.7+ |
export interface CacheValueType {
dateTime: number;
data: any;
}
export type isArrayNeedTime<T> = T extends true ? [string, CacheValueType][] : [string, any][];
export default class CacheMemory {
#private;
constructor(size?: number, expiration?: number, change?: (data: [string, CacheValueType][]) => void);
hasCache(key: string): boolean;
setCache(key: string, data: any, expiration?: number): void;
getCache(key: string): any;
deleteCache(key: string): void;
deleteCacheByStarts(url: string): void;
clearCache(): void;
initCache(data: [string, CacheValueType][]): void;
cacheSize(): number;
getNowCache(): any;
getPreviousCache(): any;
getNextCache(): any;
goPostionCache(num: number): any;
goAbsPostionCache(num: number): any;
getCacheToArray<T extends boolean = false>(needTime?: T): isArrayNeedTime<T>;
}// httpCache.ts
import type { AxiosRequestConfig } from 'axios'
import CacheMemory from 'f-cache-memory'
const httpCache = new CacheMemory()
// const httpCache = new CacheMemory(100, 1000)
export function configToKey(config: AxiosRequestConfig): string {
let key = config.url as string
if (config.params) {
key += JSON.stringify(config.params)
}
return key
}
export default httpCacheThe encapsulation adjustments for axios are as follows
...
import httpCache, { configToKey } from './httpCache'
...
instance.interceptors.response.use(
(response) => {
if (response.status === 200 && response.config.method === 'get') {
const curHttpCacheKey = configToKey(response.config)
httpCache.setCache(curHttpCacheKey, response)
}
return response
},
(error) => {
return Promise.reject(error)
}
)
...
export function get<T = any>(url: string, config: AxiosRequestConfig = {}): Promise<T> {
const curHttpCacheKey: string = configToKey({
url,
...config
})
if (!httpCache.hasCache(curHttpCacheKey)) {
const httpRequest = instance.get(url, config)
httpCache.setCache(curHttpCacheKey, httpRequest)
return httpRequest as Promise<T>
} else {
return Promise.resolve(httpCache.getCache(curHttpCacheKey))
}
}Firstly, encapsulate the request and check if it is in the cache before sending the get request. Set the cache value in the interceptors.response.
In some areas that require rollback functionality, this cache supports various caching operations such as getNowCache/getPreviousCache/getNextCache/goPostionCache/goAbsPostionCache.