`
tedeyang
  • 浏览: 317908 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

danga的MemcachedClient的几个缺陷

阅读更多

最近实际用起来我发现,java版danga的memcached客户端有一些问题,

记录如下:

1,set方法直接用Date对象设置过期时间

   memcached协议规定过期时间是个long值,如果n小于30天的秒数则表示该数据会在n秒后过期,否则n是unix时间。

   在danga的客户端中,接口直接用Date对象来设置时间,不但绕了一圈,还带来一个严重的问题:无法应对memcached服务器与客户端jvm的时间不同步的情况!而本来我直接用过期秒数就很方便,无需考虑时间同步。

这个很要命。

属于严重的设计缺陷。

2010年9月30日补充 :有同事说可以用 new Date(300)这样的形式,设置出来的结果就是过期秒数。老实说,这种技巧是不应该被发现的。

 

2,incr,decr,counter方法没有过期时间参数。

 这个也属于设计缺陷。

 这使得用memcached无法保持那种需要具有实效的计数器。

 某些场合,譬如记录用户的错误登录次数,我需要隔断时间就清零,danga限制我这么干。

 当然,我们可以用set先存储一个Long值来绕过这个限制,但这会同时带来另一个问题:默认的MemcachedClient在序列化基本数据类型时用了特殊的格式(NativeHandler,带来的问题就是存储的数据只能由java client来解析),因此数字在memcached服务器中无法使用incr,decr命令。

看了源码,我发现memcachedclient有个属性primitiveAsString可以控制这个序列化选择。万幸,把它设为true,我绕过去了。

 

官方网站推荐用spymemcached作为客户端,改天试试,呵呵。

 

 

 

 

2
0
分享到:
评论
4 楼 xin_hany 2014-08-01  
提示惊醒了一下,解决了一个让人惆怅的问题,
3 楼 linzx0212 2012-08-29  
受教了……
2 楼 jsjzhou 2011-10-22  
superjava 写道
最近在看MemCachedClient,在具体使用时,遇到一个大麻烦,不知道是缺陷问题还是我使用的问题。
问题的来由是这样的的,我试图通过MemCachedClient和一个扩展的Session管理器把tomcat里面的session保存到Memcached,再取出,来实现session的集中管理。
经过测试,总是发现程序取不到对象【确切地说是能够取得简单对象,而自定义对象则取不到】后来经过分析和测试,发现自定义对象的jar包放在webapps/ROOT/WEB-INF/lib下则取不到,但是如果把jar移到【不是复制到】tomcat/lib下则能够获取到。

后来看了早期的源码0.9.0
http://code.sixapart.com/trac/memcached/browser/trunk/api/java/com/danga/MemCached/MemCachedClient.java?rev=143

706         if (!forceserial && (value.getClass() == String.class ||
707         value.getClass() == Double.class ||
708         value.getClass() == Float.class ||
709         value.getClass() == Integer.class ||
710         value.getClass() == Long.class ||
711         value.getClass() == Byte.class ||
712         value.getClass() == Short.class)) {
713             val = value.toString().getBytes();

## 当我看到value.getClass()的时候,我似乎明白了为什么,因为Session管理器是在tomcat这一层在运行,此时它是无法import到webapps下面的lib中的jar的,所以在getClass的时候就异常了,即把value值丢失,这样client就无法获取我放进去的session了。


可是当我看2.5.1的源码时,set方法压根没有这一段,那原因是什么呢??
不知道博主有没有研究这个。


针对一楼的情况, 我说说我的想法. 由于加载tomcat服务器自身的类的类加载和加载Web应用的类加载器不同. Web应用的类加载机制很多时候是违背双亲委派原则的. 你可以研究下tomcat类加载机制.
1 楼 superjava 2011-03-04  
最近在看MemCachedClient,在具体使用时,遇到一个大麻烦,不知道是缺陷问题还是我使用的问题。
问题的来由是这样的的,我试图通过MemCachedClient和一个扩展的Session管理器把tomcat里面的session保存到Memcached,再取出,来实现session的集中管理。
经过测试,总是发现程序取不到对象【确切地说是能够取得简单对象,而自定义对象则取不到】后来经过分析和测试,发现自定义对象的jar包放在webapps/ROOT/WEB-INF/lib下则取不到,但是如果把jar移到【不是复制到】tomcat/lib下则能够获取到。

后来看了早期的源码0.9.0
http://code.sixapart.com/trac/memcached/browser/trunk/api/java/com/danga/MemCached/MemCachedClient.java?rev=143

706         if (!forceserial && (value.getClass() == String.class ||
707         value.getClass() == Double.class ||
708         value.getClass() == Float.class ||
709         value.getClass() == Integer.class ||
710         value.getClass() == Long.class ||
711         value.getClass() == Byte.class ||
712         value.getClass() == Short.class)) {
713             val = value.toString().getBytes();

## 当我看到value.getClass()的时候,我似乎明白了为什么,因为Session管理器是在tomcat这一层在运行,此时它是无法import到webapps下面的lib中的jar的,所以在getClass的时候就异常了,即把value值丢失,这样client就无法获取我放进去的session了。


可是当我看2.5.1的源码时,set方法压根没有这一段,那原因是什么呢??
不知道博主有没有研究这个。

相关推荐

    danga memcached使用

    NULL 博文链接:https://sharron5.iteye.com/blog/794600

    memcached_net.spy_com.danga JAR

    Memcache java jar 包 java_memcached-release_2.5.1.jar import com.danga.MemCached.MemCachedClient; import net.spy.memcached.MemcachedClient;

    memcached.jar

    com.danga package 下的 memcached.jar

    memcached在JAVA中调用的DEMO

    memcached在JAVA中调用的DEMO,直接导入项目,无需新建工程。前提是必须按安装memcached,并启动memcached server服务

    memcached-2.4.2.jar memcached-2.4.2.jar

    import com.danga.MemCached.*; import java.util.Date; public class MemCached { protected static MemCachedClient mcc; protected static Logger log; protected static MemCached memCached = new ...

    memcached1

    最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具memcached(当然该工具并不仅仅局限于数据库的缓存)。先简单的介绍下什么是memcached。...

    java-memcached-2.6.6.jar

    java-memcached-2.6.6.jar

    java_memcached-release_2.5.1.jar Memcache java jar 包

    Memcache java jar 包 java_memcached-release_2.5.1.jar

    C#使用memCached实现缓存

     Memcached由Danga Interactive开发,其最新版本发布于2010年,作者为Anatoly Vorobey和Brad Fitzpatrick。用于提升LiveJournal . com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大...

    memcached-library, 一个与Memcached缓存系统接口的CodeIgniter库.zip

    memcached-library, 一个与Memcached缓存系统接口的CodeIgniter库 用于CodeIgniter的#Memcached 库##Description这个库是为了帮助一个基于CodeIgniter的项目与 1或者更多的Memcached服务器( ...

    Memcached内存对象缓存

    Memcached由Danga Interactive开发,其最新版本发布于2010年,作者为Anatoly Vorobey和Brad Fitzpatrick。用于提升LiveJournal . com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大...

    Danga Socket

    memcached的官方客户端,就是基于这个Socket组件的

    memcached安装及java应用使用memcached

    NULL 博文链接:https://da-zhuang.iteye.com/blog/2234078

    Memcached缓存资料

    memcached是一套分布式的快取系统,当初是Danga Interactive为了LiveJournal所发展的,但被许多软件(如MediaWiki)所使用。这是一套开放源代码软件,以BSD license授权协议发布。[1] memcached缺乏认证以及安全...

    分布式缓存Memcached实例

    Memcached是什么? Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

    memcached-1.2.4源代码

    Memcached是高性能的,分布式的...Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。

    memcached-win64-1.4.4-14.rar

    Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。 Memcached是一种基于...

    Memcached深度分析.docx

    关于这个东西,相信很多人都用过,本文意在通过对memcached的实现及代码分析,获得对这个出色的开源软件更深入的了解,并可以根据我们的需要对其进行更进一步的优化。末了将通过对BSM_Memcache扩展的分析,加深对...

    hibernate-memcached, 在Hibernate中,使用Memcached作为第二级分布式缓存的库.zip

    hibernate-memcached, 在Hibernate中,使用Memcached作为第二级分布式缓存的库 休眠 memcachedHibernate中使用...基于优秀的spymemcached客户端包含对 Whalin ( danga ) memcached客户端的支持支持实体和查询缓存。帮

    集中式缓存系统 memcached.zip

    集中式缓存系统 memcached ,memcached是一套分布式的快取系统,当初是Danga Interactive为了LiveJou...

Global site tag (gtag.js) - Google Analytics