1. 背景:

  php 使用memcached客户端设置一个key,java使用java-memcached-client去读,报错如下:

ERROR|com.whalin.MemCached.MemCachedClient:-1|++++ exception thrown while trying to get object from cache for key: glt7hpcdi1ggo03l9qknu8a755

2. 网上搜索,发现最多的解释:

   在memcached中,不同的客户端在set或者add值时,对命令的第二个参数的使用是不一致的

<command name> <key> <flags> <exptime> <bytes>
<data block>
JAVA客户端flags字段填写的都是32,不是32的是无法通过java客户端get出来的
所以在通过memcached admin进行数据set时,需要显示指定flags值为32
set testkey 32 0 5
12345
如此放入缓存后,通过java客户端是可以取出来的。
 
3. 可选的解决方案,1)从php端设置flag 2)从java端取的时候使用flag 3)使用别的客户端绕过这个障碍 。方案1,php端没有封装php的memcached客户端,调用在系统中随处可见,故该方案不可行,最起码风险比较大,成本高。方案2,研究了一下使用的memcached客户端,没法发现使用flag标示的地方,本身客户端如果自己去写的话,风险也不小。方案3,网上有人提到过使用spy memcached client可以避过,故尝试一下。
4. 解决步骤:
  

4.0. 增加spymemcached依赖

<dependency> <groupId>net.spy</groupId> <artifactId>spymemcached</artifactId> <version>2.12.0</version> </dependency>

4.1. 配置memcached的ip地址

分别在dev,test,idc,prod的app-config.properties文件下添加memcached的ip地址:

dev,test:memcache_ip=192.168.1.10:11211

idc:memcache_ip=172.16.4.10:11211

prod:memcache_ip=172.16.0.10:11211

 

4.2. 配置memcached实例:

app-cached.xml文件增加:

<bean id="springContextHolder" class="com.test.bean.SpringContextHolder" /> <bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean">      <property name="servers" value="${memcache_ip}"/>      <property name="protocol" value="BINARY"/>      <property name="transcoder">        <bean class="net.spy.memcached.transcoders.SerializingTranscoder">          <property name="compressionThreshold" value="1024"/>        </bean>      </property>      <property name="opTimeout" value="1000"/>      <property name="timeoutExceptionThreshold" value="1998"/>      <property name="useNagleAlgorithm" value="false"/>    </bean>

 

4.3. 新增类SpringContextHolder

import java.util.Map;
import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;
/** *  * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext. **/
public class SpringContextHolder implements ApplicationContextAware {
 private static ApplicationContext applicationContext;
 /** *  * 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量. */
 public void setApplicationContext(ApplicationContext applicationContext) {
 SpringContextHolder.applicationContext = applicationContext;
 }
 /** *  * 取得存储在静态变量中的ApplicationContext. */
 public static ApplicationContext getApplicationContext() {
 checkApplicationContext();
 return applicationContext;
 }
 /** *  * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. */
 @SuppressWarnings("unchecked") public static <T> T getBean(String name) {
 checkApplicationContext();
 return (T) applicationContext.getBean(name);
 }
 /** *  * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. *  * 如果有多个Bean符合Class, 取出第一个. */
 @SuppressWarnings("unchecked") public static <T> T getBean(Class<T> clazz) {
 checkApplicationContext();
 Map beanMaps = applicationContext.getBeansOfType(clazz);
 if (beanMaps != null && !beanMaps.isEmpty()) {
 return (T) beanMaps.values().iterator().next();
 } else {
 return null;
 }
 }
 private static void checkApplicationContext() {
 if (applicationContext == null) {
 throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");
 }
 }
}

4.4.增加MemcacheUtil

import com.test.bean.SpringContextHolder;import net.spy.memcached.MemcachedClient;
public class MemcacheUtil {    public static MemcachedClient getMemCachedClient() {        return SpringContextHolder.getBean("memcachedClient");}}

 

4.5 测试代码

public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "classpath:spring-memcached-spy.xml"); MemcachedClient client=MemcacheUtil.getMemCachedClient();  //MemcachedClient client =(MemcachedClient)context.getBean("memcachedClient"); Object obj=client.get("glt7hpcdi1ggo03l9qknu8a755");  System.out.println(obj); }

注意事项:

使用spy memcached客户端,在key-value对中,如果value是对象的话,则读取不到,是string的话则可以读取。故建议使用时key-value约定为string类型。value为对象的话,可以考虑转成json串。

 

