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

1 getExtendStats 遍历所有item,删除指定的key(不推荐)

网上有对应的php代码和perl程序,感兴趣的可以看看,在本地测试时可以使用,但是在真是服务器上请不要使用。

2 memcache结合DB

方法:每次set缓存时,将key值存入数据库,在要删除缓存时查询数据库,查询出对应的信息,在memcache中将其删除

缺点:浪费数据裤磁盘

3 memcache伪命名空间(推荐)

memcache默认不提供命名空间,但可以设置一个全局变量,来模拟命名空间,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
?php 
    //生成一个用来保存 namespace 的 key 
    $ns_key = $memcache->get("foo_namespace_key"); 
       
    //如果 key 不存在,则创建,默认使用当前的时间戳作为标识
    if($ns_key===false) $memcache->set("foo_namespace_key",time()); 
       
    //根据 namespace_key 生成真正的 key,确保是唯一的key值 
    $my_key = "foo_".$ns_key.$otherParms;
      
    //然后利用拼接的my_key值设置你需要缓存的各种数据
    $memcache->set($my_key,$value,false,expire);
 
    //或者key值获得以前存储的缓存
    $memcaceh->get($my_key);
       
       
    //需要删除整个 namespace 里的对象的时候,如:更改数据库或者删除某些信息后
    //将ns_key的值改变,则以后在访问缓存时,以前时间的将永远不会别访问到,以此来实现批量删除缓存
     $memcache->set("foo_namespace_key",time());
?>

memcache 命令操作

在定位缓存问题测试时,经常需要对memcache的数据进行一些操作,但是其本身没有自带的客户端,所以只能通过telnet来进行操作。

通过telnet连接memcache

telnet 127.0.0.1 11211

memcache写入操作

telnet写入memcache命令格式

 command name> key> flags> exptime> bytes>\r\n data block>\r\n

参数详解:

1. command name> 可以是”set”, “add”, “replace”

set:key>不存在时添加,key>存在时覆盖

add:key>不存在时添加,key>存在时则会操作失败

replace:key>不存在时添加失败,key>存在时替换数据

2. key> 保存数据的key

3. flags> 是一个16位的无符号的整数(以十进制的方式表示)。

该标志将和需要存储的数据一起存储,并在客户端get数据时返回

客户可以将此标志用做特殊用途,此标志对服务器来说是透明的

4. exptime> 过期的时间

0 表示存储的数据永远不过期(但可被服务器算法:LRU 等替换)

n 非0数字(unix时间),当过期后服务器可以保证用户得不到该数据(以服务器时间为标准)

5. bytes> 需要存储的字节数(不包含最后的”\r\n”),当用户希望存储空数据时,可以为0

6. 最后客户端需要加上”\r\n”作为”命令头”的结束标志

7. data block>

紧接着”命令头”结束之后就要发送数据块(即希望存储的数据内容),最后加上”\r\n”作为此次通讯的结束。

telnet 响应命令

当以上数据发送结束之后,服务器将返回一个应答,可能有如下情况:

1. STORED:表示存储成功

2. NOT_STORED: 表示存储失败,但是该失败不是由于错误。

通常这是由于”add”或者”replace”命令本身的要求所引起的,或者该项在删除队列之中。

示例

set key 32 0 10
helloworld
STORED

获取 Key&Value

get key>*

参数详解:

1. key>*: 表示一个或者多个key(以空格分开)

2. \r\n:命令结束

响应结果

服务器端将返回0个或者多个的数据项。每个数据项都是由一个文本行和一个数据块组成。当所有的数据项都接收完毕将收到END\r\n每一项的数据结构:

VALUE key> flags> bytes>
data block>

参数详解:

1. key> 希望得到存储数据的key

2.falg> 发送set命令时设置的标志项

3.bytes>发送数据块的长度(不包含”\r\n”)

4.\r\n 文本行的结束标志

5.data block> 希望接收的数据项。

6.\r\n 接收一个数据项的结束标志。

PS:如果有些key出现在get命令行中但没有返回相应的数据,这意味着服务器中不存在该项,可能是超时了,或者被删除了。

示例

get key VALUE key 32 10 helloworld END

删除KeyValue

delete key> time>

参数详解:

1. key> 需要被删除数据的key

2. time> 客户端希望服务器将该数据删除的时间(unix时间或者从现在开始的秒数)

3. \r\n命令头的结束

检查Memcache服务器状态

stats

在这里可以看到memcache的获取次数,当前连接数,写入次数,已经命中率等;

pid : 进程id
uptime :总的运行时间,秒数
time : 当前时间
version : 版本号
….
curr_items : 当前缓存中的KeyValue数量
total_items : 曾经总共经过缓存的KeyValue数量
bytes : 所有的缓存使用的内存量
….
curr_connections 当前连接数
cmd_get : 总获取次数
cmd_set : 总的写入次数
get_hits : 总的命中次数
miss_hits :  获取失败次数
….
bytes_read : 总共读取的流量字节数
bytes_written : 总的写入流量字节
limit_maxbytes : 最大允许使用的内存量,字节

清空统计数据

stats reset

清除单个key值

delete key

清空所有键值

flush_all

注:flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。

退出

quit     或者   Ctrl + ] 

其他命令

1. 显示各个slab的信息,包括chunk的大小、数目、使用情况等

stats slabs

2. 显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)

stats items

3. 设置或者显示详细操作记录

stats detail [on|off|dump]

参数为on,打开详细操作记录
参数为off,关闭详细操作记录
参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)

4. 显示某个slab中的前limit_num个key列表

stats cachedump slab_id limit_num

显示格式如下:

ITEM key_name> [ <value_length>b; <expire_time access_time="">s]

key_name>:键名
value_length>:值长度(单位字节)
expire_time|access_time>:memcached 1.2.2及以前版本显示的是 访问时间(timestamp)

memcache 缓存的批量删除方案(转)的更多相关文章

  1. Memcached的批量删除方案总结

    Memcached的批量删除,向来是Memcached使用者很头疼的事情,因为Memcached采取的缓存方案是哈希表结构,所以没有办法实现delete from tablename where ke ...

  2. 谈谈使用Redis缓存时批量删除的几种实现

    前言 在使用缓存的时候,我们时不时会遇到这样一个需求,根据缓存键的规则去批量删除这些数据,比较常见的就是按前缀去删除. 举个简单的例子,Redis中现在有几百个商品的数据,这些数据的key值是有一定规 ...

  3. Redis批量删除缓存数据

    背景: 在使用redis中,经常会遇到批量删除缓存的情况,但是对于在客户端中,如果一个一个的删除key,则需要较长时间及相对麻烦,可以使用以下命令,批量删除缓存. 本地批量删除KEY: ./redis ...

  4. iOS开发:一个高仿美团的团购ipad客户端的设计和实现(功能:根据拼音进行检索并展示数据,离线缓存团购数据,浏览记录与收藏记录的批量删除等)

    大致花了一个月时间,利用各种空闲时间,将这个客户端实现了,在这里主要是想记录下,设计的大体思路以及实现过程中遇到的坑...... 这个项目的github地址:https://github.com/wz ...

  5. 在Spring中使用Redis Lua脚本批量删除缓存

    背景 之前分享了一篇利用lua脚本批量删除redis的key的文章.现在项目中我打算使用spring的缓存,而Spring缓存以前我是用ehcache来做实现的.没发现什么问题..这次我换成redis ...

  6. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  7. StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改

    前言 使用StackExchange.Redis没有直接相关的方法进行模糊查询的批量删除和修改操作,虽然可以通过Scan相关的方法进行模糊查询,例如:HashScan("hashkey&qu ...

  8. 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析

    转载自脚本之家 http://www.jb51.net/article/51831.htm  作者:忙碌的松鼠 对于大型网站如facebook,ebay等网站,如果没有Memcache做为中间缓存层, ...

  9. memcached基于socket访问memcache缓存服务器

    memcached基于socket访问memcache缓存服务器 操作memcache常用三种方法: .memcache基于php_memcache.dll扩展(php扩展) .memcached基于 ...

随机推荐

  1. Asp.net设计模式笔记之三:业务逻辑层的组织

    本章内容要点: 1.Transaction Script模式组织业务逻辑 2.Active Record模式和Castle Windsor来组织业务逻辑 3.Domain Model模式来组织业务逻辑 ...

  2. Opencv step by step - 自适应阈值

    上个博客提到的阈值化只是针对图像全局进行阈值化,opencv提供了一个更好的函数cvAdaptiveThreshold,可以做到局部特征的阈值化,这样一来, 整个图像的信息可以被更好的提取. #inc ...

  3. 由外边距合并到BFC

    置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<JavaScript实现Ajax小结> 作者主页:myvin 博主QQ:851399101(点击QQ和 ...

  4. nodejs初学————安装篇(iis8.5+windows8.1)

    nodejs很久前就想玩玩,不过一直没时间,昨晚花了4个小时来捣鼓到iis上架设成功了,废话不说了. PS:我的系统是windows8.1 x64,所以自带iis8.5的,下载的文件也是x64的. N ...

  5. Object C学习笔记19-枚举

    一. 枚举类型 枚举类型是一个基本类型,不能再分为为任何其他的类型.在一般的编程语言中都有枚举(enum)这种数据结构类型.枚举类型主要用于将一个变量限定在特定的范围内.比如一周有七天,那么一周的值就 ...

  6. chrome全局搜索

    在source目录下边: 输入后需要按回车

  7. Zebra_Dialog 弹出层插件

    . Default dialog box, no custom settings. Click here to open. $.Zebra_Dialog('<strong>Zebra_Di ...

  8. 第一章:Javascript语言核心

    本节是javascript语言的一个快速预览,也是本书的第一部分快速预览. 读此书之前,感谢淘宝技术团队对此javascript核心的翻译,感谢弗拉纳根写出此书.感谢你们无私的分享,仅以此笔记献给你们 ...

  9. 一头扎进EasyUI3

    惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 一头扎进EasyUI第11讲 .基本下拉组件 <select id="cc" style=& ...

  10. HOW TO REMOTELY DEBUG APPLICATION RUNNING ON TOMCAT FROM WITHIN INTELLIJ IDEA

    This post would look into how to tackle and debug issues in scenarios where they only occur in produ ...