JAA*_*lde 6 javascript algorithm caching
编辑:为简单起见,为了尝试使这个问题和示例代码更通用,我遗漏了一个细节.根据其中一个反应(非常好)的细节证明是重要的.该系统主要用于显示日期范围内的事物.代码中的低/高数字通常表示Unix时间戳,其范围可能跨越数周或数月.结束编辑
我有一个页面,其中提供了具有属于特定范围的属性的数据对象的视图.当用户与视图交互以更改它时,它通常是对范围的顺序更改(0-9,10-19 ...).我正在从服务器检索这些数据,当它进入时,我将其缓存,以便随后对该范围内的数据的请求已经可用.在每次读取数据时,我首先检查是否有缓存数据,如果不是,我从服务器读取它并调整缓存.
这里有一个粗略的,过于简化的例子:
var cache, haveCache, read;
cache = {
rangeLow: 0,
rangeHigh: 10,
data: [
//whatever has been read so far between current low and high
{
low: 1,
high: 3,
// ...other props
},
{
low: 5,
high: 6,
// ...other props
},
//...
]
};
haveCache = function( low, high )
{
return ! ( low < cache.rangeLow || high > cache.rangeHigh );
};
read = function( low, high )
{
var data;
if( ! haveCache( low, high ) )
{
//go to outside source and read in info , then merge to cache
//
// when merging to cache:
// if `low` param is lower than `cache.rangeLow`, overwrite cache.rangeLow with `low`
// if `high` param is higher than `cache.rangeHigh`, overwrite `cache.rangeHigh` with `high`
}
//read data from cache
return data;
};
Run Code Online (Sandbox Code Playgroud)
只要范围的变化确实是连续的,这就很有效.但是,我意识到有一种方法可以非顺序地更改视图并跳过一大组值.所以假设我现在正在显示范围10-19,并且我有一个缓存,范围为0-29.然后,用户要求查看范围为60-69的数据.它目前的工作方式,我会要求服务器提供数据,然后将其恢复并呈现.但现在缓存范围低和范围高从0-69运行,而它实际上只保存0-29和60-69范围内的数据.属性范围为30-59的项目不在缓存中,永远不会被检索.
我可以使用什么(更好,更有效)的机制或算法来存储缓存信息并确定我当前显示的范围是否在缓存中?
非常感谢,吉姆
您似乎有“数据块”,每个数据块的范围为 10 个对象。计算您可以在缓存中存储多少个这些块,我们称之为cache_size。现在您可以使用缓存中的块列表,fe 为cache_size4:
20-29
0-9
40-49
30-39
Run Code Online (Sandbox Code Playgroud)
这种方式维护这个列表并检查某个对象是否在缓存中会有点复杂,但我认为这是值得的。
您可能还考虑为每个块保留一个时间或日期索引,以确定上次检索其中的对象的时间,这样当您的缓存已满并且您必须丢弃缓存的块时,您可以丢弃最旧的块。