memcached 使用 java_使用Java java_memcached client的陷阱

本文揭示了在Java中使用memcached时常见的错误做法,即不指定pool name导致的内存缓存混乱问题,以及Java客户端默认编码key和解码value的影响。解决方案是为每个MemcachedClient实例指定唯一的pool name,并调整get操作的行为。此外,还指出Python等其他语言写入的数据可能无法被Java客户端正确读取,需要了解并适配客户端的编码规则。
摘要由CSDN通过智能技术生成

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

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

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

static {

mcc=newMemCachedClient();

SockIOPoolpool=SockIOPool.getInstance();

String[]servers= { "192.168.1.1:11122" };

pool.setServers(servers);

pool.setInitConn(5);

pool.setMinConn(5);

pool.setMaxConn(20);

pool.setMaxIdle(1000 * 60 * 60 * 6);

pool.setMaintSleep(30);

pool.setNagle(false);

pool.setSocketTO(3000);

pool.setSocketConnectTO(0);

pool.initialize();

mcc.setCompressEnable(true);

mcc.setCompressThreshold(64 * 1024);

}

在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中的数据全部乱掉

正确的方法应该是

SockIOPool pool = SockIOPool.getInstance(poolName);

….

MemCachedClientmcc=newMemCachedClient(poolName);

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

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

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

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

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

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

//设置不对key做编码

mcc.setSanitizeKeys(false);

//最后一个参数true,表明get时直接返回String,而不进行解码

mcc.get("aaaaaaa@sohu.com",null,true);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值