首页
/ LRU 缓存算法技术文档

LRU 缓存算法技术文档

2024-12-16 09:05:06作者:丁柯新Fawn

LRU(Least Recently Used,最近最少使用)缓存算法是一种常用的缓存淘汰策略,它通过移除最长时间未被访问的数据来为新数据腾出空间。以下是对本项目实现的LRU缓存算法的详细说明。

1. 安装指南

通过复制代码

推荐将lru.jslru.jslru.d.ts文件复制到您的源代码目录中。对于最小功能需求,您只需要复制到注释“以下是可选代码”的部分。

使用NPM

yarn add lru_map

请注意,由于NPM是一个大的扁平命名空间,您需要将模块导入为“lru_map”而不是简单的“lru”。

使用AMD

使用AMD模块加载器(例如amdld)也可以加载此模块,无需任何配置。

测试

  • 运行测试:npm test
  • 运行基准测试:npm run benchmark

使用TypeScript

此模块包含完整的类型覆盖,以便与TypeScript一起使用。如果您复制了代码或文件而不是使用模块加载器,请确保将lru.d.ts包含在与lru.js相同的目录中。

import { LRUMap } from './lru'

2. 项目使用说明

LRU缓存算法项目使用了一个双向链表来实现,以下是示例代码:

let c = new LRUMap(3)
c.set('adam', 29)
c.set('john', 26)
c.set('angela', 24)
console.log(c.toString()) // -> "adam:29 < john:26 < angela:24"
console.log(c.get('john')) // -> 26
console.log(c.toString()) // -> "adam:29 < angela:24 < john:26"
c.set('zorro', 141)
console.log(c.toString()) // -> "angela:24 < john:26 < zorro:141"

3. 项目API使用文档

LRUMap类的API模仿了JavaScript的Map对象,这意味着在大多数情况下,您可以直接使用LRUMap替代Map

export class LRUMap<K, V> {
  constructor(limit: number, entries?: Iterable<[K, V]>)
  size: number
  limit: number
  oldest: Entry<K, V>
  newest: Entry<K, V>
  assign(entries: Iterable<[K, V]>): void
  set(key: K, value: V): LRUMap<K, V>
  shift(): [K, V] | undefined
  get(key: K): V | undefined
  has(key: K): boolean
  find(key: K): V | undefined
  delete(key: K): V | undefined
  clear(): void
  keys(): Iterator<K>
  values(): Iterator<V>
  entries(): Iterator<[K, V]>
  [Symbol.iterator](): Iterator<[K, V]>
  forEach(fun: (value: V, key: K, m: LRUMap<K, V>) => void, thisArg?: any): void
  toJSON(): Array<{ key: K, value: V }>
  toString(): string
}

interface Entry<K, V> {
  key: K
  value: V
}

如果需要在项从缓存中逐出时进行任何形式的最终处理,包装shift方法是一个很好的方式:

let c = new LRUMap(123);
c.shift = function() {
  let entry = LRUMap.prototype.shift.call(this);
  doSomethingWith(entry);
  return entry;
}

内部实现会在需要逐出条目时调用shift方法,所以这个方法对于从缓存中移除的任何项都是保证会被调用的。返回的条目必须不包含对其他条目的任何强引用。有关更多详细信息,请参阅LRUMap.prototype.set()方法的文档。

热门项目推荐
相关项目推荐

项目优选

收起
Python-100-DaysPython-100-Days
Python - 100天从新手到大师
Python
376
72
RuoYi-Vue-PlusRuoYi-Vue-Plus
多租户后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-Token、Mybatis-Plus、Flowable、SpringDoc、Hutool、OSS 定期同步
Java
53
7
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
201
47
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
276
72
GSYVideoPlayerGSYVideoPlayer
视频播放器(IJKplayer、ExoPlayer、MediaPlayer),HTTPS,16k page size,支持弹幕,外挂字幕,支持滤镜、水印、gif截图,片头广告、中间广告,多个同时播放,支持基本的拖动,声音、亮度调节,支持边播边缓存,支持视频自带rotation的旋转(90,270之类),重力旋转与手动旋转的同步支持,支持列表播放 ,列表全屏动画,视频加载速度,列表小窗口支持拖动,动画效果,调整比例,多分辨率切换,支持切换播放器,进度条小窗口预览,列表切换详情页面无缝播放,rtsp、concat、mpeg。
Java
5
2
LangChatLangChat
LangChat: Java LLMs/AI Project, Supports Multi AI Providers( Gitee AI/ 智谱清言 / 阿里通义 / 百度千帆 / DeepSeek / 抖音豆包 / 零一万物 / 讯飞星火 / OpenAI / Gemini / Ollama / Azure / Claude 等大模型), Java生态下AI大模型产品解决方案,快速构建企业级AI知识库、AI机器人应用
Java
11
3
source-vuesource-vue
🔥 一直想做一款追求极致用户体验的快速开发平台,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间对若依框架进行扩展写了一套快速开发系统。如此有了开源字节快速开发平台。该平台基于 Spring Boot + MyBatis + Vue & Element ,包含微信小程序 & Uniapp, Web 报表、可视化大屏、三方登录、支付、短信、邮件、OSS...
Java
24
2
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
898
0
gin-vue-admingin-vue-admin
🚀Vite+Vue3+Gin的开发基础平台,支持TS和JS混用。它集成了JWT鉴权、权限管理、动态路由、显隐可控组件、分页封装、多点登录拦截、资源权限、上传下载、代码生成器【可AI辅助】、表单生成器和可配置的导入导出等开发必备功能。
Go
16
3
advanced-javaadvanced-java
Advanced-Java是一个Java进阶教程,适合用于学习Java高级特性和编程技巧。特点:内容深入、实例丰富、适合进阶学习。
JavaScript
429
109