`
hyl198611
  • 浏览: 225212 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Memcached expire 设置错误引起的set(key,exp,value)为true而get(key)为null的问题

阅读更多

与作者遇到相同问题所以转载了此文章,以为设置的时间是毫秒!

 

最近项目中使用到了Memcached,而客户端选择了XMemcached ,在设置过期时间时,因对Memcached 不熟悉,将expire 设置为1000000000,本意表示尽量长的时间不要过期,但在测试时发现,memcachedClient.set(key,exp,value)结 果返回true,即代表该项已成功存入缓存,但当调用memcachedClient.get(key)时始终返回为null,起初以为key的生成策略 有误,后来当把exp填了个1000时,Memcached的set 和 get方法均返回true,看来问题出在expire,所以查了下文档,发现Memcached默认expire为0即代表永不过期,而这个过期时间最长 为30天= 30*24*60*60 = 2592000秒,所以又将expire配置为2592000秒,发现正常执行,为了测试Memcached是否为最长30天,又将该值加了1变成 2592001,此时出现了和开始一样的错误,set返回 true,但get返回为null,这样应该映证了30长最长时间的猜想。而这个时间应该是Memcached本身设置的,经过查找发现 Memcached源码memcached.c里边有如下代码。注意第一行 #define REALTIME_MAXDELTA 60*60*24*30 即为30天。

  1. #define REALTIME_MAXDELTA 60*60*24*30  
  2.   
  3. /* 
  4.  * given time value that's either unix time or delta from current unix time, return 
  5.  * unix time. Use the fact that delta can't exceed one month (and real time value can't 
  6.  * be that low). 
  7.  */  
  8. static rel_time_t realtime(const time_t exptime) {  
  9.     /* no. of seconds in 30 days - largest possible delta exptime */  
  10.   
  11.     if (exptime == 0) return 0; /* 0 means never expire */  
  12.   
  13.     if (exptime > REALTIME_MAXDELTA) {  
  14.         /* if item expiration is at/before the server started, give it an 
  15.            expiration time of 1 second after the server started. 
  16.            (because 0 means don't expire).  without this, we'd 
  17.            underflow and wrap around to some large value way in the 
  18.            future, effectively making items expiring in the past 
  19.            really expiring never */  
  20.         if (exptime <= process_started)  
  21.             return (rel_time_t)1;  
  22.         return (rel_time_t)(exptime - process_started);  
  23.     } else {  
  24.         return (rel_time_t)(exptime + current_time);  
  25.     }  
  26. }  

XMemcached是一个新java memcached client。Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,
现在也有很多人将它作为内存式数据库在使用,memcached通过它的自定义协议与客户端交互,而XMemcached就是它的一个java客户端实现。

关于XMemcached详细说明,参考XMemcached简介

 

转自:http://blog.csdn.net/shixing_11/article/details/7059643

分享到:
评论

相关推荐

    redis是一个key-value存储系统 和Memcached类似,它支持存储的value类型相对更多

    和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更...

    memcached-2.4.2.jar memcached-2.4.2.jar

    使用memcached 方法 package com.war.common.util; import com.danga.MemCached.*; import java.util.Date; public class MemCached { protected static MemCachedClient mcc; protected static Logger log; ...

    Memcached get 命令

    Memcached get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。 语法: get 命令的基本语法格式如下: get key 多个 key 使用空格隔开,如下: get key1 key2 key3 参数说明如下: ...

    memcached-1.0.0.tgz

    set value of item with key 'var_key', using on-the-fly compression expire time is 50 seconds */ $memcache_obj-&gt;set('var_key', 'some really big variable', MEMCACHE_COMPRESSED, 50); echo $memcache_...

    Redis 是一个高性能的key-value数据库 它 的出现,很大程度补偿了memcached这类keyvalue存储的不足

    Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。

    memcached1

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

    memcached windows稳定版

    -n 最小分配空间,key+value+flags默认是48 -h 显示帮助 Memcache环境测试: 运行下面的php文件,如果有输出This is a test cache!,就表示环境搭建成功。开始领略Memcache的魅力把! $mem = new Memcache();...

    java Memcached Spring整合代码实例

    flag = cachedClient.set(key, value, expire); } catch (Exception e) { // 记录Memcached日志 logger.error("Memcached set方法报错,key值:" + key + "\r\n"); } return flag; }

    redis是一个高性能的key-value数据库

    redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,...

    memcached for win32

    MemCached For Win32 服务器 -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭...-n 最小分配空间,key+value+flags默认是48 -h 显示帮助

    memcached32位&64位

    memcached32位&64位支持win8.1 安装: memcached -d install memcached -d start net start "Memcached Server" 卸载: memcached -d stop ...-n 最小分配空间,key+value+flags默认是48 -h 显示帮助

    Memcached 1.2.1.0 For Windows

    安装服务方法(也可直接双击启动): cmd代码: 到memcached根目录 1、安装:memcached.exe –d install 2、启动:memcached.exe -d start ...-n 最小分配空间,key+value+flags默认是48 -h 显示帮助

    Memcached1.4.13 For Windows 32/64

    这是 memcached 在 Windows 系统下的 x86/x64 版本。 命令提示符下运行 安装: memcached -d install memcached -d start net start "Memcached Server" ...-n 最小分配空间,key+value+flags默认是48 -h 显示帮助

    Memcached 1.4.13(Windows 32/64)最新稳定版

    memcached是一套分布式的快取系统,是一套开放源代码软件,以BSD license授权释出。是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载...-n 最小分配空间,key+value+flags默认是48 -h 显示帮助

    memcached安装错误解决文件

    memcached安装错误解决文件

    java连memcached的驱动 spymemcached-2.10.3.jar

    System.out.println("runoob value in cache - " + mcc.get("runoob")); // 添加 fo = mcc.add("runoob", 900, "memcached"); // 打印状态 System.out.println("add status:" + fo.get()); // 添加新key...

    memcached-win-32/64-1.4.4-14

    默认64MB -M 内存耗尽时返回错误,而不是删除项 -c 最大同时连接数,默认是1024 -f 块大小增长因子,默认是1.25 -n 最小分配空间,key+value+flags默认是48 -h 显示帮助 Memcache环境测试: 运行下面的php文件,如果...

    memcached for Win32/x64服务器(袋鼠图标,版本是1.4.13)

    M 内存耗尽时返回错误 而不是删除项 c 最大同时连接数 默认是1024 f 块大小增长因子 默认是1 25 n 最小分配空间 key+value+flags默认是48 h 显示帮助"&gt;MemCached For Win32 服务器(高洛峰老师讲课那种) p ...

    memcached-win64-1.4.4-14.rar

    Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。 Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,...

    ecshop caches缓存 memcached 错误最新修正无错.txt

    ecshop caches缓存 memcached 错误最新修正无错.txt ecshop caches缓存 memcached 错误最新修正无错.txt ecshop caches缓存 memcached 错误最新修正无错.txt

Global site tag (gtag.js) - Google Analytics