? ? ? ?前言:之前项目中,有需求在不同语言开发的服务器之间做数据共享,从而引入了Memcached技术,在实际使用中,Memcached除了作为数据共享的用途外,还用作数据库前段存储。但是,查阅相关资料发现,用java操作Memcached服务器的资料并不是太多,偶尔查到的资料也不能运行,踩了很多坑,因此总结项目中的使用经验,输出基本demo。
? ? ? ?本篇文章重点关注以下问题:
? ? ? ? ?Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。
? ? ? ? ?首先来看一个Memcached的基本使用场景:
? ? ? ?许多Web应用都将数据保存到RDBMS(关系型数据库管理系统)中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。这时就该Memcached大显身手了。Memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。
? ? ? ?总结Memcached的使用特点:
?步骤五:启动Memcached:memcached.exe -d?start,查看是否启动:
?
? ? ? ?由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java。 ?
? ? ? ?XMemcached目前也使用得比较广泛,而且有较详细的中文API文档,具有如下特点:高性 能、支持完整的协议、支持客户端分布、允许设置节点权重、动态增删节点、支持JMX、与Spring框架和Hibernate-memcached的集 成、客户端连接池、可扩展性好等。
先上封装的工具类:
class="java" name="code">package com.wj.MemCachedClient; import java.util.Date; import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; public class MemcachedHelper { // 构建缓存客户端 private static MemCachedClient cachedClient = new MemCachedClient(); // 单例模式实现客户端管理类 private static MemcachedHelper INSTANCE = new MemcachedHelper(); private MemcachedHelper() {} /** * 获取缓存管理器唯一实例 * @param servers 设置缓存服务器列表,当使用分布式缓存的时,可以指定多个缓存服务器。(这里应该设置为多个不同的服务器) * @return */ public static MemcachedHelper getInstance(String[] servers) { // 初始化SockIOPool,管理memcached的连接池 SockIOPool pool = SockIOPool.getInstance(); pool.setServers(servers); pool.setFailover(true); pool.setInitConn(10); // 设置初始连接 pool.setMinConn(5);// 设置最小连接 pool.setMaxConn(250); // 设置最大连接 pool.setMaxIdle(1000 * 60 * 60 * 3); // 设置每个连接最大空闲时间3个小时 pool.setMaintSleep(30); pool.setNagle(false); pool.setSocketTO(3000); pool.setAliveCheck(true); pool.initialize(); return INSTANCE; } public void add(String key, Object value) { cachedClient.set(key, value); } public void add(String key, Object value, int milliseconds) { cachedClient.set(key, value, milliseconds); } public void remove(String key) { cachedClient.delete(key); } @SuppressWarnings("deprecation") public void remove(String key, int milliseconds) { cachedClient.delete(key, milliseconds, new Date()); } public void update(String key, Object value, int milliseconds) { cachedClient.replace(key, value, milliseconds); } public void update(String key, Object value) { cachedClient.replace(key, value); } public Object get(String key) { return cachedClient.get(key); } public static void main(String[] args) { //将对象加入到memcached缓存 cachedClient.add("keke", "This is a test String"); //从memcached缓存中按key值取对象 String result = (String) cachedClient.get("keke"); System.out.println(result); } }
?调用demo:
package com.wj.MemCachedClient; public class Main { public static void main(String[] args) { String[] servers = { "127.0.0.1:11211"}; MemcachedHelper memcachedHelper = MemcachedHelper.getInstance(servers); memcachedHelper.add("key", "value"); String result = (String) memcachedHelper.get("key"); System.out.println(result); } }
package com.wj.spymemcached; import java.io.IOException; import java.net.InetSocketAddress; import net.spy.memcached.MemcachedClient; public class MemcachedHelper { // 缓存客户端 private static MemcachedClient memcacheCient; // Manager管理对象,单例模式 private static MemcachedHelper INSTANCE = new MemcachedHelper(); private MemcachedHelper() {} public static MemcachedHelper getInstance(InetSocketAddress... addresses) { try { memcacheCient = new MemcachedClient(new InetSocketAddress( "127.0.0.1", 11211)); } catch (IOException e) { e.printStackTrace(); } return INSTANCE; } public void add(String key, Object value, int milliseconds) { memcacheCient.add(key, milliseconds, value); } public void add(String key, Object value) { memcacheCient.add(key, 3600, value); } public void remove(String key, int milliseconds) { memcacheCient.delete(key); } public void remove(String key) { memcacheCient.delete(key); } public void update(String key, Object value, int milliseconds) { memcacheCient.replace(key, milliseconds, value); } public void update(String key, Object value) { memcacheCient.replace(key, 3600, value); } public Object get(String key) { return memcacheCient.get(key); } }?下面是调用demo:
package com.wj.spymemcached; import java.net.InetSocketAddress; public class Main { public static void main(String[] args) { InetSocketAddress address = new InetSocketAddress("127.0.0.1", 11211); MemcachedHelper memcachedHelper = MemcachedHelper.getInstance(address); memcachedHelper.add("key1", "value1"); String result = (String) memcachedHelper.get("key1"); System.out.println(result); } }
? ? ? ? ?Xmemcached的官方网址是:http://code.google.com/p/xmemcached/。
? ? ? ? ?尚未研究过,有待后续添加...
?
?
有用的学习网址:http://www.runoob.com/memcached/memcached-tutorial.html