Memcached在项目中的应用

Memcached是一个开源的快速分布式缓存框架,它和ehcached等缓存框架相比,具备下面的一些优点: 一、    跨jvm的缓存架。咱们知道,在一个jvm进程中,通常状况下的有效内存利用最多为2G,若是你再把数据缓存在项目的jvm进程中,势必形成内存空间的紧 缺,严重的时候会出现堆栈溢出面致使项目终止运行。 二、    集群环境下的缓存框架。Memcached启动后,有本身的独立IP地址及端口号(默认是11211,固然你能够更改),所以,在集群环境下或不一样的几个 项目间,均可以访问缓存服务器中的数据,很是的方便。 下面咱们一块儿来看一看笔者在最近的一个项目中,是如何使用memached的。 1、安装memcached缓存服务器 若是你用的是windows服务器系统,请到http://jehiah.cz/projects/memcached-win32/下载,点其中的 exe可执行文件,Memcached就完成了启动,很是的简单。 若是你使用的是linux server,你须要以下的操做(以ubuntu为例): $ sudo apt-get install memcached(安装) $ memcached -d -m 50 -p 11211 -u root(启动) 上面命令行参数说明:-m 指定使用多少兆的缓存空间;-p 指定要监听的端口; -u 指定以哪一个用户来运行,默认状况下,会在本机的11211端口监听操做链接,你能够经过netstat –ant查看memcached是否已经正常运行。 你也能够经过修改/etc/default/memcached配置文件,将ENABLE_MEMCACHED=yes,让系统启动时,自动运行 memcached,省去了每次都要手式启动的繁琐步骤。 2、 下载memcached的java访问客户端。下载地址:http://github.com/gwhalin/Memcached-Java- Client/downloads,将压缩包中的java_memcached-release_2.5.1.jar放到你的工程目录中。 若是你是用的PHP,Ruby等,也可在网上找到相应的访问Memcached模块及示例代码。 3、在java程序中的访问。 首 先要强调一下,放入memcached中缓存的对象,必须以键值对(key/value)的方式放入,取的时候根据key来取,但memcached有 几个本身的特殊要求:key必须为String,即字符串类型;而要缓存的对象必需要实现Serializable序列化接口。 本人以前的一个项 目中,当用户将鼠标停留到某个单词上时,系统要弹出该单词的解释及音标,因为项目组在开发时并无 找到一套合适的词库,咱们的解决思路是:当有用户查询时,服务器向第三方翻译网站提交单词,再从返回的结果中解析出单词解释及发音。此查询过程至关费时, 且在网络状态很差时表现不佳,但在当时这也许是最好的解决办法了。 Word对象是咱们封装的单词音标及解释对象,该对象实现 Serializable接口。当用户查询某个单词时,咱们先会在Memcached缓存中查 找,若是没有找到,则向数据库查询,若是数据库中也没有找到,再向第三方翻译网站提交,获得结果后返回给用户后,同时要把该单词存入数据库,同时放入 Memcached缓存,下次有用户查询一样的单词时,效率将会获得很是大的提高。系统获得一个单词翻译的代码以下: public Word getWordTranslate(String aWord) { // 先从缓存中取 Word word = getWordFromCache(aWord); if (word != null) { return word; } //从数据库中取 word = wordDao.getWord(aWord); if (word != null) { //放入缓存 MemcachedAdapter.add(aWord, word);; return word; } //从网上查词 word = translateWordFromWebSite(aWord); if (! "e".equals(tv.getWords())) { //存入数据库 saveWord(word); //放入缓存 MemcachedAdapter.add(aWord, word); } return word; } Memcached操做代码以下,其中的一些链接参数,你能够根据你的状况进行修改。 public class MemcachedAdapter { protected static MemCachedClient mcc = new MemCachedClient(); static { SockIOPool pool = SockIOPool.getInstance(); pool.setServers(new String[]{"127.0.0.1:11211"}); Integer[] weights = { 3 }; pool.setWeights( weights ); pool.setInitConn( 5 ); pool.setMinConn( 5 ); pool.setMaxConn( 250 ); pool.setMaxIdle( 1000 * 60 * 60 * 6 ); pool.setMaintSleep( 30 ); pool.setNagle( false ); pool.setSocketTO( 3000 ); pool.setSocketConnectTO( 0 ); pool.initialize(); } public static Object get(String key) { return mcc.get(key); } public static boolean set(String key, Object o) { return mcc.set(key, o); } public static boolean add(String key, Object o) { return mcc.add(key, o); } public static boolean replace(String key, Object o) { return mcc.replace(key, o); } public static boolean delete(String key) { return mcc.delete(key); } } 项目上线前,咱们对单词翻译部分进行了压力测试,在不少用第一次查询某个单词的时候,速度很慢,但系统运行一段时候后,因为经常使用单词都在Memcached中 进行了缓存,速度上就基本就存在问题了。 最后还有一个问题要考虑,就是在操做系统从新启动后,Memcached中缓存的数据将再也不存在,为了效率考虑,你能够在应用服务器启动时,将全部的单词 对象所有读出,再添加到Memcahced中。
相关文章
相关标签/搜索