您的位置:首页 > 编程语言 > Java开发

java后台数据库同步使用map进行缓存

2016-05-08 08:58 459 查看
几天在看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)完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: