2019独角兽企业重金招聘Python工程师标准>>>

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算法清理低版本的垃圾数据,但是毕竟不是实时清理,所以必然浪费内存,所以内存不足的情况下,要仔细考虑采取此方案。

转载于:https://my.oschina.net/HuifengWang/blog/296645

Memcached如何实现高性能批量删除相关推荐

  1. php redis删除所有key,redis中批量删除key的方法

    Redis是一个高性能的key-value数据库.redis中可以借助Linux的xargs指令来批量删除key,也可以使用flushdb和flushall命令删除所有key. 批量删除Key Red ...

  2. memcache 缓存的批量删除方案(转)

    memcache 默认只支持使用delete(key)和 flush_all,这两种方法都太极端了,不能满足用户的特定需求,如:批量删除'aaaaaaaa_'开头的所有缓存,这个时候该怎么办? 1 g ...

  3. tp5批量删除ajax,tp5.1批量删除商品

    选中要删除的商品,点击批量删除 先在控制器使用sql语句查出商品信息goods 然后在html源码中使用goods变量. {foreach $goods as $item} 1232324 {/for ...

  4. redis批量删除keys

    如何批量删除Redis下特定pattern的keys DEL删除给定的一个或多个key,不存在的key会被忽略,返回值:被删除key的数量 DUMP序列化给定key,返回被序列化的值,使用RESTOR ...

  5. redis批量删除数据

    如何批量删除Redis下特定pattern的keys DEL删除给定的一个或多个key,不存在的key会被忽略,返回值:被删除key的数量 DUMP序列化给定key,返回被序列化的值,使用RESTOR ...

  6. 用Python在Windows或Linux下批量删除文件夹中指定的文件

    情况说明:当在一个文件夹下面有好几十个或几百个文件需要删除,此时一一去挑选费时费力,特别是在Linux下面.因此,需要批量删除文件. 对训练样本(图像)和测试样本(图像)进行评估时候,需要查看是数据本 ...

  7. 删除空值_空白单元格行,如何快速批量删除?简单方法,效率飞升

    EXCEL进阶课堂 · 简单却不知道 系列文章持续推送!各位小伙伴,EXCEL的日常操作中,有许多功能使用频率很高,可是绝大多数人只使用到其最基本的功能,对于其背后的强大拓展功能知之甚少,更不说使用它 ...

  8. py-redis中的批量删除key方法

    py-redis中有个delete接口,既可以删除单个key,也可以批量删除key,后者的正确用法网上很少,我在实践中遇到该问题,特此记录一下. 网上的资料,大多都是这样的 r.delete('age ...

  9. 在Hibernate中处理批量更新和批量删除

    批量更新是指在一个事务中更新大批量数据,批量删除是指在一个事务中删除大批量数据.以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段: 如果CUST ...

  10. R语言使用caret包的findCorrelation函数批量删除相关性冗余特征、实现特征筛选(feature selection)、剔除高相关的变量

    R语言使用caret包的findCorrelation函数批量删除相关性冗余特征.实现特征筛选(feature selection).剔除高相关的变量 目录

最新文章

  1. JAVA批量上传下载Excel_如何实现批量上传----------Java解析excel
  2. 深度学习100例-卷积神经网络(CNN)识别眼睛状态 | 第17天
  3. VuePress 手摸手教你搭建一个类Vue文档风格的技术文档/博客
  4. 让浏览器变身代码编辑器
  5. 线程的互斥与同步机制
  6. SpringBoot查看和修改依赖的版本
  7. MyBatis全局配置文件MyBatis-config.xml代码
  8. sql string转number_少用 string.Format
  9. 8 年经验面试官详解 Java 面试秘诀!
  10. QTreeView使用系列教程目录
  11. linux java目录 语法_Linux 文件和目录的属性
  12. 360安全浏览器安装插件源文件存放位置
  13. ListView--QQ联系人样式
  14. Date对象在Safari与IOS中的“大坑”
  15. html中的innerHTML的用法
  16. #LeetCode每日一题#的阶段回顾
  17. 高级OWI与ORACLE性能调整读书笔记之UPDATE/UPADTE引起的buffer busy wait
  18. 第六届蓝桥杯B组C++省赛题解。
  19. 解决GitHub release下载慢、clone和push慢的问题
  20. 苹果哪几个型号无服务器,苹果手机一共有几个型号?

热门文章

  1. C#中获取今天是星期几
  2. XML内容要有根标签:Extra content at the end of the document
  3. 火狐插件 Katalon Recorder 生成 python 等语言 代码
  4. Layer单选框非空校验注意
  5. 学校计算机的使用作文,电脑课上作文(3篇)
  6. LINUX编译java3d/j3d
  7. 悄悄安装vcredist_x64.exe,不弹出对话框
  8. mod_signalwire.c:371 Curl Result 1, Error: Protocol https not supported
  9. 不要安排看代码的工作
  10. 错误解决:src/cpp/cuda.hpp:  fatal error: cuda.h