使用Java开发高性能网站(二)

来源:互联网 发布:喵哥成男数据 编辑:程序博客网 时间:2024/06/01 10:19
数据存取

数据库服务器的优化和数据的存取,什么类型的数据放在什么地方更好是值得去思考的问题,将来的存储很可能是混用的,Cache,NOSQL,DFS,DataBase在一个系统上都会有,生活的餐具和平日里穿的衣服都需要摆放在家里,但是不会用同一类型的家具存放,貌似没有哪个人把餐具和衣服放在同一个柜子里面的,这就像是系统中不同类型的数据一样,对不同的数据需要使用核实的存储环境。文件和图片的存储,首先按照访问的热度分类,或者按照文件的大小。强关系类型并且需要事物支持的采用传统的数据库,弱关系不需要事物支持的可以考虑NOSQL,海量文件存储可以考虑一下支持网络存储的DFS,,至于缓存要看你单个数据存储的大小和读写的比例。

还有一点值得注意的就是数据读写分离,无论在DataBase还是NOSQL的环境中大部分都是读大于写,因此在设计时还需考虑不仅仅需要让数据的读分散在多台机器上,还需要考虑多台机器之间的数据一致性,Mysql的一主多从,再加上MySql-Proxy或者借用JDBC中的一些参数(roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster)对后续应用程序开发,可以将读和写分离,将大量读的压力分散在多台机器上,并且还保证了数据的一致性。


缓存
在宏观上看缓存一般分为2种:本地缓存和分布式缓存
1.本地缓存,对于Java的本地缓存而言就是将数据放入静态(static)的数据结合中,然后需要用的时候就从静态数据结合中拿出来,对于高并发的环境建议用ConcurrentHashMap或者CopyOnWriteArrayList作为本地缓存。缓存的使用更具体点来说就是对系统内存的使用,使用多少内存的资源需要有一个适当的比例,如果超过适当的使用存储访问,将会适得其反,导致整个系统运行效率低下。

2.分布式缓存,一般用于分布式的环境,将每台机器上的缓存进行集中化的存储,并且不仅仅用于缓存的使用的范畴,还可以作为分布式系统数据同步/传输的一种手段,一般被使用最多的 就是Memcached和Redis。

数据存储在不同的介质上读/写得到的效率是不同的,在系统中如何善用缓存,让你的数据更靠近cpu,下面有一张图你需要永远牢记在心里,来自Google的技术大牛Jeff Dean(Ref)的杰作,如图所示:
cache-speed

0 0
原创粉丝点击