如果你清楚知道这一点,那就跳过吧!如果你不太清楚原因,那就往下看吧
我们都在用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的代码,就明白服务端是两种方式都兼容的,一个是多少秒后过期,一个是什么时候过期,
但后者因为设置时间是在客户端,存储在服务端,假如两台服务器时间差别很大,就会导致数据的过期时间和我要求的时间点不符合。
个人觉得使用前者比较好!
分享到:
相关推荐
在Memcached中,设置过期时间是管理缓存对象生命周期的重要方式。过期时间可以确保缓存的数据在特定时间后不再有效,从而强制重新获取最新数据。 在Memcached的Java客户端中,设置过期时间有两种常见的表示方法: ...
- 数据过期机制:支持设置数据的生存时间,超过该时间后数据会被自动删除。 - 底层协议简单:使用基于文本的简单协议,易于实现客户端和服务器之间的通信。 3. **Memcache与PHP的结合** PHP是Web开发中常用的...
4. **数据过期机制**:可以为每个缓存项设置存活时间(TTL),到期后自动删除。 ### 四、使用场景 1. **减轻数据库压力**:将频繁访问的数据缓存起来,减少对数据库的查询次数。 2. **页面静态化**:将动态生成的...
键值对的存储结构包括键、值、过期时间、大小等信息。 3. **协议解析** Memcache使用简单的文本协议与客户端进行通信。源码中的解析部分涉及对命令行的分割,以及对不同命令(如`GET`, `SET`, `DELETE`等)的处理...
- 过期时间设置:合理设置数据的过期时间,防止内存被无效数据占用。 总之,Memcache是通过内存缓存来提高Web应用性能的有效工具。在Java开发中,结合适当的客户端库和服务器配置,可以轻松地将Memcache集成到应用...
在实际项目中,你可以通过设置Memcache的缓存策略、过期时间以及利用Memcache的分布式特性来优化数据存储和检索。例如,可以将频繁访问的数据存储在Memcache中,减少对数据库的依赖。 总结,安装和配置Windows 7上...
- **内存管理**: 考虑到内存限制,合理设置缓存项的过期时间和大小,避免内存溢出。 - **错误处理**: 在使用Memcache时,应检查每次操作的返回值,及时处理可能出现的连接问题或数据存储异常。 通过以上介绍,我们...
**Memcache监控工具详解** Memcache是一款高性能的分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高应用程序性能。然而,为了确保Memcache系统的稳定性和高效运行,实时监控其运行状态至关...
// key 为键,value 为值,0 表示默认过期时间,3600 表示1小时后过期 // 获取数据 $value = $memcache->get('key'); // 如果存在并返回,否则返回 false if ($value !== false) { echo 'Value: ' . $value; } ...
4. **性能优化**:memcache的性能受到网络延迟和并发处理能力的影响,合理设置缓存过期时间、选择合适的数据结构以及优化服务器配置都是提升性能的关键。 5. **兼容性问题**:由于`php_memcache.dll`扩展可能不兼容...
- **存储数据**:可以使用`$m->set('key', 'value', $flag, $expire)`将数据存储到Memcache中,其中`key`为键,`value`为值,`flag`通常为0,`expire`为过期时间(秒)。 - **获取数据**:通过`$data = $m->get('...
### Memcache安装与基本操作详解 #### 一、前言 Memcache是一种高性能的分布式内存对象缓存系统,用于加速动态Web应用,减轻数据库负担。本文将详细介绍如何安装配置Memcache,并提供基本的操作示例。 #### 二、...
// 存储键值对,第二个参数为0表示永不过期,第三个参数为过期时间(秒) $stored_value = $memcache->get('key'); // 获取存储的值 ``` - 你可以利用`set()`, `get()`, `delete()`, `increment()` 和 `...
最大 30 天的数据过期时间,设置为永久的也会在这个时间过期。最大键长为 250 字节,大于该长度无法存储。 Memcache 是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的 hash 表,它能够...
2. **设置缓存**:使用`memcache_set()`函数可以将数据存储到缓存中,包括键名、值、过期时间以及可选的存储 flags。 3. **获取缓存**:`memcache_get()`用于根据键名从缓存中获取数据。如果数据不存在或已过期,它...
* Memcache 中的缓存政策可以根据需要进行设置,例如设置缓存的过期时间或缓存的最大大小。 Memcache 是一种非常有用的技术,它可以帮助应用程序提高性能和减少数据库的负载。但是,在使用 Memcache 时需要考虑到...
- 使用合适的过期时间,避免无效数据占用内存。 - 结合其他持久化存储方案,如 Redis,提高数据安全性。 通过理解和合理使用 Memcache,开发者可以有效地提升 Web 应用的性能,减少数据库压力,为用户提供更流畅...
- **过期机制**: 每个存储的键值对都可以设置过期时间,过期后自动从内存中删除。 **应用场景**: - **Web应用加速**: 对于频繁访问但不经常改变的数据,如用户会话、热门商品信息等,memcache可以显著提高响应...