zoukankan      html  css  js  c++  java
  • 缓存学习笔记-2

    在缓存设计中有两点是必须要考虑的:

    • 缓存的数据和目标数据的一致性问题
    • 缓存的过期策略

    其中,缓存的过期策略是重点,因为缓存的存储空间往往是有限的,当缓存中的存储块被用完,就需要把过期的缓存移除掉,所以我们需要设计一种良好的缓存淘汰算法来实现。业界中常用的淘汰算法有

    1. FIFO:First In First Out ,先进先出
    2. LRU:Least Recently Used,最近最少使用
    3. LFU:Least Frequently Used,最不经常使用

    LRU和LFU的区别是,LFU算法是根据一段时间里缓存数据项被使用的次数,选择出最少使用的数据项。即根据使用次数的差异来决定淘汰的。而LRU是根据使用时间的差异来决定的。
    我们在设计缓存时除了上面说道的两点外,效率问题也至关重要。这就要涉及到到数据结构了。

    • FIFO算法的数据结构很简单,用一个队列就可以实现;
    • LFU算法的数据结构也是一个队列,唯一不同的是数据项中增加了访问次数的属性,根据访问次数排序,淘汰掉访问次数最少的;
    • LRU算法的数据结构相对上面算法来说比较复杂,通常是采用字典/哈希表+链表来实现。

    当然缓存的淘汰算法不止这些,还有LRU-K、2Q、MQ等算法,就不再细说了。在这里我们选择一个最常用也很重要的LRU算法,采用双向链表+哈希表来实现下

    1、定义一个缓存接口ICache
    image

    2、设计一个键值对结构,用来存储缓存列表

    image

    3、实现ICache,LRU算法

    image

    最后,奉上源码下载连接

  • 相关阅读:
    如何彻底卸载Oracle11g
    Oracle 11g的安装
    python 循环队列的实现
    numpy模块学习笔记
    Python 进程之间共享数据
    python异步加协程获取比特币市场信息
    MySQL中, 如何查询某一天, 某一月, 某一年的数据.
    js获取时间
    nodejs爬虫笔记(五)---利用nightmare模拟点击下一页
    nodejs爬虫笔记(四)---利用nightmare解决加载更多问题
  • 原文地址:https://www.cnblogs.com/Khadron/p/Cache_Note_2.html
Copyright © 2011-2022 走看看