打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用Java java_memcached client的陷阱

这2天,才发现之前我们的某个开发人员使用java_memcached-release_2.0.1.jar是有问题的

在我们的某个模块里,需要2个memcached,分别提供不同的服务

于是,开发的人员就从网上粘贴来如下的码,分别生成2个MemcacheUtil类

  1. static {   
  2.     mcc = new MemCachedClient();   
  3.     SockIOPool pool = SockIOPool.getInstance();   
  4.     String[] servers = { "192.168.1.1:11122" };   
  5.     pool.setServers(servers);   
  6.     pool.setInitConn(5);   
  7.     pool.setMinConn(5);   
  8.     pool.setMaxConn(20);   
  9.     pool.setMaxIdle(1000 * 60 * 60 * 6);   
  10.     pool.setMaintSleep(30);   
  11.     pool.setNagle(false);   
  12.     pool.setSocketTO(3000);   
  13.     pool.setSocketConnectTO(0);   
  14.     pool.initialize();   
  15.   
  16.     mcc.setCompressEnable(true);   
  17.     mcc.setCompressThreshold(64 * 1024);   
  18. }  

在2个类里,分别初始化2个不同的mcc,这样做其实是有很大问题的

因为,在初始化MemCachedClient和SockIOPool时,均没有指定对应的name

这样,memcached client会默认生成一个name为default的pool

也就是说,即使你初始化了2个不同server对应的mcc,但实际上只有一个default的pool

这个pool里对应的memcache server完全取决于这2个类的初始化顺序

最后初始化的class,会覆盖掉第一次所用的server

因此,用这样的方式,实际上最后使用的还是其中的某一个memcache server

造成memcache中的数据全部乱掉

正确的方法应该是

  1. SockIOPool pool = SockIOPool.getInstance(poolName);   
  2. ….   
  3. MemCachedClient mcc = new MemCachedClient(poolName);  

初始化时,需要指定唯一的一个poolname,这样就能避免刚才的问题了

另外一个问题就是,用python或其它方式写入memcache中的数据,使用java client无法获取到

再查看了memcache client的源码后,发现了以下2点:

1. 它会默认对要存储的key进行URLEncoder的编码,如会把@给编码成%40

2. 在get调用时,如果没有传递参数asString,则它默认会对取到的value进行它自己的decode

所以,如果要想client能正确的取到没有编码过的数据,则需要

  1. //设置不对key做编码   
  2. mcc.setSanitizeKeys(false);   
  3. //最后一个参数true,表明get时直接返回String,而不进行解码   
  4. mcc.get("aaaaaaa@sohu.com",null,true);  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java的Memcached客户端
memcached搭建缓存系统
分布式缓存MemCache
Memcached安装、使用、与AOP集成
memcached基本操作
缓存-MemCache
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服