Memcached的批量删除方案总结
Memcached的批量删除,向来是Memcached使用者很头疼的事情,因为Memcached采取的缓存方案是哈希表结构,所以没有办法实现delete from tablename where key like ‘%XX%’类似这样的批量删除功能。所以不得不自己采取一些策略实现批量删除。常见的删除方案主要有以下两种:
第一种方案:通过记录KEY到DB然后循环删除。
其实这也是最常规的删除方法,最容易想到,可能大部分人首先都会这么考虑。具体方法如下:
1. 添加业务数据时,在向Memcached缓存set数据的时候,将其key记录到数据库(或内存中,或文件中,由于数据量大,内存中基本不可行),也就是每set一条数据到Memcached缓存中,就向记录key的数据表(这类专门用于辅助删除缓存的表可以按业务分类建表,为了方便,我们下文简称keytable,因为不可能所有的key都用一张表,即使按业务分类建,数据量也是很庞大的)insert一条记录。数据表结构可以设计为这两个字段:key(对应缓存key), id(对应业务实体id),这里的存储id主要是方便批量查询出需要从缓存删除的KEY时方便,也可以根据实际业务设计。
2. 删除业务数据时,首先从数据库的业务数据表删除数据,然后从keytable 中查询出keyList.查询语句类似,select key from keytable where 条件 ,再然后循环keyList从Memcached缓存中remove掉相应的记录,最后删除keytable表中相应的记录,删除语句类似delete key from keytable where 条件.
这种方法的优点:方案设计思路简单,符合常规思维,而且能达到精确删除的目的。
这种方法的缺点:删除代价比较高,需要数据库或其他存储介质辅助,而且实际应用中,缓存量是很大的,会导致大量频繁的对keytable表的insert操作,性能问题将会很严重,需要根据具体情况运用。
第二种方案:利用Memcached的LRU算法进行懒清理
这种方案主要是利用Memcached缓存根据LRU算法进行定期自动清理不用或少用的缓存,通过对key增加版本管理来实现。
该方案的具体方法如下(拿商品数据举例说明):
1. 对缓存中的每个key进行版本管理,比如缓存商品数据的key为product_10001.0,这里的product表示商品这类业务数据,product_10001表示具体的商品对象10001,0表示版本号。
2. 在Memcached中维护一版本记录数据,这个很简单,比如整个系统只有商品,订单,用户这三类缓存数据,则在Memcached中只维护三个key,类似product_version,book_version,user_version.他们的取值范围为0-99之间循环,之所有循环是防止数据版本多了无限增大,管理麻烦,而且数字大了占用空间大(要对应到每个key的值)。
3. 删除商品数据时,首先从数据库删除对应商品数据的记录。然后更新对应商品的版本:product_version = product_version+1(记得当product_version=99时,product_version=0)。
4. 从Memcached中get数据时,需要get两次,首次按get对应业务数据的版本号,如product_version,然后根据数据本身的key+ 最新的product_version作为真正的key去取数据。这样删除了的数据自动为过期数据,Memcached会根据LRU算法清理。
5. 向Memcached中set数据时,也是先取最新的product_version,然后将数据本身的key+product_version作为key保存数据到缓存。
这种方案的优点:减少了批量删除从Memcached真正删除数据的麻烦。利用Memcached自身的特点解决删除问题,符合Memcached的设计思想。
这种方案的缺点:a.每次set数据都要,先get版本,然后set,性能上差不多降低了1倍,虽然性能方面还是不错。不过这个问题好像没有办法解决,原先考虑在客户端缓存版本,因为版本毕竟不是时时都变,但是考虑到版本数据时多进程间共享数据,所以不能这样做,每次必须从Memcached中取版本。否则难以保证是最新的。b.这种方案对内存上有点浪费,虽然Memcached会根据LRU算法清理低版本的垃圾数据,但是毕竟不是实时清理,所以必然浪费内存,所以内存不足的情况下,要仔细考虑采取此方案。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chuan122345/archive/2010/01/05/5134509.aspx
Memcached的批量删除方案总结的更多相关文章
- memcache 缓存的批量删除方案(转)
memcache 默认只支持使用delete(key)和 flush_all,这两种方法都太极端了,不能满足用户的特定需求,如:批量删除‘aaaaaaaa_’开头的所有缓存,这个时候该怎么办? 1 g ...
- memcached的最佳实践方案(转)
基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 ...
- memcached的最佳实践方案
基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 ...
- EntityFramework:支持同一事务提交的批量删除数据实现思路
一切从一段代码说起... 下面一段代码是最近我在对一EF项目进行重构时发现的. protected override void DoRemove(T entity) { this.dbContext. ...
- LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S. 以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...
- stark组件的分页,模糊查询,批量删除
1.分页组件高阶 2.整合展示数据showlist类 3.stark组件之分页 3.stark组件之search模糊查询 4.action批量处理数据 4.总结 1.分页组件高阶 1.分页的class ...
- php批量删除
php批量删除可以实现多条或者全部数据一起删除 新建php文件 显示数据库中内容: <table width="100%" border="1" cell ...
- confirm对话框取消后阻止ajax操作、ajax做批量删除
在做批量删除的时候,需要用confirm弹出一个提示框让用户确认是否删除,点击确定,执行操作,点击取消,取消操作.但是如果使用ajax把选中项的主键值传到处理页面处理时,如果使用下面的方法将confi ...
- mybatis批量删除提示类型错误
一. 这里主要考虑两种参数类型:数组或者集合. 而这点区别主要体现在EmpMapper.xml文件中标签的collection属性: 当collection="array"时,表名 ...
随机推荐
- Go语言-并发模式-goroutine池实例(work)
介绍 使用无缓冲的通道来创建一个 goroutine 池,这些 goroutine 执行并控制一组工作,让其并发执行.在这种情况下,使用无缓冲的通道要比随意指定一个缓冲区大小的有缓冲的通道好,因为这个 ...
- 光纤卡网卡的区别以及HBA的常规定义-----引自百度百科
在讨论这个问题的时候,需要先说清楚一个问题:我们知道,在早期的SAN存储系统中,服务器与交换机的数据传输是通过光纤进行的,因为服务器是把SCSI指令传输到存储设备上,不能走普通LAN网的IP协议,所以 ...
- 使用idea出现的错误
错误:打开maven项目时出现"程序包 com.sun.org.apache.xpath.internal 不可见 "的错误 这个问题出现的原因是: jdk版本的问题.可能是因为有 ...
- Java 语句while、do while、for循环、嵌套、for与while的区别、break continue(3)
for循环语句,双从for嵌套: /* for(初始化表达式:循环条件表达式:循环后的操作表达式) { 执行语句: } */ /*1,变量有自己的作用域.对于for来讲:如果将用于控制循环的增量定义在 ...
- storm 机制
storm基础系列之二----zookeeper的作用 https://www.cnblogs.com/xyang/p/5643745.html Zookeeper+Storm集群搭建 https:/ ...
- 基于SpringBoot框架企业级应用系统开发全面实战
Eclipse 安装spring-tool-suite教程,并创建一个新的springboot项目 使用SpringBoot构建项目,加载SSM整合的applicationContext.xml的注解 ...
- JQuery局部刷新与全页面刷新
局部刷新: 这个方法就多了去了,常见的有以下几种: $.get方法,$.post方法,$.getJson方法,$.ajax方法如下 前两种使用方法基本上一样 $.get(”Default.php”, ...
- 蓝桥杯2015-省赛-C/C++-A组2题 星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标.每个炸弹都可以设定多少天之后爆炸.比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸.有一个贝塔 ...
- Iptables用法规则及防火墙配置
[转载]http://www.cnblogs.com/yi-meng/p/3213925.html iptables规则 即防火墙规则,在内核看来,规则就是决定如何处理一个包的语句.如果一个包符合条 ...
- 使用tcpdump查看HTTP请求响应 详细信息 数据
安装tcpdump: sudo yum install tcpdump 查看get请求: tcpdump -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] &a ...