`
shazhifeng
  • 浏览: 125228 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

memcached批量删除方案探讨

阅读更多

Memcached是开源的分布式cache系统,现在很多的大型web应用程序包括facebook,youtube,wikipedia,yahoo 等等都在使用memcached来支持他们每天数亿级的页面访问。通过把cache层与他们的web架构集成,他们的应用程序在提高了性能的同时,还大大降低了数据库的负载。

  如果您还对memcached还不是很了解,请先阅读:

  利用memcached构建高性能的Web应用程序

  本文中我们将集中探讨如何对memcached中存储的cache进行高效管理。在我们实际项目中,由于网站经常需要更新,而cache难免会发生与数据库不同步却仍然还有效的情况,那网站管理员就有需求对某个或某些cache进行手工清理。

  比如,大众点评的每个商户页面都利用了cache,并存成键值为Shop.[ShopID]的cache对象。如果一个商户ID为1234的页面cache有问题,我们就可以通过Remove(”Shop.1234”)方法通知memcached清掉对应的cache对象。

  但问题又随之而来了,有时候我们发现有一批cache都存在问题而没有及时过期。此时我们会面临一个两难的选择:

  通过flush_all清掉所有的cache

  这种做法很黄很暴力…把有问题和没问题都一起kill掉了…

  找出这一批cache中所有的key值并逐一进行清理

  这种做法看似不错,但没有好的办法实现。因为memcached是hash表结构,无法提供像sql里select from where的操作,所以你不知道这批数据到底有多少已经存进了cache

  暴力法我们肯定是不能主动考虑的,否则也不用这篇文章了,呵呵。所以我们看看有没有可行的方案来实现方法2。

  LogDB方案

  这个方案说起来也很简单。既然memcached没有select操作,我们就用db去记录所有的Cache SET操作。只要memcached存了一个cache对象进instance,就同时往logdb上写一条记录。

等到要删除的时候,我们就通过select操作,找出所有Shop.xxxx的商户,并逐一进行remove操作。

memcached批量删除方案探讨memcached批量删除方案探讨

  这种办法虽然可以达到精确删除的目的,但是所消耗的代价也未免有些过高,为了清除key还要另外拉个数据库进来做辅助。而且cache的存取量是很大的,说不定数据库频繁的insert操作还会成为另一个潜在的性能瓶颈。此方案在硬件条件不是很充裕的条件下谨慎使用。

  自定义keylocator方案

  了解memcached的读者都知道,cache对象分配到哪个instance是由memcached客户端决定的。而memcached客户端默认的分配算法是SHA-1散列算法。所以默认情况下,商户类的cache对象(Shop.xxxx)是被散列到不同的memcached instance上的。

memcached批量删除方案探讨

  (X:User100,Shop202 Y:User101,Shop200 Z:User102,Shop201)

  假如我们可以自定义这个分配算法,将Shop.xxx类的cache对象都同一存到某一个instance或某几个instance下,这样我们就通过清掉这些Shop.xxx专用的instance来达到批量清楚的目的。

memcached批量删除方案探讨

  (X:User100 Y:Shop200,Shop201,Shop202 Z:User101,User102)

 这个方案看似不错,其实还是有不少衍生问题的:

  使用率不均问题:

  从上面两个例子就可以看到,前面通过散列算法存放,每个instance都放了两个对象,但是采用自定义的办法,instance Y就存了3个,X才存了1个。如果自定义的locator在实现之前不能够通盘考虑各类key的使用率的话,很容易造成instance使用不均的问题。

  负载率不均问题:

  有些热门类的key读取率很高,因为原本是散列在各个服务器上,读取负载也就自然地分解到各个服务器上。现在采用专用服务器模式的话,所有的读取操作就限制在某一台服务器上,无疑是加大了这台服务器的负担。

  Key flag 方案

  这个方案是眼下笔者认为最简单有效的一个办法,通过在key上做标记来实现懒清理。其实这种做法也是很合memcached的胃口的,之前的文章就介绍过,memcached server的清理策略就是懒清理。

  让我们看一下实际的例子:

memcached批量删除方案探讨

  我们在所有的key后面都带一个版本标记,“Shop.200_1”代表商户ID为200,版本号为1的缓存。一旦有需要对所有的商户类缓存进行清理的话,我们只需要升级一下Shop类缓存的版本就可以做到。

memcached批量删除方案探讨

  上例中,商户类缓存版本都升级到2了,读取的key值也发生了变化。所以原来的Shop.xxx_1的缓存就永远不会再被读取到,也就等同于失效了。

  这样做还有个好处就是,不需要进行批量删除的操作,而耗费大量的维护时间。那些过时版本的cache会根据LRU原则,只要cache一满,他们就会自动被剔除,不需要我们还劳神劳力地去伺候他们。

 

  所以,在memcached这个圈子里也有个原则就是,不用的话就别去管它…它自己会消失的。

  说道这个方案不足的话,我想也就是key的长度不得不进行加长来包含版本号,不过这方面会带来的性能影响是微乎其微的。

  memcached的批量清理一直是个比较麻烦的问题,希望以上几种方案的探讨能给您带来一些启发。

分享到:
评论

相关推荐

    memcached连接demo

    除了基本的存取操作,Memcached还支持删除(`delete`)、批量操作(`get_multi`和`set_multi`)、自增/自减(`incr`和`decr`)等高级功能。这些操作可以灵活地组合,以满足各种应用场景的需求。 在实际应用中,你...

    java_memcached-release_2.6.6.rar

    7. **性能优化**:为了提高性能,Java Memcached客户端可能会采用批量操作,如批量设置、获取和删除多个键值对,减少网络I/O次数。 8. **异常处理**:客户端库通常会封装常见的网络和协议错误,并抛出相应的异常,...

    memcached-1.2.1 -win32以及安装使用方法

    在本文中,我们将深入探讨Memcached的基本概念、工作原理,以及如何在Windows环境下安装和使用。 ### Memcached的基本概念 Memcached的设计目标是提供一个轻量级、高性能的缓存服务,它通过在内存中存储数据,减少...

    缓存全面剖析.pdf及安装文件、缓存客户端、源码

    2. **操作缓存**:如设置、获取、删除缓存项,以及批量操作的方法。 3. **异常处理**:处理连接丢失、超时和其他可能的错误情况。 4. **最佳实践**:如并发控制、连接池管理,以及如何有效地利用缓存客户端来提升...

    memcache详解

    这个“memcache详解”将深入探讨其核心概念、工作原理、安装与配置,以及在实际应用中的最佳实践。 ## 一、Memcached简介 Memcached最初由Danga Interactive公司开发,现在已经成为开源项目,由一个活跃的社区...

    PyPI 官网下载 | pymemcache-1.1.2.tar.gz

    3. **键值对操作**:pymemcache提供了基本的键值对操作,如设置(set)、获取(get)、删除(delete)等,同时也支持批量操作,如批量设置(set_many)和批量获取(get_many)。 4. **持久性策略**:pymemcache允许...

    php_memcache-5.2 5.3 5.4

    本文将详细探讨PHP与Memcached的集成扩展——php_memcache,以及其在不同PHP版本(5.2、5.3、5.4)中的应用和优化策略。 首先,php_memcache是PHP官方提供的一个非持久化存储的扩展,用于连接和操作Memcached服务器...

    memcacheclient-2.0

    此外,`memcacheclient-2.0`还提供了丰富的API接口,包括设置、获取、删除、批量操作等多种功能,同时支持自定义序列化和反序列化策略,以适应不同数据类型的存储需求。这些API设计简洁明了,易于理解和使用,使得...

    acorn-0.5.0.zip

    对于实际应用,DDTH Cache Adapter提供了丰富的功能,例如:添加、删除、获取和更新缓存项,设置和过期时间,以及批量操作等。此外,它还支持异步操作,这在高并发场景下尤为关键,可以避免阻塞主线程,提高系统的...

    NHibernate2.0中文教程

    2. 批量操作:使用批处理更新和删除,减少数据库交互次数。 3. 避免N+1查询问题:通过HQL或Criteria的JOIN操作一次性获取关联数据。 通过本教程,你将全面了解NHibernate 2.0的功能,掌握如何在.NET项目中运用ORM...

    Nhibernate 3.0 CookBook

    最后,书籍可能包含一些高级话题,如使用NHibernate进行批量操作、实现软删除、以及与Web应用程序(如ASP.NET MVC)的集成。此外,可能还会介绍如何将NHibernate与其他设计模式和最佳实践相结合,以提高软件的可维护...

    网络游戏-宽带网络接入服务器的计费缓存系统及其方法.zip

    7. **扩展性**:随着用户数量的增长,计费缓存系统应具备良好的扩展性,可以方便地添加更多硬件资源或采用分布式缓存解决方案,如Redis或Memcached。 通过上述方式,网络游戏的计费缓存系统能有效提高服务效率,...

    JAVA人力资源管理系统设计文档.zip

    3.1 员工管理:包括员工基本信息录入、查询、修改、删除等操作,可能需要支持多条件搜索和批量操作。 3.2 薪资福利:计算员工工资,包括基本工资、绩效奖金、福利补贴等,可能涉及复杂的计算逻辑和税务规则。 3.3 ...

    SmartPersistenceLayer

    2. **批处理操作**:在进行大量数据操作时,SmartPersistenceLayer支持批量插入、更新和删除,避免频繁的数据库交互,显著提高了处理速度。 3. **动态查询构建**:SmartPersistenceLayer允许开发者以更灵活的方式...

    java面试——Redis面试专题.zip

    本专题主要围绕Redis进行深入探讨,旨在帮助求职者准备Java面试中的Redis相关问题。以下是Redis的一些核心知识点和面试常问问题。 1. Redis简介:Redis是一款开源的内存数据结构存储系统,它可以用作数据库、缓存和...

    springboot208基于springboot物流管理系统.zip

    - **订单管理**:包括订单创建、查询、修改、删除等操作,同时支持批量处理。 - **货物追踪**:结合GPS定位,实时更新货物位置信息,提供可视化追踪界面。 - **仓库管理**:包括库存控制、入库出库记录,以及库存...

    商业源码-编程源码-起点9 V2.0小说整站系统源码.zip

    起点9 V2.0小说整站系统源码是一款专为商业运营设计的在线阅读平台解决方案。这个源码包含了构建一个完整的小说网站所需的所有组件,包括用户管理、内容管理、支付接口、广告系统以及SEO优化等功能。下面我们将深入...

    shell脚本:我的脚本

    本文将深入探讨shell脚本的核心概念,以及与之相关的技术,如memcached、mongodb、ELK(Elasticsearch、Logstash、Kibana)堆栈、zabbix监控、catcti和MongoDB Shell。 首先,让我们来理解什么是shell脚本。Shell是...

    PHP缓存技术:memcache函数详解

    随着技术的发展,如今更多开发者倾向于使用`memcached`扩展(注意字母d的大小写),它提供了更多的特性和优化,比如支持SASL认证、二进制协议等。 通过理解和熟练运用`memcache`函数,我们可以有效地提升PHP应用...

    IT-运维工程师的23个细节-进阶.doc.docx

    - **Memcached/Mcrouter、Redis/Dynomite/Twemproxy/Codis/SSDB/Aerospike**:这些NoSQL数据库和缓存解决方案提供了高可用性和扩展性。 - **MySQL监控**:包括mytop、orzdba、Percona-toolkit、Maatkit等工具,支持...

Global site tag (gtag.js) - Google Analytics