内存缓存 原理 实现

内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查.

代码如下 :

  1. package lhm.hcy.guge.frameset.cache;
  2. import java.util.*;
  3. //Description: 管理缓存
  4. //可扩展的功能:当chche到内存溢出时必须清除掉最早期的一些缓存对象,这就要求对每个缓存对象保存创建时间
  5. public class CacheManager {
  6. private static HashMap cacheMap = new HashMap();
  7. //单实例构造方法
  8. private CacheManager() {
  9. super();
  10. }
  11. //获取布尔值的缓存
  12. public static boolean getSimpleFlag(String key){
  13. try{
  14. return (Boolean) cacheMap.get(key);
  15. }catch(NullPointerException e){
  16. return false;
  17. }
  18. }
  19. public static long getServerStartdt(String key){
  20. try {
  21. return (Long)cacheMap.get(key);
  22. } catch (Exception ex) {
  23. return 0;
  24. }
  25. }
  26. //设置布尔值的缓存
  27. public synchronized static boolean setSimpleFlag(String key,boolean flag){
  28. if (flag && getSimpleFlag(key)) {//假如为真不允许被覆盖
  29. return false;
  30. }else{
  31. cacheMap.put(key, flag);
  32. return true;
  33. }
  34. }
  35. public synchronized static boolean setSimpleFlag(String key,long serverbegrundt){
  36. if (cacheMap.get(key) == null) {
  37. cacheMap.put(key,serverbegrundt);
  38. return true;
  39. }else{
  40. return false;
  41. }
  42. }
  43. //得到缓存。同步静态方法
  44. private synchronized static Cache getCache(String key) {
  45. return (Cache) cacheMap.get(key);
  46. }
  47. //判断是否存在一个缓存
  48. private synchronized static boolean hasCache(String key) {
  49. return cacheMap.containsKey(key);
  50. }
  51. //清除所有缓存
  52. public synchronized static void clearAll() {
  53. cacheMap.clear();
  54. }
  55. //清除某一类特定缓存,通过遍历HASHMAP下的所有对象,来判断它的KEY与传入的TYPE是否匹配
  56. public synchronized static void clearAll(String type) {
  57. Iterator i = cacheMap.entrySet().iterator();
  58. String key;
  59. ArrayList arr = new ArrayList();
  60. try {
  61. while (i.hasNext()) {
  62. java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
  63. key = (String) entry.getKey();
  64. if (key.startsWith(type)) { //如果匹配则删除掉
  65. arr.add(key);
  66. }
  67. }
  68. for (int k = 0; k < arr.size(); k++) {
  69. clearOnly(arr.get(k));
  70. }
  71. } catch (Exception ex) {
  72. ex.printStackTrace();
  73. }
  74. }
  75. //清除指定的缓存
  76. public synchronized static void clearOnly(String key) {
  77. cacheMap.remove(key);
  78. }
  79. //载入缓存
  80. public synchronized static void putCache(String key, Cache obj) {
  81. cacheMap.put(key, obj);
  82. }
  83. //获取缓存信息
  84. public static Cache getCacheInfo(String key) {
  85. if (hasCache(key)) {
  86. Cache cache = getCache(key);
  87. if (cacheExpired(cache)) { //调用判断是否终止方法
  88. cache.setExpired(true);
  89. }
  90. return cache;
  91. }else
  92. return null;
  93. }
  94. //载入缓存信息
  95. public static void putCacheInfo(String key, Cache obj, long dt,boolean expired) {
  96. Cache cache = new Cache();
  97. cache.setKey(key);
  98. cache.setTimeOut(dt + System.currentTimeMillis()); //设置多久后更新缓存
  99. cache.setValue(obj);
  100. cache.setExpired(expired); //缓存默认载入时,终止状态为FALSE
  101. cacheMap.put(key, cache);
  102. }
  103. //重写载入缓存信息方法
  104. public static void putCacheInfo(String key,Cache obj,long dt){
  105. Cache cache = new Cache();
  106. cache.setKey(key);
  107. cache.setTimeOut(dt+System.currentTimeMillis());
  108. cache.setValue(obj);
  109. cache.setExpired(false);
  110. cacheMap.put(key,cache);
  111. }
  112. //判断缓存是否终止
  113. public static boolean cacheExpired(Cache cache) {
  114. if (null == cache) { //传入的缓存不存在
  115. return false;
  116. }
  117. long nowDt = System.currentTimeMillis(); //系统当前的毫秒数
  118. long cacheDt = cache.getTimeOut(); //缓存内的过期毫秒数
  119. if (cacheDt <= 0||cacheDt>nowDt) { //过期时间小于等于零时,或者过期时间大于当前时间时,则为FALSE
  120. return false;
  121. } else { //大于过期时间 即过期
  122. return true;
  123. }
  124. }
  125. //获取缓存中的大小
  126. public static int getCacheSize() {
  127. return cacheMap.size();
  128. }
  129. //获取指定的类型的大小
  130. public static int getCacheSize(String type) {
  131. int k = 0;
  132. Iterator i = cacheMap.entrySet().iterator();
  133. String key;
  134. try {
  135. while (i.hasNext()) {
  136. java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
  137. key = (String) entry.getKey();
  138. if (key.indexOf(type) != -1) { //如果匹配则删除掉
  139. k++;
  140. }
  141. }
  142. } catch (Exception ex) {
  143. ex.printStackTrace();
  144. }
  145. return k;
  146. }
  147. //获取缓存对象中的所有键值名称
  148. public static ArrayList getCacheAllkey() {
  149. ArrayList a = new ArrayList();
  150. try {
  151. Iterator i = cacheMap.entrySet().iterator();
  152. while (i.hasNext()) {
  153. java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
  154. a.add((String) entry.getKey());
  155. }
  156. } catch (Exception ex) {} finally {
  157. return a;
  158. }
  159. }
  160. //获取缓存对象中指定类型 的键值名称
  161. public static ArrayList getCacheListkey(String type) {
  162. ArrayList a = new ArrayList();
  163. String key;
  164. try {
  165. Iterator i = cacheMap.entrySet().iterator();
  166. while (i.hasNext()) {
  167. java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
  168. key = (String) entry.getKey();
  169. if (key.indexOf(type) != -1) {
  170. a.add(key);
  171. }
  172. }
  173. } catch (Exception ex) {} finally {
  174. return a;
  175. }
  176. }
  177. }
  178. package lhm.hcy.guge.frameset.cache;
  179. public class Cache {
  180. private String key;//缓存ID
  181. private Object value;//缓存数据
  182. private long timeOut;//更新时间
  183. private boolean expired; //是否终止
  184. public Cache() {
  185. super();
  186. }
  187. public Cache(String key, Object value, long timeOut, boolean expired) {
  188. this.key = key;
  189. this.value = value;
  190. this.timeOut = timeOut;
  191. this.expired = expired;
  192. }
  193. public String getKey() {
  194. return key;
  195. }
  196. public long getTimeOut() {
  197. return timeOut;
  198. }
  199. public Object getValue() {
  200. return value;
  201. }
  202. public void setKey(String string) {
  203. key = string;
  204. }
  205. public void setTimeOut(long l) {
  206. timeOut = l;
  207. }
  208. public void setValue(Object object) {
  209. value = object;
  210. }
  211. public boolean isExpired() {
  212. return expired;
  213. }
  214. public void setExpired(boolean b) {
  215. expired = b;
  216. }
  217. }
  218. //测试类,
  219. class Test {
  220. public static void main(String[] args) {
  221. System.out.println(CacheManager.getSimpleFlag("alksd"));
  222. //        CacheManager.putCache("abc", new Cache());
  223. //        CacheManager.putCache("def", new Cache());
  224. //        CacheManager.putCache("ccc", new Cache());
  225. //        CacheManager.clearOnly("");
  226. //        Cache c = new Cache();
  227. //        for (int i = 0; i < 10; i++) {
  228. //            CacheManager.putCache("" + i, c);
  229. //        }
  230. //        CacheManager.putCache("aaaaaaaa", c);
  231. //        CacheManager.putCache("abchcy;alskd", c);
  232. //        CacheManager.putCache("cccccccc", c);
  233. //        CacheManager.putCache("abcoqiwhcy", c);
  234. //        System.out.println("删除前的大小:"+CacheManager.getCacheSize());
  235. //        CacheManager.getCacheAllkey();
  236. //        CacheManager.clearAll("aaaa");
  237. //        System.out.println("删除后的大小:"+CacheManager.getCacheSize());
  238. //        CacheManager.getCacheAllkey();
  239. }
  240. }
