`
tedeyang
  • 浏览: 327973 次
  • 性别: 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使用

    总结,danga memcached是一个高效、轻量级的分布式缓存系统,对于提升Web应用性能有着显著作用。理解其工作原理,掌握安装、配置和使用方法,以及通过源码学习,能帮助开发者更好地利用这一工具优化应用性能。

    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

    java_memcached-release_2.5.1.jar Memcache java jar 包

    "danga MemCached"标签可能指的是这个特定版本的客户端库与Danga Interactive的工作有关。`MemCachedManager.java`可能是库中的一个类,用于管理Memcached实例,帮助用户更方便地连接、操作和管理缓存。 这个库的...

    memcached在JAVA中调用的DEMO

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

    memcached使用说明.doc

    import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; public class MyCache { public static void main(String[] args) { MemCachedClient client = new MemCachedClient(); ...

    memcached学习笔记

    然后,可以创建一个 Java 类,使用 MemcachedClient 进行连接和操作。以下是一个简单的示例: ```java import java.util.Date; import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool...

    spring集成memcached

    在选择Memcached客户端时,通常有以下几种选择: 1. **MemcachedClient for Java**:这是一种较早出现的客户端,以其稳定性和广泛应用而著称。 2. **SpyMemcached**:相比于MemcachedClient for Java,它在性能上有...

    Memcached入门(附安装包及测试代码)

    Memcached最初由Danga Interactive开发,其设计目标是提供一个轻量级、高性能的缓存解决方案。它通过在内存中存储数据,避免了磁盘I/O操作,从而提高了数据读取的速度。Memcached支持多语言客户端,包括Java、Python...

    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 ...

    java-memcached-2.6.6.jar

    java-memcached-2.6.6.jar

    memcached客户端(三种客户端)

    MemcachedClient client = new MemcachedClient(pool); // 使用客户端进行操作... } } ``` 2. **Spymemcached 示例**(未提供) 3. **XMemcached 示例**(未提供) 在实际开发中,选择哪个客户端取决于项目...

    Danga Socket

    **Danga Socket** 是一个知名的网络通信库,主要用于构建高性能、可扩展的网络服务。它在IT领域,尤其是Web开发中扮演着重要角色,因为它的设计思路和实现方式对优化服务器端性能有着显著的贡献。Danga Socket是...

    memcached官方jar和一些网上的资料

    Memcached 是一个高性能、分布式的内存对象缓存系统,最初由 Danga Interactive 创建,现已成为许多Web应用程序中的标准组件。它被设计用来减轻数据库的负载,通过将数据存储在内存中,快速响应对这些数据的频繁请求...

    memcached1

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

    java使用memcached的实例

    <bean id="memcachedClient" class="com.danga.MemCached.MemCachedClient"> ... ``` 这段配置指定了Memcached的连接池参数,如服务器地址、初始连接数、最小和最大连接数等,以及客户端的一些特性,如是否...

    Memcached Demo 01.zip

    MemcachedClient client = new MemcachedClient(new InetSocketAddress("localhost", 11211)); ``` 3. **操作缓存**:一旦连接建立,你可以使用客户端提供的方法来操作缓存。例如,存入一个键值对: ```java ...

    memcached安装和使用详细说明

    import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; public class MyCache { public static void main(String[] args) { MemCachedClient client = new MemCachedClient();...

Global site tag (gtag.js) - Google Analytics