`
zhengdl126
  • 浏览: 2510029 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

memcache 丢数据解决方案

 
阅读更多

一小时以内数据变化都存放到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集群环境下缓存解决方案.docx

    Memcache集群环境下缓存解决方案.docx

    memcache的最佳实践方案

    -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB, -u是运行Memcache的用户,我这里是root, -l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200, -p是设置...

    MemCache开发说明文档

    Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从...

    asp memcache 解决缓存问题

    asp memcache 由于新项目需要和之前老程序打通,发现这个,用来保存session

    memcache缓存分布式集群

    利用magent代理memcache ,搭建memcache 缓存分布式集群

    Redis和Memcache的区别总结

    1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等; 2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储; 3...

    memcache图形管理工具

    memcache图形管理工具

    memcache安装包,memcache

    memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问。

    集群环境下memcache解决session共享

    tomcat8的集群环境下memcache解决session共享的jar包。

    memcache1.2.1 for windows

    windows下memcache安装包 附带php扩展包

    memcache图形监控工具phpmemcache

    memcache图形监控工具phpmemcache,尽是一个PHP文件就可以实现对memcache的监控。 使用方法:本地测试监控机安装Apache或者下载XAMPP(Apache+MySQL+PHP+PERL),安装后把memcachephp.zip中的memcache.php文件放到...

    memcache

    将信息保持memcache中

    C语言memcache代码文档

    C语言memcache代码文档C语言memcache代码文档C语言memcache代码文档C语言memcache代码文档C语言memcache代码文档C语言memcache代码文档C语言memcache代码文档

    最新windows版php_memcache.dll和memcache.exe

    最新windows的memcache模块下载 这个模块是平和php5.3的,在我的windowsxp php5.3.5上安装成功 里面有两个php库,一个php_memcache.dll.vc6 和一个php_memcache.dll.vc9 另外一个windows的memcache.exe文件,都是网上...

    Memcache完全剖析 最实用的Memcache文档

    Memcache就不用多介绍了,做开发的人都知道。 但要用得好,却并不是那么容易的事。 如果用得不好,反而得不偿失。 这篇文档短小精悍,囊括了使用过程中需要要注意的方方面面。值得一读。

    memcache 范例(附源代码)

    memcache 范例 附源代码 缓存 超级不错的缓存解决方案

    简单的memcache命令

    简单的memcache命令

    Python memcache 上传数据

    NULL 博文链接:https://laoyaos.iteye.com/blog/2022937

    delphi memcache MemCache.0.2.0.zip

    MemCache.0.2.0.zip Memcached Client for Delphi 客户端调用类 MemCache.0.2.0.zip Show all LinksExternal links Memcached Project This project is a delphi unit which implements a thread safe client for ...

    Erlang_Memcache.pdf

    Erlang_Memcache

Global site tag (gtag.js) - Google Analytics