时间: 2024-11-08 15:33:03

内存缓存 原理 实现的相关文章

内存缓存LruCache实现原理

自己项目中一直都是用的开源的xUtils框架,包括BitmapUtils. DbUtils.ViewUtils和HttpUtils四大模块,这四大模块都是项目中比较常用的.最近决定研究一下xUtils的源码,用了这么久总 得知道它的实现原理吧.我是先从先从BitmapUtils模块开始的.BitmapUtils和大多数图片加载框架一样,都是基于内存-文件-网络三级 缓存.也就是加载图片的时候首先从内存缓存中取,如果没有再从文件缓存中取,如果文件缓存没有取到,就从网络下载图片并且加入内存和文件缓存

[转]JVM 堆内存设置原理

堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定义信息,与垃圾收集器要收集的Java对象关系不大. Heap = { Old + NEW = {Eden, from, to} },Old 即 年老代(Old Generation),New 即 年轻代(Young Generation).年老代和年轻代的划分对垃圾收集影响比较大. 年轻代 所有新生

【MyBatis框架】查询缓存-二级缓存原理

二级缓存原理 1.原理 首先看图 首先开启mybatis的二级缓存. sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到二级缓存中. 如果SqlSession3去执行相同 mapper下sql,执行commit提交,清空该 mapper下的二级缓存区域的数据. sqlSession2去查询用户id为1的用户信息,去缓存中找是否存在数据,如果存在直接从缓存中取出数据. 二级缓存与一级缓存区别,二级缓存的范围更大,多个sqlSession可以共享一个UserMapp

