缓存基础
- 8. 二、缓存种类和例子 第一种 第二种 第三种 第四种 单个对象的缓存 一条记录 , 一个对象 列表缓存 如回帖 ID 列表 第一页,或所有的 长度的缓存 比如一个论坛板块里有多少个帖子,这样才方便实现分页 。 散列的缓存 复杂一点的 group , sum , count 查询,比如一个论坛里按点击数排名的最 HOT 的帖子列表。 数据缓存
- 13. 三、缓存命中率和失效问题 缓存清除策略 1 、 FIFO , first in first out( 先进先出 ) 2 、 LFU , Less Frequently Used( 最少被使用 ) 3 、 LRU , Least Recently Used( 最近最少使用 )
- 17. 四、互动类 cache 模型和代码实例 缓存实现 通过使用容器类型的数据结构(如 map 、 set )把经常需要使用的数据存储到内存中,进行管理;包括数据的查看,同步,删除(过期机制)等。
- 18. 四、互动类 cache 模型和代码实例 代码实例 private void addCacheData(String key, Object data, boolean check) { if (Runtime. getRuntime().freeMemory() < 5L*1024L*1024L) {// 虚拟机内存小于 10 兆,则清除缓存 log.warn("WEB 缓存:内存不足,开始清空缓存! "); removeAllCacheData(); return; } else if(check && cacheMap.containsKey(key)) { log.warn("WEB 缓存: key 值 = " + key + " 在缓存中重复 , 本次不缓存! "); return; } cacheMap.put(key, new CacheData(data)); } 添加数据缓存 private Hashtable cacheMap;// 存放缓存数据 设定存储容器
- 19. 四、互动类 cache 模型和代码实例 代码实例 public Object getCacheData(String key, long intervalTime, int maxVisitCount) { CacheData cacheData = (CacheData)cacheMap.get(key); if (cacheData == null) { return null; } if ( intervalTime > 0 && (System. currentTimeMillis() - cacheData.getTime()) > intervalTime) { removeCacheData(key); return null; } if (maxVisitCount > 0 && (maxVisitCount - cacheData.getCount()) <= 0) { removeCacheData(key); return null; } else { cacheData.addCount(); } return cacheData.getData(); } 取得缓存中的数据
- 20. 四、互动类 cache 模型和代码实例 代码实例 /** * * 移除缓存中的数据 * @param key */ public void removeCacheData(String key) { cacheMap.remove(key); } /** * * 移除所有缓存中的数据 * */ public void removeAllCacheData() { cacheMap.clear(); } 删除数据缓存
- 21. 缓存基础 实例代码延伸 Cache 属性 name : 缓存名称( key ),唯一,索引 maxElementsInMemory : 内存的缓存最大对象数 overflowToDisk : 对象写到基于硬盘的缓存 intervalTime : 过期时间 .... 池管理, socket, hash 算法 , B+tree … . memcached ehcache Cache 产物 oscache ttserver Terracotta Redis ....