缓存学习笔记-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

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

3、实现ICache,LRU算法

最后,奉上源码下载连接

时间: 2024-10-10 21:24:42

缓存学习笔记-2的相关文章

.NET缓存学习笔记

<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script src="http://libs.

缓存学习笔记-1

    缓存是存储使用频繁数据的临时地方,从而加快系统响应速度.缓存在构建高性能web系统有着很重要的作用.如果要对一个系统进行优化,那么使用缓存是最快最有效的手段. 缓存术语     命中(Cache hit):当客户端发起一个请求(比如说一个产品的信息)时,我们会检测这个产品是否在缓存中,如果没有的话加入到缓存中,反之我们称之为命中了.     漏掉(Cache miss):很简单,虽然在缓存中存在,但是没有客户端请求.这里需要注意亮点     1.如果还有缓存空间,那么,没有命中的对象会被

memcache redis 缓存学习笔记

0.redis和memcache的区别 a.redis可以存储除了string之外的对象,如list,hash等 b.服务器宕机以后,redis会把内存的数据持久化到磁盘上,而memcache则不会 1.redis安装 a.rz redis.gz.tar b.tar解压 c.make编译 d../redis-server &  服务端启动 e.redis-cli 客户端启动 1)notice:注意默认启动 redis-server redis.conf 会报错 , 原因参考redis有三种启动的

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记45:自定义HttpFilter类,理解多个Filter 代码的执行顺序,Filterdemo:禁用浏览器缓存的Filter,字符编码的Filter,检查用户是否登陆过的Filter

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

Android-Universal-Image-Loader学习笔记(3)--内存缓存

前面的两篇博客写了文件缓存,现在说说Android-Universal-Image-Loader的内存缓存,该内存缓存涉及到的类如图所示 这些类的继承关系如下图所示: 如同文件缓存一样,内存缓存涉及的接口也有两个:MemoryCacheAware 和MemoryCache,其中MemoryCache只是简单的继承了MemoryCacheAware并没有声明其他的方法.MemoryCacheAware接口的方法如下: @Deprecated public interface MemoryCache

[原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

memcached学习笔记5--socke操作memcached 缓存系统

使用条件:当我们没有权限或者不能使用服务器的时候,我们需要用socket操作memcached memcached-client操作 特点: 无需开启memcache扩展 使用fsocketopen()套接字连接memcached 同样执行CRUD require_once(CLASS_PATH.'memcached-client.php');//CLASS_PATH 是我定义的类文件文件夹路径 $mc = new memcached( array( 'servers' => array( '1

mybatis学习笔记(13)-查询缓存之二级缓存

mybatis学习笔记(13)-查询缓存之二级缓存 mybatis学习笔记13-查询缓存之二级缓存 二级缓存原理 开启二级缓存 调用pojo类实现序列化接口 测试方法 useCache配置 刷新缓存就是清空缓存 应用场景和局限性 本文主要讲mybatis的二级缓存,二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的. 二级缓存原理 首先开启mybatis的二级缓存. sqlS