LRU缓存和实现

LRU缓存

  • 是一种以LRU策略为缓存策略的缓存
  • 所谓的缓存策略,就是缓存满了以后又有新的数据加到缓存时,我们怎么替换清理缓存的方法
  • LRU是last recently used的缩写,就是近期最少使用算法,依据程序的局部性原理,淘汰数据策略是距离当前最久没有被访问的数据应该被淘汰

相关接口

  • 创建LRU缓存:
    – int LRUCacheCreate(int capacity,void **lruCache);
    – capacity为入参:缓存容量,lruCache为出参:缓存句柄。返回0成功,-1失败

  • 销毁缓存:
    – int LRUCacheDestory(void *lruCache);
    – lruCache为入参:缓存句柄,返回0成功,-1失败

  • 将数据放入LRU缓存中
    – int LRUCacheSet(void *lruCache,char key,char data);
    – lruCache为入参:缓存句柄,key为入参:数据索引,data为入参:要缓存的数据,当前设为字符,返回0成功,-1失败

  • 从LRU缓存中获取数据
    – char LRUCacheGet(void *lruCache,char key);
    – lruCache为入参:缓存句柄,key为入参:数据索引,返回要get的数据,不存在的话返回’\0’

  • LRU调试接口
    – void LRUCachePrint(void *lruCache);
    – 按访问时间从新到旧的顺序输出缓存数据

设计思路

  • 双向链表来维护LRU特性,该链表从头到尾的数据根据最近访问时间从最新的到最旧的。
    1.需要访问一块数据时,先调用LRUCacheGet尝试从缓存中获取数据。
    2.如果缓存中有此数据,则将改数据从链表中删除,重新放入链表表头。
    3.如果缓存中没有我们需要的数据,则从外部取得数据,调用LRUCacheSet接口将该数据放入缓存,将新数据插入表头。

  • 使用hashmap来保证缓存中数据的访问速度
    1.因为数据时存在双向链表中的,如果每次都遍历,效率太低。所以数据维护在双向链表,还将数据维护在一个hashmap中

代码

  • 还没写完。。

你可能感兴趣的:(Algorithm,缓存,算法,数据)