论坛首页 Java企业应用论坛

JAVA缓存的实现

浏览 29279 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (6)
作者 正文
   发表时间:2009-12-09   最后修改:2009-12-13
楼主你好
java做缓存的想法
1.内存利用,在windows上2g的大概只能用到1.6g,在Linux上最大的似乎可以用到4g(似乎用不到3g吧),这就注定了内存这一块java做并不合适(32位,64位倒是几乎没有限制)
2.你的内存只是放进去了,可以全部清空,可以根据key清空==,但是放在一个大型的应用里面,难道你需要让所有的程序员都必须知道key,并且在调用dao的方法的时候都要知道那个key先去get(String key)一下么? 这样子不友好吧。
3.在存放形式里面实际上内存还有一个方式是将对象序列化后持久化,也就是说不管什么对象,把它变成二进制,放在库里面,这里面有个好处就是不会涉及到任何的表关联,对库的压力并不大(实际上任何的库,只能切分以后能才会好(大型数据量)),cache的数据库压力肯定比实际数据的数据库压力小。
4.在缓存这一块实际上还有两个小问题-数据同步,你缓存有一个test,但是这个时候数据库被修改了,但是你缓存没变,用户拿出来的就是一个错误的数据,-value可能重复,任何一个重复的value都是无意义的。
5.单机缓存的意义并不大,同理memcached这个单机也米意义,因为他的hashmap每秒响应大概是几万还是多少,但是在本地hashmap可以达到几百万。
6.加油加油,呵呵
0 请登录后投票
   发表时间:2009-12-09  
vvggsky 写道
有些地方同步没用,隐患



是的


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

ehcache是用的hashtable 解决同步, 自己控制是否回收

从来没看见过实际应用  用hashmap的


楼主 有点幻想情节了。
0 请登录后投票
   发表时间:2009-12-09  
倒是 可以看看  weakhashmap   java api号称这个可以做缓存存储, 但也没看见实际应用中 用这个
0 请登录后投票
   发表时间:2009-12-09  
之前有用过apache的lrumap做的缓存.目前看来还是不错的.
详细见这里:www.iteye.com/topic/355396
不过毕竟是jvm中使用,速度快是快,但是量不能太大,而且也不利于分布式应用,
对之后系统扩展来说也是个问题,毕竟要考虑到多个节点的同步问题,所以现在比较倾向于使用外置的缓存系统.比如memcached
0 请登录后投票
   发表时间:2009-12-09  
Java中做缓存

1.考虑并发要用ConcurrentHashMap
2.缓存的值尽量要用WeakReference包装.

0 请登录后投票
   发表时间:2009-12-09  
高并发可选择ConcurrentHashMap,效率是Hashtable、Collections.synchronizedMap的1倍
另外推荐楼主看看HashMap的原理,前2天好像还有人发来着,有助于你重构现在的代码
0 请登录后投票
   发表时间:2009-12-09  
icanfly 写道
个人见解。。。此缓存的作用是先从缓存中取中,如果取出为空,则。。。(查询数据库或是其它的来源)。缓存只是一个高速查询的地方。没太必要做同步控制。如果你已经在查询缓存了,那已经说明这个数据了实时性已经不是那么重要。同步控制可以适当省略一些以提高并发读写。

但是如果我查询的数据和数据库的数据不一致怎么办?不管么?
所以建议
在update或者delete得时候··删除掉缓存中的值
0 请登录后投票
   发表时间:2009-12-10  
说小一点,其实一个数组buf都可以是缓存,比如在文件读写的时候。。
Map用来做缓存是非常不错的,想一些需要单例模式的也可以用map来实现的
0 请登录后投票
   发表时间:2009-12-10  
HashMap---->ConcurrentHashMap
0 请登录后投票
   发表时间:2009-12-10  
hashmap迭代的时候注意点,你这样写会出错
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics