`
sunqi
  • 浏览: 230835 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

memcache过期时间的一点小小的分析

阅读更多
如果你清楚知道这一点,那就跳过吧!如果你不太清楚原因,那就往下看吧
 
 
我们都在用MemCached,缓存有其过期时间,我们经常在配置中设置,如果有业务场景需要动态设置过期时间的时候,就可以通过接口直接设置过期时间
    client.set(key, value, new Date(expireTime));
 
但这个时间如何设置,还是有一点区别,比如设置10分钟后过期,是应该设置date为System.currentTimeInMillis()+10*60*1000
还是10*60*1000
刚经过测试,两种竟然都是可以的,这是咋回事,那就看源码呗,网络上介绍的一些文档有时候需要鉴别,更可靠的还是自己下源码看,别被误导了.
 
    /** Stores data on the server; the key, value, and an expiration time are specified.
      *  The server will automatically delete the value when the expiration time has been reached.
      *  If the value is not a String or numeric type, or if {@link #set_serial(boolean) set_serial(true)}
      *  has been called; the data will be Serialized prior to storage.
      *
      *  If compression is enabled, and the data is longer than the compression threshold,
      *  and compresses by at least the compression savings, the data will be stored in
      *  compressed form.
      *
      * @param key key to store data under
      * @param value value to store
      * @param expiry when to expire the record
      * @return true, if the data was successfully stored
      */
     public boolean set(String key, Object value, Date expiry) {
         return set("set",key,value,expiry,null);
     }
 
这里过期时间只是简单的说when,没明确说明,在具体实现里面
try {
             String cmd = cmdname + " " + key + " " + flags + " " +
             expiry.getTime() / 1000 + " " + val.length + "\r\n";
             sock.out().writeBytes(cmd);
             sock.out().write(val);
             sock.out().writeBytes("\r\n");
             sock.out().flush();
             
             String tmp = sock.in().readLine();
             if (tmp.equals("STORED")) {
                 if (debug) {
                     System.out.println("MemCache: " + cmdname + " " + key + " = " + val);
                 }
                 return true;
             } else {
                 System.out.println("MemCache:" + cmd + tmp);
             }
实现中也是expiry.getTime() / 1000 传入到服务端
 
在客户端看不出到底怎么回事了,那就看服务端了,(网络上介绍的东西是copy来copy去的,有些都掉东西了,还是自己下代码来看)
 
#define REALTIME_MAXDELTA 60*60*24*30
/*
 * given time value that's either unix time or delta from current unix time, return
 * unix time. Use the fact that delta can't exceed one month (and real time value can't
 * be that low).
 */
static rel_time_t realtime(const time_t exptime) {
    /* no. of seconds in 30 days - largest possible delta exptime */
    if (exptime == 0) return 0; /* 0 means never expire */
    if (exptime > REALTIME_MAXDELTA) {
        /* if item expiration is at/before the server started, give it an
           expiration time of 1 second after the server started.
           (because 0 means don't expire).  without this, we'd
           underflow and wrap around to some large value way in the
           future, effectively making items expiring in the past
           really expiring never */
        if (exptime <= process_started)
            return (rel_time_t)1;
        return (rel_time_t)(exptime - process_started);
    } else {
        return (rel_time_t)(exptime + current_time);
    }
}
 
看了这段c的代码,就明白服务端是两种方式都兼容的,一个是多少秒后过期,一个是什么时候过期,
但后者因为设置时间是在客户端,存储在服务端,假如两台服务器时间差别很大,就会导致数据的过期时间和我要求的时间点不符合。
个人觉得使用前者比较好!

分享到:
评论
4 楼 zjilvufe 2015-07-02  
顶!但是感觉10*60*1000,比较好,可以避免时间差问题。
3 楼 zjilvufe 2015-07-02  
顶!但是感觉10*60*1000,比较好,可以避免时间差问题。
2 楼 zjilvufe 2015-07-02  
顶!但是感觉10*60*1000,比较好,可以避免时间差问题。
1 楼 caoxudong818 2011-02-24  
顶,楼主说的挺详细

相关推荐

    memcached过期问题

    在Memcached中,设置过期时间是管理缓存对象生命周期的重要方式。过期时间可以确保缓存的数据在特定时间后不再有效,从而强制重新获取最新数据。 在Memcached的Java客户端中,设置过期时间有两种常见的表示方法: ...

    memcache1.2.1 for windows

    - 数据过期机制:支持设置数据的生存时间,超过该时间后数据会被自动删除。 - 底层协议简单:使用基于文本的简单协议,易于实现客户端和服务器之间的通信。 3. **Memcache与PHP的结合** PHP是Web开发中常用的...

    【汇总】Memcache

    4. **数据过期机制**:可以为每个缓存项设置存活时间(TTL),到期后自动删除。 ### 四、使用场景 1. **减轻数据库压力**:将频繁访问的数据缓存起来,减少对数据库的查询次数。 2. **页面静态化**:将动态生成的...

    memcache1.2.8源码分析(源码有注释+ppt说明)

    键值对的存储结构包括键、值、过期时间、大小等信息。 3. **协议解析** Memcache使用简单的文本协议与客户端进行通信。源码中的解析部分涉及对命令行的分割,以及对不同命令(如`GET`, `SET`, `DELETE`等)的处理...

    Memcache原理及实现

    - 过期时间设置:合理设置数据的过期时间,防止内存被无效数据占用。 总之,Memcache是通过内存缓存来提高Web应用性能的有效工具。在Java开发中,结合适当的客户端库和服务器配置,可以轻松地将Memcache集成到应用...

    window 7memcache安装组件

    在实际项目中,你可以通过设置Memcache的缓存策略、过期时间以及利用Memcache的分布式特性来优化数据存储和检索。例如,可以将频繁访问的数据存储在Memcache中,减少对数据库的依赖。 总结,安装和配置Windows 7上...

    PHP memcache 多版本拓展

    - **内存管理**: 考虑到内存限制,合理设置缓存项的过期时间和大小,避免内存溢出。 - **错误处理**: 在使用Memcache时,应检查每次操作的返回值,及时处理可能出现的连接问题或数据存储异常。 通过以上介绍,我们...

    memcache监控工具

    **Memcache监控工具详解** Memcache是一款高性能的分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高应用程序性能。然而,为了确保Memcache系统的稳定性和高效运行,实时监控其运行状态至关...

    memcache-3.0.6.tgz

    // key 为键,value 为值,0 表示默认过期时间,3600 表示1小时后过期 // 获取数据 $value = $memcache-&gt;get('key'); // 如果存在并返回,否则返回 false if ($value !== false) { echo 'Value: ' . $value; } ...

    PHP7.x 8.0 memcache dll php_memcache.dll

    4. **性能优化**:memcache的性能受到网络延迟和并发处理能力的影响,合理设置缓存过期时间、选择合适的数据结构以及优化服务器配置都是提升性能的关键。 5. **兼容性问题**:由于`php_memcache.dll`扩展可能不兼容...

    php5.3的memcache

    - **存储数据**:可以使用`$m-&gt;set('key', 'value', $flag, $expire)`将数据存储到Memcache中,其中`key`为键,`value`为值,`flag`通常为0,`expire`为过期时间(秒)。 - **获取数据**:通过`$data = $m-&gt;get('...

    memcache安装与基本操作详解

    ### Memcache安装与基本操作详解 #### 一、前言 Memcache是一种高性能的分布式内存对象缓存系统,用于加速动态Web应用,减轻数据库负担。本文将详细介绍如何安装配置Memcache,并提供基本的操作示例。 #### 二、...

    win下php-memcache5.4;5.2;5.3扩展和memcache服务端

    // 存储键值对,第二个参数为0表示永不过期,第三个参数为过期时间(秒) $stored_value = $memcache-&gt;get('key'); // 获取存储的值 ``` - 你可以利用`set()`, `get()`, `delete()`, `increment()` 和 `...

    memcache学习文档 for java demo

    最大 30 天的数据过期时间,设置为永久的也会在这个时间过期。最大键长为 250 字节,大于该长度无法存储。 Memcache 是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的 hash 表,它能够...

    PHP 5.4 使用的 memcache

    2. **设置缓存**:使用`memcache_set()`函数可以将数据存储到缓存中,包括键名、值、过期时间以及可选的存储 flags。 3. **获取缓存**:`memcache_get()`用于根据键名从缓存中获取数据。如果数据不存在或已过期,它...

    memcache使用手册

    * Memcache 中的缓存政策可以根据需要进行设置,例如设置缓存的过期时间或缓存的最大大小。 Memcache 是一种非常有用的技术,它可以帮助应用程序提高性能和减少数据库的负载。但是,在使用 Memcache 时需要考虑到...

    memcache 5.3.3

    - 使用合适的过期时间,避免无效数据占用内存。 - 结合其他持久化存储方案,如 Redis,提高数据安全性。 通过理解和合理使用 Memcache,开发者可以有效地提升 Web 应用的性能,减少数据库压力,为用户提供更流畅...

    memcache(win32/64)

    - **过期机制**: 每个存储的键值对都可以设置过期时间,过期后自动从内存中删除。 **应用场景**: - **Web应用加速**: 对于频繁访问但不经常改变的数据,如用户会话、热门商品信息等,memcache可以显著提高响应...

Global site tag (gtag.js) - Google Analytics