danga的MemcachedClient的几个缺陷

转自:http://hitery.iteye.com/blog/734639

最近实际用起来我发现,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作为客户端,改天试试,呵呵。

时间: 2024-12-27 00:17:57

danga的MemcachedClient的几个缺陷的相关文章

NoSQL之Memcached

一.Memcached概念 Memcached是NoSQL产品之一,是一个临时性键值存储NoSQL数据库,过去被大量使用在互联网网站中,作为应用和数据库之间的缓存层,大大提高查询和访问速度. Memcached有以下特点: 1.全内存运转:数据从来不保存在硬盘中,机器一重启,数据就全部没有了,所有又称临时性数据库: 2.哈希方式存储: 3.简单文本协议进行数据通信:不需要特定二进制代码,只需要用telnet连通memcached的监听端口,打入简单浅显的代码就能操作: 4.只操作字符型数据:无论

Spring集成memcached的详细介绍

前提条件:工程需要引入jar包java_memcached-release_2.0.1.jar 第一步:添加memcached的配置文件. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIE

java版本的memcache静态化

import java.util.Date;import java.util.Map; import com.danga.MemCached.MemCachedClient;import com.danga.MemCached.SockIOPool; public class MemcachedUtil { // 创建全局的唯一实例 protected static MemCachedClient mcc = new MemCachedClient(); protected static Mem

windows+nginx+memcached+tomcat做负载均衡

首先,我们明确目标,做Tomcat集群的目的是为了提供更高的负载能力,把访问均摊到不同的服务器上. 直观地来说,就是访问test.localhost.com时,nignx会随机将访问请求分发到tomcat1,tomcat2,为了保持session同步,使用memcached去管理session. 为此我们准备的配置清单是: windows x 1 nginx x 1 memcached x 1 tomcat x 2 mysql x 1 部署的架构图如下: 首先,我准备了一个Java Web项目.

Memcache缓存系统构建一

在如今这个高效率的社会中,怎样将这个高效率应用到自己的程序中,是一个值得追寻和值得探讨的问题.因为这个memcache能够很好的提高检索速度,提升用户体验,而且重要的是减少数据库的访问.这就大大的提高了整个应用系统的档次.因此,在应用程序的开发中加入这样的一个技术无疑是给自己的程序锦上添花.瞬间就会显得高大上,像现在很多的web应用,都将一些基础信息直接放到远程缓存系统中,而且该缓存中的key的有效时间也是可以进行任意设定的.这就显得更加人性化,用起来更加方便!好了,废话不多说,实践是检验真理的

Memcached的安装与使用

Windows下的Memcache安装 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached 2. 在终端(也即cmd命令界面)下输入 c:\memcached\memcached.exe -d install            --安装memcached成为服务,这样才能正常运行,否则运行失败! 3. 再输入: c:\memcached\memcached.exe -d start    --启动memcached的. 以后memcached将

Memcached安装与配置

?memcached是danga.com的一个项目.它是一款开源的高性能的分布式内存对象缓存系统.最早是给LiveJournal提供服务的.后来逐渐被越来越多的大型站点所採用.用于在应用中减少对数据库的訪问.提高应用的訪问速度.并减少数据库的负载. ?为了在内存中提供数据的快速查找能力,memcached使用key-value形式存储和訪问数据.在内存中维护一张巨大的HashTable.使得对数据查询的时间复杂度减少到O(1),保证了对数据的高性能訪问.内存的空间总是有限的,当内存没有很多其它的

Java使用memcached

1.加载commons-pool-1.5.6.jar.java_memcached-release_2.6.6.jar.slf4j-api-1.6.1.jar.slf4j-simple-1.6.1.jar 2.创建memcached工具类: [java] view plaincopy public class MemcachedUtil { /** * memcached客户端单例 */ private static MemCachedClient cachedClient = new MemC

memcached使用文档

使用memcached进行内存缓存 通常的网页缓存方式有动态缓存和静态缓存等几种,在ASP.NET中已经可以实现对页面局部进行缓 存,而使用memcached的缓存比ASP.NET的局部缓存更加灵活,可以缓存任意的对象,不管是否在页面上输出.而memcached最大的优点是 可以分布式的部署,这对于大规模应用来说也是必不可少的要求. LiveJournal.com使用了memcached在前端进行缓存,取得了良好的效果,而像wikipedia,sourceforge等也采用了或即将采用memca