php和java的memcached使用的兼容性问题解决过程的更多相关文章

  1. Java操作Memcached

    本文复制其他播客,有好的技术文章希望各位大神能告知... 谢谢. 如何使用Java操作Memcached实例: 代码一: package com.ghj.packageoftool; import j ...

  2. memcached—Java操作Memcached实例

    前面博客介绍了如何在Windows操作系统中安装Memcached,总结一下如何使用Java操作Memcached实例: 代码一: package com.ghj.packageoftool; imp ...

  3. Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

    先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...

  4. Java内存管理的进一步理解-模拟过程图解

    Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区      方法区存放装载的类数据信息包括:      ...

  5. java web eclipse中项目的加载过程

    java web eclipse中项目的加载过程: Tomcat默认从WEB-INF/目录下加载资源,Eclipse在发布程序的时候,并没有把User Libraries的相关资源拷贝到WEB-INF ...

  6. HTML`CSS_网站页面不同浏览器兼容性问题解决

    目前,最为流行的浏览器共有五个:分别是ie,Edge浏览器(属于微软),火狐,谷歌(chrome)Safari和Opera五大浏览器. Trident内核:IE ,360,,猎豹,百度: Gecko内 ...

  7. vmware Horizon 7 与远程桌面(mstsc)兼容性问题解决办法

    关于Horizon 7 Agent与远程桌面(mstsc)兼容性问题解决办法 在Horizon 7环境中,在桌面模板安装了Horizon Agent后,就无法直接通过微软的远程桌面(mstsc)工具连 ...

  8. java代码从出生到执行的过程浅析

    阅读<深入理解java虚拟机 第二版 JVM高级特性与最佳实践> - jdk版本为1.6 1.什么是编译型语言.解释型语言 解释型语言:源代码不是直接翻译成机器语言,而是先翻译成中间代码, ...

  9. Java操作memcached(一)

    Memcached事实上,两次Hash算法    第一次hash算法被用于定位Memcached示例    第二次hash算法是底部HashMap中间hash算法 Hash算法      1.依据余数 ...

随机推荐

  1. Java反序列化漏洞执行命令回显实现及Exploit下载

    原文地址:http://www.freebuf.com/tools/88908.html 本文原创作者:rebeyond 文中提及的部分技术.工具可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使 ...

  2. GO語言視頻教程

    第1课:https://github.com/Unknwon/go-fundamental-programming/blob/master/lectures/lecture1.md Go开发环境搭建h ...

  3. IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)

    转自 http://blog.csdn.net/zzfsuiye/article/details/8251060 概述: 在iOS6之前的版本中,通常使用 shouldAutorotateToInte ...

  4. 在Linq to Entity 中使用lambda表达式来实现Left Join和Join

    1.读取用户和部门两个表的左连接: var sg = db.Users.GroupJoin(db.Departments, u => u.DepartmentId, d => d.Depa ...

  5. 用etckeeper来解救运维工程师

    对于运维工程师来讲,etc环境是一个痛点,各种配置,各种修改,某些软件的配置关联因素过多的话,那就更加痛苦了,改完发现不对再想改回去都千难万难, 现在有一个好的解决方案,那就是用etckeeper,绝 ...

  6. js实现hash

    由于项目中用到了hash,自己实现了一个. Hash = function () { } Hash.prototype = { constructor: Hash, add: function (k, ...

  7. 苹果 Mac OS 下查看系统隐藏文件

    Mac OS X中有很多系统隐藏的信息文件, 一般在Finder中都是看不到,也修改不了的. 但通过在"终端"中输入命令, 就可以在Finder中显示出来: defaults wr ...

  8. .NET 程序在 Windows XP 下调用 SHA512CryptoServiceProvider 方法报 PlatformNotSupportedException 异常

    转自:http://stackoverflow.com/questions/1293905/sha256cryptoserviceprovider-and-related-possible-to-us ...

  9. ARCGIS10.1 GeoDatabase深入理解:客户端连接与退出地理数据库时系统表的初始化

    平台软件:ARCIGS10.1 ,SQL Server2008R2 目的:了解客户端在连接arcgis 空间地理数据库后,地理数据库会做些什么样的初始化工作 准备工作: 1.准备好数据库日志文件查看工 ...

  10. VS替换空行

    visual studio2012 改变了正则表达式的写法 因此原来的不管用了 Old: ^:b*$\n New: ^(?([^\r\n])\s)*\r?$\r?\n Click Ctrl-H (qu ...