`
hyl198611
  • 浏览: 228472 次
  • 性别: 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开发完整demo

    memcached_return_t ret = memcached_set(memcached, key, strlen(key), value, strlen(value), expiration, flags); ``` 3. **检索数据**:使用`memcached_get`函数可以获取之前存储的键对应的值: ```c size_...

    memcached实例

    在这个例子中,我们首先创建了一个连接到本地 Memcached 服务器的客户端,然后设置了键为 "test_key",值为 "Hello, Memcached!" 的缓存条目。最后,我们通过键获取并打印了缓存值。 ### 四、清除缓存 要删除特定...

    深入理解redis_memcached失效原理(小结)

    2. 当一个设置了失效时间的 key 被更新覆盖(比如使用 `SET`、`MSET` 或 `GETSET`),其失效时间会被撤销。 3. 使用 `RENAME` 命令重命名 key 时,原有的失效时间会传递给新 key。但如果旧 key 被覆盖(如 `RENAMENX...

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

    memcached连接demo

    $value = $memcached-&gt;get('key'); ``` 4. **Ruby**: 使用`dalli` gem,首先安装:`gem install dalli`,然后编写代码: ```ruby require 'dalli' client = Dalli::Client.new('127.0.0.1:11211') client....

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对_Redis.zip

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

    Memcached实例与文档

    - 添加数据:`MemcachedClient.add(String key, int exp, Object value)`,将值存储,设置过期时间(exp)。 - 获取数据:`MemcachedClient.get(String key)`,根据键获取数据。 - 删除数据:`MemcachedClient....

    memcached启动错误解决

    在使用memcached服务时,可能会遇到启动失败的问题,这通常是由于多种原因引起的。memcached是一款轻量级、高性能的分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载。本文将探讨如何解决memcached...

    php memcached缓存操作类

    $memcached-&gt;set($key, $value, 60); // 设置缓存,过期时间为60秒 echo $memcached-&gt;get($key); // 获取并输出缓存 $memcached-&gt;delete($key); // 删除缓存 ``` 实际操作类的使用方式会根据类的设计有所不同,...

    python-memcached python-memcached

    9. **错误处理**:库内建了错误处理机制,包括网络错误、超时错误等,确保在出现问题时能够优雅地处理。 10. **性能优化**:Python-memcached库设计得非常轻量级,它使用最少的网络通信开销,以提高与Memcached...

    C语言memcache代码

    rc = memcached_get(memcache, key, &key_length, &return_value, &return_value_length, &flags, NULL); if (rc == MEMCACHED_SUCCESS) { // 使用返回的值 } else { // 处理错误 } ``` 4. **删除键值对**:使用`...

    memcached安装包以及MemCachedClient

    client.set("key", 30, "value").get(); // 获取 value String value = (String) client.get("key"); System.out.println("Value: " + value); // 关闭连接 client.shutdown(); } catch (IOException e) ...

    java使用Memcached简单教程

    Object value = memcachedClient.get(key); if (value != null) { return value.toString(); } return null; } } ``` 在这个例子中,我们创建了一个名为`MemcachedExample`的类,并实现了两个基本的方法:`...

    Memcached_程序与php中应用

    $value = $memcached-&gt;get('key'); // 删除数据 $memcached-&gt;delete('key'); ``` **Memcached使用示例** `学习文档Url.txt`可能包含了关于如何在实际项目中使用PHP Memcached扩展的详细步骤和最佳实践。文档可能...

    Memcached For ASP

    cachedValue = memcached.Get key Response.Write cachedValue '输出缓存的数据 ``` **四、Fasp加速技术** Fasp是一种高速文件传输协议,与Memcached并无直接关系,但在ASP应用中,如果配合Fasp技术,可以进一步...

    memcached资源demo(已调试通过)

    可通过`set`方法设置过期时间,单位为秒。 ```python mc.set('key', 'value', time=60) # 数据将在60秒后自动失效 ``` ### 7. 批量操作 Memcached也支持批量操作,例如批量设置和获取多个键值对。 ```python mc....

    基于Linux内核的Key-Value存储系统——KStore.pdf

    本文主要介绍了一种基于 Linux 内核的 Key-Value 存储系统——KStore,该系统解决了现有 Key-Value 存储系统在用户态空间设计和实现时存在的频繁模式切换和上下文切换问题,导致访问接口和事务处理效率不高的问题。...

    memcached1

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

Global site tag (gtag.js) - Google Analytics