看了一些缓存的东西,但是我有些不明白的地方,向大家请教,比如现在有很多缓存解决方案,诸如oscache,ehcache等等,我使用过,主要是用来往磁盘持久化的,但是我看了很多的介绍,大多作为内存的缓存,包括apache的对象池等,我疑惑的内存的缓存,可以放在数组中或者容器中(list,map)这样可以满足内存的缓存啊!为什么那么多的框架还需要提供解决方案呢?请各位给一个让我明白或者恍然大悟的答案!谢谢各位高手了!
关于这个问题要看你应用的场合,如果你的系统比较小,只一台服务器就能搞定,不需要分布式的,所要求的缓存也比较小,一台机器就有搞定,那你用map就行了,没必要用其它的缓存系统,用其它的缓存系统,反而效率更低。
如果你的系统比较大,有多台服务器要需去共享缓存中的数据,那么你的缓存系统就需要基于网络连接方式完成服务,最好支持分布式,将来可以方便的扩展缓存大小,并且这些缓存系统提供了缓存的策略,无需你去释放内存,也不会存在内存溢出和内存泄露的问题。
缓存系统都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,缓存系统可以大大降低数据库压力,使系统执行效率提升。
另外,缓存系统也经常作为服务器之间数据共享的存储媒介,例如在SSO系统中保存系统单点登陆状态的数据就可以保存在缓存系统中,被多个应用共享。
数组中或者容器中(list,map),查找的时候的速度还是不够快吧。
如果容器不够大的话缓存是需要删除的
删除规则很复杂
也容易内存泄露
简单来说一下
故事的背景是这样的:
1.缓存可以提高服务效率,所以缓存经常被使用,而且缓存的东东可能会很大;
2.这么大的东东都憋在服务器内存里,会增加服务器的成本,和维护压力;
3.要是每台服务器都这么搞,就相当于每台服务器上都做了个缓存的副本,这些副本的内容可能会重复,不利于数据的共享和缓存命中率的提高。
如果把缓存东东的这块大内存抽出来,由一台或一集群的专门的服务器来维护,这个世界就清净了。
其实这些XXcache,主要干的事情大概就是这样,在身怀巨大内存的服务器上,提供一个巨大的map,给其他服务器通过key-value的形式来存取对象。这样可能会增加一些网络调用成本,但因为这个map一般是在内存里维护的,所以速度也不会慢的令人发指。而这么做的好处,我列了一下主要有这么几点吧:
1.集中管理内存。不需要在所有应用服务器上都整这么一套东东,配备那么大的内存等,它们就可以专注于做好自己的业务了。
2.实现内存的共享,提高缓存命中率。
3.提高缓存的稳定性。缓存数据不会因为某台应用服务器挂掉而丢失。当然,如果是缓存服务器挂了,缓存的东东还是会没了的。不过反正是缓存的,正版的还在数据库里存着呢,从新缓存就好。
4.其他的应该还有,夜深了,就不列了。。。
这部分我也想看看各种解答