最近实际用起来我发现,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作为客户端,改天试试,呵呵。
分享到:
相关推荐
总结,danga memcached是一个高效、轻量级的分布式缓存系统,对于提升Web应用性能有着显著作用。理解其工作原理,掌握安装、配置和使用方法,以及通过源码学习,能帮助开发者更好地利用这一工具优化应用性能。
Memcache java jar 包 java_memcached-release_2.5.1.jar import com.danga.MemCached.MemCachedClient; import net.spy.memcached.MemcachedClient;
com.danga package 下的 memcached.jar
"danga MemCached"标签可能指的是这个特定版本的客户端库与Danga Interactive的工作有关。`MemCachedManager.java`可能是库中的一个类,用于管理Memcached实例,帮助用户更方便地连接、操作和管理缓存。 这个库的...
memcached在JAVA中调用的DEMO,直接导入项目,无需新建工程。前提是必须按安装memcached,并启动memcached server服务
import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; public class MyCache { public static void main(String[] args) { MemCachedClient client = new MemCachedClient(); ...
然后,可以创建一个 Java 类,使用 MemcachedClient 进行连接和操作。以下是一个简单的示例: ```java import java.util.Date; import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool...
在选择Memcached客户端时,通常有以下几种选择: 1. **MemcachedClient for Java**:这是一种较早出现的客户端,以其稳定性和广泛应用而著称。 2. **SpyMemcached**:相比于MemcachedClient for Java,它在性能上有...
Memcached最初由Danga Interactive开发,其设计目标是提供一个轻量级、高性能的缓存解决方案。它通过在内存中存储数据,避免了磁盘I/O操作,从而提高了数据读取的速度。Memcached支持多语言客户端,包括Java、Python...
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
MemcachedClient client = new MemcachedClient(pool); // 使用客户端进行操作... } } ``` 2. **Spymemcached 示例**(未提供) 3. **XMemcached 示例**(未提供) 在实际开发中,选择哪个客户端取决于项目...
**Danga Socket** 是一个知名的网络通信库,主要用于构建高性能、可扩展的网络服务。它在IT领域,尤其是Web开发中扮演着重要角色,因为它的设计思路和实现方式对优化服务器端性能有着显著的贡献。Danga Socket是...
Memcached 是一个高性能、分布式的内存对象缓存系统,最初由 Danga Interactive 创建,现已成为许多Web应用程序中的标准组件。它被设计用来减轻数据库的负载,通过将数据存储在内存中,快速响应对这些数据的频繁请求...
最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具memcached(当然该工具并不仅仅局限于数据库的缓存)。先简单的介绍下什么是memcached。...
<bean id="memcachedClient" class="com.danga.MemCached.MemCachedClient"> ... ``` 这段配置指定了Memcached的连接池参数,如服务器地址、初始连接数、最小和最大连接数等,以及客户端的一些特性,如是否...
MemcachedClient client = new MemcachedClient(new InetSocketAddress("localhost", 11211)); ``` 3. **操作缓存**:一旦连接建立,你可以使用客户端提供的方法来操作缓存。例如,存入一个键值对: ```java ...
import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; public class MyCache { public static void main(String[] args) { MemCachedClient client = new MemCachedClient();...