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串。

转载于:https://www.cnblogs.com/davidwang456/p/5229871.html

php和java的memcached使用的兼容性问题解决过程相关推荐

  1. php java memcached_php和java的memcached使用的兼容性问题解决过程

    4.0. 增加spymemcached依赖 net.spyspymemcached2.12.0 4.1. 配置memcached的ip地址 分别在dev,test,idc,prod的app-confi ...

  2. Dell服务器与IntelX520万兆网卡兼容性问题解决过程

    # lspci | grep 10G 3b:00.0 Ethernet controller: Intel Corporation Ethernet 10G 2P X520 Adapter (rev ...

  3. JVM基本概念,Java编译方式,Javac编译的过程

    JDK.JRE.JVM之间的关系 JVM是Java 程序的运行环境,它包括class类加载器.JIT动态编译器.执行引擎.以及垃圾收集器等,它可以将java程序生成的字节码文件解释成具体系统平台上的机 ...

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

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

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

    HTML`CSS_网站页面不同浏览器兼容性问题解决 参考文章: (1)HTML`CSS_网站页面不同浏览器兼容性问题解决 (2)https://www.cnblogs.com/phoebeyue/p/ ...

  6. Linux入门实践笔记(七)——云服务器中配置Java项目的JMX连接失败问题解决记录

    Linux入门实践笔记(七)--云服务器中配置Java项目的JMX连接失败问题解决记录 参考文章: (1)Linux入门实践笔记(七)--云服务器中配置Java项目的JMX连接失败问题解决记录 (2) ...

  7. 页面在360浏览器下的兼容性问题解决

    页面在360浏览器下的兼容性问题解决 参考文章: (1)页面在360浏览器下的兼容性问题解决 (2)https://www.cnblogs.com/yangykaifa/p/7102497.html ...

  8. iframe在ie和firefox中的高度兼容性问题解决

    iframe在ie和firefox中的高度兼容性问题解决 参考文章: (1)iframe在ie和firefox中的高度兼容性问题解决 (2)https://www.cnblogs.com/haore1 ...

  9. WIN10安装VS2013出现兼容性问题解决

    WIN10安装VS2013出现兼容性问题解决 参考文章: (1)WIN10安装VS2013出现兼容性问题解决 (2)https://www.cnblogs.com/techrich/p/7146016 ...

最新文章

  1. 用Remoting 实现一个文件传输组件
  2. java实现二分查找-两种方式
  3. 如何在ubuntu下安装source insight
  4. iPhone SE 3售价曝光:搭载A15芯片 价格依旧香
  5. Oracle的分区表
  6. Excel用户如何学习数据分析语言DAX?
  7. Corel Painter 2022 for Mac(初学者可驾驭的绘画软件)
  8. 条码标签打印软件如何设置圆形标签
  9. c#html表格样式大全,漂亮的表格样式(使用CSS样式表控制表格样式)
  10. excel流程图分叉 合并_excel流程图怎么画
  11. Bloombox:iPhone陶瓷底座,还能当花盆和扩音器
  12. java开发工程师报名费多少_JAVA软件工程师资格证书 怎么考
  13. 英特尔Atom处理器出货一亿,庆祝上网本CPU三周岁
  14. 深度学习基础实例与总结
  15. Python 之嵌套列表
  16. mysql取消自动登录_腾讯QQ怎么取消QQ宠物自动登录?,你需要学习了
  17. 微信PC版重大更新!电脑上也能玩小游戏了
  18. java将“2018年4月8日”转换成正常日期:2018年04月08日
  19. DisplayFormat格式化字符串
  20. 缓冲区溢出攻击实验(深大计系2实验4)三题思路+答案

热门文章

  1. php300类库,扩展类库 · PHP300FrameWork · 看云
  2. 机械师怎么打开计算机管理,机械师创物者-R笔记本智能控制中心使用教程
  3. mongodb更新数据,查找相同的id,有重复的,就更新。
  4. java获取屏幕图像_Java捕获当前屏幕图像
  5. tp5某个字段相同的数据只取一次_多维分析数据仓库建设建议-面向主题的建模...
  6. c语言 char operator,C语言取模运算符(modulus operator)“%”的作用是什么
  7. This tutorial code needs the xfeatures2d contrib module to be run.
  8. dailykt爬取tushare 数据存入本地mysql
  9. pandas 索引选取和过滤(四)
  10. 118. Leetcode 392. 判断子序列 (动态规划-子序列问题)