map同步数据库/后台缓存

来源:互联网 发布:淘宝商品如何做图 编辑:程序博客网 时间:2024/05/16 07:38

几天在看ehcache的时候看到一个问答,里面回答的对我非常有帮助,这里摘抄一下

 package com.cto.caches;      import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /**  * 缓存单例  * <a href="http://home.51cto.com/index.php?s=/space/1269642" target="_blank">@author</a> wangzp  *  */ public class MapCache {         /**          * 缓存Map          */         private static Map<String, String> cache;         private MapCache(){                 if (cache == null){                         cache = new ConcurrentHashMap<String, String>();                 }         }                      private static class MapCacheHandler{                 private static MapCache instance = new MapCache();         }                       public static MapCache getInstance(){                 return MapCacheHandler.instance;         }                       public void put(String key, String value){                 cache.put(key, value);         } } package com.cto.caches; /**  * 这里不具体实现,仅仅写个模式  * <a href="http://home.51cto.com/index.php?s=/space/1269642" target="_blank">@author</a> wangzp  *  */ public class UserDao {              public void addUser(Object o){                 /** 在你更新(添加、删除、修改操作中) **/                 // super.save(o);                                       /** 完成了更新操作 ,将数据放置到缓存中,key和value来自于o中**/                 MapCache.getInstance().put("", "");                                       // 这样的话,就达到了数据库操作完成之后,同步更新到缓存中         } }

我写的比较简单,当然缓存仅仅用Map不用单例也是可以的;你首先要理解一点,就是缓存是数据java的,也就JVM管理的(当然也可以是其他的缓存机制),一般不外乎就是List、Set、Map,所谓的同步就是保持与元数据一致,你的元数据就是数据库数据,那么在数据更新操作完成之后,你把相应的数据,也映射到缓存中就实现了同步。
缓存一般做法:
1、一次查询(不要每次查询的结果都存放在Map中)
2、缓存更新(同步、异步)
3、防止内存泄漏,往往会定期更新缓存(即:清空缓存,重写导入数据到缓存中)

至于更加高级的缓存,例如Hibernate的自带缓存,或者第三方缓存,那就得根据人家的文档来了。

同步和异步:
1、同步:所谓的同步,以两个事务为例(A,B),假设B依赖于A,那么在A完成之后,B马上执行,所以你在数据库操作完成之后,应该马上处理缓存,保持数据一致;
2、异步:与同步相反,A完成了,可以延迟一段时间,或者交由其他方式调用(通知B)完成。

0 0