锁定老帖子 主题:JAVA缓存的实现
精华帖 (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.加油加油,呵呵 |
|
返回顶楼 | |
发表时间:2009-12-09
vvggsky 写道 有些地方同步没用,隐患
是的 二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查. ================================== ehcache是用的hashtable 解决同步, 自己控制是否回收 从来没看见过实际应用 用hashmap的 楼主 有点幻想情节了。 |
|
返回顶楼 | |
发表时间:2009-12-09
倒是 可以看看 weakhashmap java api号称这个可以做缓存存储, 但也没看见实际应用中 用这个
|
|
返回顶楼 | |
发表时间:2009-12-09
之前有用过apache的lrumap做的缓存.目前看来还是不错的.
详细见这里:www.iteye.com/topic/355396 不过毕竟是jvm中使用,速度快是快,但是量不能太大,而且也不利于分布式应用, 对之后系统扩展来说也是个问题,毕竟要考虑到多个节点的同步问题,所以现在比较倾向于使用外置的缓存系统.比如memcached |
|
返回顶楼 | |
发表时间:2009-12-09
Java中做缓存
1.考虑并发要用ConcurrentHashMap 2.缓存的值尽量要用WeakReference包装. |
|
返回顶楼 | |
发表时间:2009-12-09
高并发可选择ConcurrentHashMap,效率是Hashtable、Collections.synchronizedMap的1倍
另外推荐楼主看看HashMap的原理,前2天好像还有人发来着,有助于你重构现在的代码 |
|
返回顶楼 | |
发表时间:2009-12-09
icanfly 写道 个人见解。。。此缓存的作用是先从缓存中取中,如果取出为空,则。。。(查询数据库或是其它的来源)。缓存只是一个高速查询的地方。没太必要做同步控制。如果你已经在查询缓存了,那已经说明这个数据了实时性已经不是那么重要。同步控制可以适当省略一些以提高并发读写。
但是如果我查询的数据和数据库的数据不一致怎么办?不管么? 所以建议 在update或者delete得时候··删除掉缓存中的值 |
|
返回顶楼 | |
发表时间:2009-12-10
说小一点,其实一个数组buf都可以是缓存,比如在文件读写的时候。。
Map用来做缓存是非常不错的,想一些需要单例模式的也可以用map来实现的 |
|
返回顶楼 | |
发表时间:2009-12-10
HashMap---->ConcurrentHashMap
|
|
返回顶楼 | |
发表时间:2009-12-10
hashmap迭代的时候注意点,你这样写会出错
|
|
返回顶楼 | |