设为首页 收藏本站
查看: 775|回复: 0

[经验分享] java客户端提交数据到memcached方法memcached+java+client个人总结

[复制链接]

尚未签到

发表于 2015-8-31 12:37:49 | 显示全部楼层 |阅读模式
  尊重作者辛勤劳动,转载请注明!
  (2013-3-22续)本人新用simple-spring-memcached配置在spring-mvc中,感觉非常方便,有兴趣的朋友可以去看看
  (2013-4-9续)本人信用spring-aop + memcached配置memcached的更新操作,存取list<bean>,更实际使用,点击这里
  (2013-4-10续 本人实现了不用数据库临时表的方法,见 利用Spring AOP 更新memcached 缓存策略的实现(二))
  2013-4-28续 spring配置xmemcached及使用

  终于把nginx+memcached+tomcat集群windows下布置完成,但是遇到java客户端提交数据到memcached的问题,上网看了好多人的帖子,发现了3种方法
  1. 三种API比较
1)      memcached client for java
  较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。
  
2)      spymemcached
  A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。
  
3)      xmemcached
  XMemcached 同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接池,而nio仅需要一个连接即可(当然,nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此 XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比 Spymemcached的表现更为优秀,具体可以看这个Java Memcached Clients Benchmark。
  
2.  建议
  由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java。
  XMemcached 也使用得比较广泛,而且有较详细的中文API文档,具有如下特点:高性能、支持完整的协议、支持客户端分布、允许设置节点权重、动态增删节点、支持 JMX、与Spring框架和Hibernate-memcached的集成、客户端连接池、可扩展性好等。
  我使用的是建议方法memcached client for java,
  Memcached-Java-Client官网jar包的下载地址:
  https://github.com/gwhalin/Memcached-Java-Client/downloads
  Memcached-Java-Client的说明文档:
  https://github.com/gwhalin/Memcached-Java-Client
  具体实现步骤为:
  1.将jar包引入项目中,我引入了4个commons-pool-1.5.6.jar,java_memcached-release_2.6.2.jar,slf4j-api-1.6.1.jar,slf4j-simple-1.6.1.jar
  2.写测试代码:



import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

/**
* 使用memcached的缓存实用类.
*
* @author 原作者:铁木箱子  完善:周枫
*
*/
public class MemCached
{
// 创建全局的唯一实例
protected static MemCachedClient mcc = new MemCachedClient();
protected static MemCached memCached = new MemCached();
// 设置与缓存服务器的连接池
static {
// 服务器列表和其权重,个人memcached地址和端口号
String[] servers = {"192.168.88.137:11211"};
Integer[] weights = {3};
// 获取socke连接池的实例对象
SockIOPool pool = SockIOPool.getInstance();
// 设置服务器信息
pool.setServers( servers );
pool.setWeights( weights );
// 设置初始连接数、最小和最大连接数以及最大处理时间
pool.setInitConn( 5 );
pool.setMinConn( 5 );
pool.setMaxConn( 250 );
pool.setMaxIdle( 1000 * 60 * 60 * 6 );
// 设置主线程的睡眠时间
pool.setMaintSleep( 30 );
// 设置TCP的参数,连接超时等
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setSocketConnectTO( 0 );
// 初始化连接池
pool.initialize();

}
/**
* 保护型构造方法,不允许实例化!
*
*/
protected MemCached()
{
}
/**
* 获取唯一实例.
* @return
*/
public static MemCached getInstance()
{
return memCached;
}
/**
* 添加一个指定的值到缓存中.
* @param key
* @param value
* @return
*/
public boolean add(String key, Object value)
{
return mcc.add(key, value);
}
public boolean add(String key, Object value, Date expiry)
{
return mcc.add(key, value, expiry);
}
/**
* 替换一个指定的值到缓存中.
* @param key
* @param value
* @return
*/
public boolean replace(String key, Object value)
{
return mcc.replace(key, value);
}
public boolean replace(String key, Object value, Date expiry)
{
return mcc.replace(key, value, expiry);
}
/**
* 删除一个指定的值到缓存中.
* @param key
* @param value
* @return
*/
public boolean delete(String key)
{
return mcc.delete(key);
}

/**
* 根据指定的关键字获取对象.
* @param key
* @return
*/
public Object get(String key)
{
return mcc.get(key);
}
public static void main(String[] args)
{
MemCached cache = MemCached.getInstance();
//cache.add("zf", 18);
//cache.replace("zf", 19);
cache.delete("zf");
System.out.println("zf get value : " + cache.get("zf"));
}
}

  3.测试阶段
  1)取消cache.add("zf",18)注释,将cache.replace("zf", 19);和cache.delete("zf");注释掉,增加zf到memcached中
  2)将cache.add("zf",18);cache.replace("zf", 19);和cache.delete("zf");注释,输出结果为刚才添加的内容,表示该值已经存入memcached中
  3) 将cache.delete("zf");取消注释,再运行,控制台输出 zf get value : null,该值已删除
  其他测试方法:
  使用telnet命令语句查看:
  1)cmd中输入telnet 192.168.88.137 11211(自己memcached地址及端口号)
  2)输入命令stats,查看 STAT curr_items 数量,增加、修改、删除此数量随之变化
  具体memcached输入stats命令解释如下:(转载:http://www.cnblogs.com/suger/archive/2011/09/06/2168319.html)


  STAT pid 1552
  STAT uptime 3792
  STAT time 1262517674
  STAT version 1.2.6
  STAT pointer_size 32
  STAT curr_items 1
  STAT total_items 2
  STAT bytes 593
  STAT curr_connections 2
  STAT total_connections 28
  STAT connection_structures 9
  STAT cmd_get 3
  STAT cmd_set 2
  STAT get_hits 2
  STAT get_misses 1
  STAT evictions 0
  STAT bytes_read 1284
  STAT bytes_written 5362
  STAT limit_maxbytes 67108864
  STAT threads 1
  END
  这里显示了很多状态信息,下边详细解释每个状态项:
  1.  pid: memcached服务进程的进程ID
  2.  uptime: memcached服务从启动到当前所经过的时间,单位是秒。
  3.  time: memcached服务器所在主机当前系统的时间,单位是秒。
  4.  version: memcached组件的版本。这里是我当前使用的1.2.6。
  5.  pointer_size:服务器所在主机操作系统的指针大小,一般为32或64.
  6.  curr_items:表示当前缓存中存放的所有缓存对象的数量。不包括目前已经从缓存中删除的对象。
  7.  total_items:表示从memcached服务启动到当前时间,系统存储过的所有对象的数量,包括目前已经从缓存中删除的对象。
  8.  bytes:表示系统存储缓存对象所使用的存储空间,单位为字节。
  9.  curr_connections:表示当前系统打开的连接数。
  10. total_connections:表示从memcached服务启动到当前时间,系统打开过的连接的总数。
  11. connection_structures:表示从memcached服务启动到当前时间,被服务器分配的连接结构的数量,这个解释是协议文档给的,具体什么意思,我目前还没搞明白。
  12. cmd_get:累积获取数据的数量,这里是3,因为我测试过3次,第一次因为没有序列化对象,所以获取数据失败,是null,后边有2次是我用不同对象测试了2次。
  13. cmd_set:累积保存数据的树立数量,这里是2.虽然我存储了3次,但是第一次因为没有序列化,所以没有保存到缓存,也就没有记录。
  14. get_hits:表示获取数据成功的次数。
  15. get_misses:表示获取数据失败的次数。
  16. evictions:为了给新的数据项目释放空间,从缓存移除的缓存对象的数目。比如超过缓存大小时根据LRU算法移除的对象,以及过期的对象。
  17. bytes_read:memcached服务器从网络读取的总的字节数。
  18. bytes_written:memcached服务器发送到网络的总的字节数。
  19. limit_maxbytes:memcached服务缓存允许使用的最大字节数。这里为67108864字节,也就是是64M.与我们启动memcached服务设置的大小一致。
  20. threads:被请求的工作线程的总数量。这个解释是协议文档给的,具体什么意思,我目前还没搞明白。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-106813-1-1.html 上篇帖子: 由Memcached使用不当而引发性能问题的两个经验总结 下篇帖子: net下Memcached简介使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表