一小时以内数据变化都存放到memcached中,无论数据读取或者写入只与memcached交互。但实际情况 是
,memcached的LRU淘汰算法,把内存分为很多slab, 当某个slab空间已经被使用完了,即使其他slab里面
还有空间,仍然存在数据被踢的可能。一小时内,memcached内存占用不到50%,已经能检 测到数据丢失
。
为了保证数据的完整, memcached 在启动时候应该开启 -M 参数。该参数含义是 return error on
memory exhausted (rather than removing items)。看memcached源代码可以知道,开启该参数后,当某
个slab写满,新数据将无法写入。保护了原数据不丢失。程序这边如果检测到新数 据,就触发把数据回
写人数据库的操作,并主动释放一部分内存。
memcached 另外一个问题是,设置了永不过期的数据也会被踢掉,这个问题就得修改memcached 源代码了
。
文件 items.c,找到一下代码
for (search = tails[id]; tries > 0 && search != NULL; tries–, search=search->prev) {
if (search->refcount == 0) {
if (search->exptime == 0 || search->exptime > current_time) {
itemstats[id].evicted++;
itemstats[id].evicted_time = current_time – search->time;
STATS_LOCK();
stats.evictions++;
STATS_UNLOCK();
}
do_item_unlink(search);
break;
}
}
修改为:
for (search = tails[id]; tries > 0 && search != NULL; tries–, search=search->prev) {
if (search->refcount == 0 && search->exptime != 0) {
if (search->exptime > current_time) {
itemstats[id].evicted++;
itemstats[id].evicted_time = current_time – search->time;
STATS_LOCK();
stats.evictions++;
STATS_UNLOCK();
}
do_item_unlink(search);
break;
}
}
就是检查队列时候直接跳过过期时间为0的部分,这样保证数据不丢失。修改完毕,重新编译memcache就
行。
(ps, 今天发现memcached 1.41版本增加 -N 参数,参数含义为 return error on memory exhausted
(allow removing items with expire time > 0, just keep never-expire items), it could)
还有第三种方案是,修改memcached更新数据那部分,发现数据被复写时候,把被覆盖数据挪走。也是要
修改源代码。
分享到:
相关推荐
**Memcache集群环境下的缓存解决方案** ...总的来说,Memcache提供了一种高效的缓存解决方案,但在集群环境下需要综合考虑高可用性、数据分布、故障恢复等多个方面,才能构建出稳定且性能优异的缓存系统。
使用 ASP Memcache 解决缓存问题有以下几个主要步骤: 1. **安装 Memcached**:首先,你需要在服务器上安装 Memcached。这通常可以通过下载源代码编译或者使用预编译的二进制包完成。安装完成后,启动 Memcached ...
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB, -u是运行Memcache的用户,我这里是root, -l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200, -p是设置...
1. **数据持久性**:Memcache不支持数据持久化,断电或重启后数据丢失,适用于临时存储。 2. **内存管理**:合理设置最大内存,防止因内存耗尽导致的服务器问题。 3. **并发竞争**:在多线程或多进程环境下,需注意...
它的设计目标是提供一个轻量级的解决方案,用于临时存储热数据,以减少对持久存储(如数据库)的访问。 ### 二、工作原理 1. **Key-Value存储**:Memcache基于键值对的存储方式,每个缓存项都有一个唯一的键,对应...
总结来说,"集群环境下memcache解决session共享"是一个针对分布式系统中session管理的有效解决方案。通过使用memcache作为session的中央存储,可以在Tomcat8集群中实现用户状态的无缝切换,提升应用的稳定性和用户...
一致性哈希算法解决了节点加入或离开时数据迁移量过大的问题,减少了对缓存的影响。 5. **ketama.c和ketama.h**:这两个文件是Magent中实现ketama算法的源代码。ketama.c包含了算法的具体实现,而ketama.h则定义了...
标题中的“memcache多线程将ORACLE数据流生成扫描件”揭示了这个技术主题是关于使用Memcache处理Oracle数据库的数据,并且采用了多线程技术。让我们深入了解一下这两个关键概念。 1. Memcache:Memcache是一款广泛...
Memcache的分布式特性体现在它可以跨多台服务器部署,通过一致性哈希算法将数据分散到不同的节点上,实现负载均衡和数据冗余。这样,即使某一台服务器故障,数据仍可以从其他服务器中获取,保证了系统的可用性。 **...
### Memcache安装与基本操作详解 #### 一、前言 Memcache是一种高性能的分布式内存对象...Memcache作为一种高效的缓存解决方案,在提高Web应用性能方面发挥着重要作用。希望本文能帮助您更好地理解和使用Memcache。
总的来说,Python的`memcache`库提供了一个简洁而高效的接口,允许开发者轻松地将数据上传到Memcached缓存系统,从而优化Web应用的性能。结合实际项目中的源码分析和使用,你可以更深入地理解和掌握这个工具的运用。
它支持多种编程语言,包括PHP,提供了一种轻量级的缓存解决方案,特别适合处理高并发场景下的Web应用。 2. **PHP5.3与Memcache的兼容性** PHP5.3是PHP的一个重要版本,引入了新的特性并修复了一些问题。由于PHP5.3...
### Memcache缓存详解 ...总结来说,Memcache作为一种高效的缓存解决方案,通过在内存中存储数据,极大地提升了网站的性能。通过对访问模型的理解和一致性哈希算法的应用,可以在扩展性和可靠性之间找到最佳平衡点。
**Memcache 1.2.6 for ...总的来说,Memcache 1.2.6 for Windows为Windows环境提供了一个强大而可靠的缓存解决方案,通过合理使用和优化,可以显著提升Web应用的性能。无论是个人博客还是大型企业应用,都能从中受益。
memcache与Redis的比较 ...memcache和Redis都是缓存解决方案,但它们有不同的设计理念和应用场景,Redis支持多种数据类型,持久化和事务等功能,而memcache则提供了简单的key-value存储和cas命令来保证并发访问一致性。
**PHP 5.4与Memcache的整合** 在PHP 5.4版本中,开发者可以利用Memcache扩展来实现高效的数据缓存,从而提高Web应用的性能。...在实际应用中,可以结合其他存储方案,如Redis,以获得更全面的缓存解决方案。
- **云服务**:如AWS CloudWatch、Azure Monitor等,为云上部署的Memcache提供集成的监控解决方案。 3. **具体工具介绍** - **mcmon**:一个简单的命令行工具,提供实时查看Memcached服务器的状态,如命中率、...
Memcache是一款高性能的分布式内存缓存系统,它最初是为了解决Web应用程序的数据库负载问题而设计的。通过将数据存储在内存中,Memcache能够快速地提供数据,减少对数据库的访问,从而提高应用性能。在Windows平台上...
此外,为了提高数据持久化和容错能力,还可以考虑与其他存储系统(如Redis)结合使用,或者使用Memcached的分片集群解决方案。 总结来说,Memcache是一个强大的内存缓存系统,通过高效的内存管理和简单的分布式策略...