使用Java java_memcached client的陷阱
来源:互联网 发布:淘宝的奇葩商品 编辑:程序博客网 时间:2024/04/29 06:55
使用Java java_memcached client的陷阱
[来自]http://www.51yu.cn/post/196/这2天,才发现之前我们的某个开发人员使用java_memcached-release_2.0.1.jar是有问题的
在我们的某个模块里,需要2个memcached,分别提供不同的服务
于是,开发的人员就从网上粘贴来如下的码,分别生成2个MemcacheUtil类
折叠复制代码
- static {
- mcc = new MemCachedClient();
- SockIOPool pool = 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);
- ....
- MemCachedClient mcc = new MemCachedClient(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);
- 使用Java java_memcached client的陷阱
- Java SubList的使用陷阱
- java中sublist的使用陷阱
- 使用Java处理除法运算的陷阱
- Java WeakHashMap使用陷阱
- memcached Client在java方面的使用
- fastdfs-client-java工具类的使用
- StringBuffer的使用陷阱
- QWT的使用陷阱
- daemon 的使用陷阱
- 使用nuget的陷阱
- SwipeBackLayout的使用陷阱
- goroutine的使用陷阱
- goroutine的使用陷阱
- Java replaceAll的陷阱
- java除法的陷阱
- java renameto的陷阱
- java i++的陷阱
- 几篇好的设计心理和认知分析文章
- swt 用tabFolder进行模块分离(简单的框架)
- 在X86 PC上安装Mac Snow Leopard 10.6.2经历
- boa嵌入式移植
- boa配置文件解析
- 使用Java java_memcached client的陷阱
- 加入收藏与设为首页的设置。
- 基于投影方法的碰撞检测以及一个测试DEMO【C + SDL】
- 关于GROUP BY 的一种用法
- 华为交换机做镜像抓包
- 我个人关于研究生发文章的总结,对研一,研二很有用(转自小木虫)
- C + SDL 贪吃蛇的基础实现
- XML传输图片数据-Base64编码
- SDL和OpenGL的完美组合。终于合体了。但是坐标系还是有问题。