深入了解php opcode缓存原理

什么是opcode opcode(operate code)是计算机指令中的一部分,用于指定要执行的操作,指令的格式和规范由处理器的指定规范指定 opcode是一种php脚本编译后的中间语言,就像java的ByteCode,或者.NET的MSL 为什么要使用opcode缓存 opcode cache的目的是避免重复编译,减少CPU和内存开销的.如果动态内容的性能瓶颈不在于CPU和内容,而在于IO操作,比如数据库查询带来的IO开销,这个时候opcode cache的性能提升是非常有局限的.无论如何

Android内存优化之内存缓存

前言: 上面两篇博客已经讲了图片的基本知识和图片的加载方法及优化,所有的这些优化都是为了避免应用出现OOM这个问题.一个好的应用程序不仅要健壮不能出错还要方便用户使用,对于用户来说你的应用不仅要美观还要流畅,很快的呈现给他想要的.很快的加载图片除了加载的优化外还需要缓存,下面这篇博客将会讲图片缓存. 什么是缓存? 缓存技术原理就是把用户访问的所有对象看作一个全集,经过算法标记哪些是用户经常访问的对象,把这些对象放到一个集合里,这个集合是全集一个子集,下一次用户再访问的时候会先从这个子集集合中查找

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

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

Android 三大图片缓存原理、特性对比

这是我在 MDCC 上分享的内容(略微改动),也是源码解析第一期发布时介绍的源码解析后续会慢慢做的事. 从总体设计和原理上对几个图片缓存进行对比,没用到他们的朋友也可以了解他们在某些特性上的实现. 上篇关于选择开源项目的好处及如何选择开源项目可见:开源项目使用及选型. 一. 四大图片缓存基本信息 Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用. Picasso 是 Square 开源的项目,且他的主导者是 JakeWharton,所以广为人知. Glide

CodeIgniter框架的缓存原理分解

用缓存的目的:(手册上叙述如下,已经写得很清楚了) Codeigniter 支持缓存技术,以达到最快的速度. 尽管CI已经相当高效了,但是网页中的动态内容.主机的内存CPU 和数据库读取速度等因素直接影响了网页的加载速度. 依靠网页缓存,你的网页可以达到近乎静态网页的加载速度,因为他们将程序输出的结果保存到硬盘上了. 如何用: 启用缓存功能,只需要将下面的代码放入你的任何一个控制器(controller)的方法(function)内: $this->output->cache(1); 其中 n

带你了解Android常见的内存缓存算法

带你了解Android常见的内存缓存算法 本片博客主要简介以下两个问题 介绍一下常见的内存缓存算法 怎样实现这些算法 大家应该对ImageLoader这个框架都不陌生吧,一个很强大的图片加载框架,虽然作者去年的时候已经停止维护了,但里面的许多东西还是值得我们去学习的.本篇博客讲解的内存缓存算法正是基于ImageLoader的实现基础之上的 常见的几种缓存算法 (1)LRU即Least RecentlyUsed,近期最少使用算法. 也就是当内存缓存达到设定的最大值时将内存缓存中近期最少使用的对象移