Java实现cache的基本机制
来源:互联网 发布:知乎家里两个儿子的 编辑:程序博客网 时间:2024/05/21 22:54
我这里说的cache不是指CPU和RAM之间的缓存,而是java应用中间常用的缓存。最常使用的场合就是访问数据库的时候为了提高效率而使用的cache。一般的用法就是把数据从数据库读到内存,然后之后的数据访问都从内存来读,从而减少对数据库的读取次数来提高效率。
在使用cache的时候最容易犯的错误就是cache涉及了业务逻辑。使用cache的原意是只是提高程序效率,而不应该干涉程序结果。按照cahce的定义,cache应该是对数据访问端透明地工作。所以在使用cache的时候我们可以问一下自己:“我把cache拿掉后程序还能运行吗?” “cache拿掉前后程序运行的结果一直吗?”。如果答案是否,那您就得重新考虑您的cache方案。我自己就碰到过这样的bug:数据库的有个表里面都是些配置信息,也就是说是些读访问远大于写访问的数据。然后这些数据被理所应当地在程序里面做成内存cache。问题是有个delete方法删除了一条数据,但是没有更新内存cache。所以读操作的客户代码还是能读到这条数据。问题的根本就是后台数据和cache不一致。
cache的容量一般相对后台数据量都比较有限。一旦cache满了就势必要选择最没用的数据从cache里面删除掉,为新数据腾出空间。这里就涉及cahce算法cache algorithm或者叫替换算法。在java的cache产品中一般叫evict policy。下面我们来看一下常用的cache algorithm。
- 最近最少使用算法 Least Recently Used (LRU):
这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。最直观的结构应该是List,采取的算法是:每次访问一个元素后把这个元素放在List一端,这样一来最远使用的元素自然就被放到List的另一端。每次evict的时候就把那最远使用的元素remove掉。但是现实中常采用的数据结构是HashMap + List。因为List太慢,List只能提供O(n)的算法,要使得它的add,remove和get的算法为O(1)就必须使用HashMap。最简单的实现就是利用JDK自带的LinkedHashMap,你可以把它看作普通的HashMap之外,每个元素的key都用链表连接起来从而实现顺序结构。LinkedHashMap默认的元素顺序是put的顺序,但是如果使用带参数的构造函数,那么LinkedHashMap会根据访问顺序来调整内部顺序。 LinkedHashMap的get()方法除了返回元素之外还可以把被访问的元素放到链表的底端,这样一来每次顶端的元素就是remove的元素。
另外还有其他的cache算法,譬如按照元素自带的过期值expiration和随机random来evict元素的算法。在真正的cache产品中数据结构和算法要比上面描述的要复杂。有些产品自己定义一些数据结构来提高效率,毕竟cache是为了提高效率而产生的。高级的cache产品还可能包括事务机制,JMX和支持cluster环境这样复杂的特性。
- First In, First Out算法
- 最近最多时用算法Most Recently Used (MRU)
- 使用次数最小算法 Least Frequently Used (LFU)
另外还有其他的cache算法,譬如按照元素自带的过期值expiration和随机random来evict元素的算法。在真正的cache产品中数据结构和算法要比上面描述的要复杂。有些产品自己定义一些数据结构来提高效率,毕竟cache是为了提高效率而产生的。高级的cache产品还可能包括事务机制,JMX和支持cluster环境这样复杂的特性。
目前比较主流的cache产品有EHCache,OSCache,SwarmCache和JBoss Cache,很多使用Hibernate的人都对都此有些了解。关于JBoss Cache,它在将来可能被JBoss的另外一个叫infinispan的数据网格平台项目所替代。
作者: 卢声远 <michaellufhl@yahoo.com.cn>
参考:
1: http://en.wikipedia.org/wiki/Cache_algorithms
2: http://docs.jboss.org/jbosscache/2.0.0.GA/JBossCache-UserGuide/en/html_single/
- Java实现cache的基本机制
- JAVA中各类CACHE机制实现的比较
- Java中常用缓存Cache机制的实现
- Java中常用缓存Cache的实现机制详解
- Java 中常用缓存Cache机制的实现
- Java中常用缓存Cache机制的实现 (转载)
- Java 中常用缓存Cache机制的实现
- Java 中常用缓存Cache机制的实现
- Java 中常用缓存Cache机制的实现
- Java 中常用缓存Cache机制的实现
- Java 中常用缓存Cache机制的实现
- Java中常用缓存Cache机制的实现
- Java 中常用缓存Cache机制的实现
- Java 中常用缓存Cache机制的实现
- Java中常用缓存Cache机制的实现
- Java 中常用缓存Cache机制的实现
- Java 中常用缓存Cache机制的实现
- Java 中常用缓存Cache机制的实现
- SQL TRACE File Locations
- GDI+验证码实现
- oracle网络配置(listener.ora/sqlnet.ora/tnsnames.ora)
- ORA-00932: 数据类型不一致: 应为 BLOB, CLOB, 但却获得 CHAR
- zencart如何修改搜索框默认文本
- Java实现cache的基本机制
- asp中 on error resume next的用法
- struts2 tiles 模块异常 花费了我一天的时间
- DrawItem
- Struts2第1天-显示This is my first Struts Application
- CListCtrl, 重载DrawItem函数
- Erlang基本语法一
- 数据库权限控制实现方式(可复用)
- 数据库权限控制实现方式(可复用)