memcache 缓存的批量删除方案(转)
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
memcache写入操作
telnet写入memcache命令格式
参数详解:
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”命令本身的要求所引起的,或者该项在删除队列之中。
示例
获取 Key&Value
参数详解:
1. key>*: 表示一个或者多个key(以空格分开)
2. \r\n:命令结束
响应结果
服务器端将返回0个或者多个的数据项。每个数据项都是由一个文本行和一个数据块组成。当所有的数据项都接收完毕将收到END\r\n每一项的数据结构:
参数详解:
1. key> 希望得到存储数据的key
2.falg> 发送set命令时设置的标志项
3.bytes>发送数据块的长度(不包含”\r\n”)
4.\r\n 文本行的结束标志
5.data block> 希望接收的数据项。
6.\r\n 接收一个数据项的结束标志。
PS:如果有些key出现在get命令行中但没有返回相应的数据,这意味着服务器中不存在该项,可能是超时了,或者被删除了。
示例
删除KeyValue
参数详解:
1. key> 需要被删除数据的key
2. time> 客户端希望服务器将该数据删除的时间(unix时间或者从现在开始的秒数)
3. \r\n命令头的结束
检查Memcache服务器状态
在这里可以看到memcache的获取次数,当前连接数,写入次数,已经命中率等;
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 : 最大允许使用的内存量,字节
清空统计数据
清除单个key值
清空所有键值
注:flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。
退出
其他命令
1. 显示各个slab的信息,包括chunk的大小、数目、使用情况等
2. 显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)
3. 设置或者显示详细操作记录
参数为on,打开详细操作记录
参数为off,关闭详细操作记录
参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)
4. 显示某个slab中的前limit_num个key列表
显示格式如下:
key_name>:键名
value_length>:值长度(单位字节)
expire_time|access_time>:memcached 1.2.2及以前版本显示的是 访问时间(timestamp)
memcache 缓存的批量删除方案(转)的更多相关文章
- Memcached的批量删除方案总结
Memcached的批量删除,向来是Memcached使用者很头疼的事情,因为Memcached采取的缓存方案是哈希表结构,所以没有办法实现delete from tablename where ke ...
- 谈谈使用Redis缓存时批量删除的几种实现
前言 在使用缓存的时候,我们时不时会遇到这样一个需求,根据缓存键的规则去批量删除这些数据,比较常见的就是按前缀去删除. 举个简单的例子,Redis中现在有几百个商品的数据,这些数据的key值是有一定规 ...
- Redis批量删除缓存数据
背景: 在使用redis中,经常会遇到批量删除缓存的情况,但是对于在客户端中,如果一个一个的删除key,则需要较长时间及相对麻烦,可以使用以下命令,批量删除缓存. 本地批量删除KEY: ./redis ...
- iOS开发:一个高仿美团的团购ipad客户端的设计和实现(功能:根据拼音进行检索并展示数据,离线缓存团购数据,浏览记录与收藏记录的批量删除等)
大致花了一个月时间,利用各种空闲时间,将这个客户端实现了,在这里主要是想记录下,设计的大体思路以及实现过程中遇到的坑...... 这个项目的github地址:https://github.com/wz ...
- 在Spring中使用Redis Lua脚本批量删除缓存
背景 之前分享了一篇利用lua脚本批量删除redis的key的文章.现在项目中我打算使用spring的缓存,而Spring缓存以前我是用ehcache来做实现的.没发现什么问题..这次我换成redis ...
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改
前言 使用StackExchange.Redis没有直接相关的方法进行模糊查询的批量删除和修改操作,虽然可以通过Scan相关的方法进行模糊查询,例如:HashScan("hashkey&qu ...
- 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析
转载自脚本之家 http://www.jb51.net/article/51831.htm 作者:忙碌的松鼠 对于大型网站如facebook,ebay等网站,如果没有Memcache做为中间缓存层, ...
- memcached基于socket访问memcache缓存服务器
memcached基于socket访问memcache缓存服务器 操作memcache常用三种方法: .memcache基于php_memcache.dll扩展(php扩展) .memcached基于 ...
随机推荐
- WorldWind源码剖析系列:WorldWind如何确定与视点相关的地形数据的LOD层级与范围
1.WorldWind如何确定与视点相关的地形数据的LOD层级与范围? 问题描述:WW中是如何判断LOD层次的呢,即在什么情况下获得哪一层级的数据?是否只通过相机视点的高度进行判断? 问题切入:要解决 ...
- HTML基础 - <base>标签的使用
标签对于不是很熟悉前端的人应该还算是个生面孔吧,粗略讲讲标签的用法. 将相对路径变成绝对路径 这个对于需要借(chao)鉴(xi)别人网页的时候特别有用~ 批量设置target=_blank 当需要对 ...
- [CareerCup] 1.4 Replace Spaces 替换空格
1.4 Write a method to replace all spaces in a string with '%20'. You may assume that the string has ...
- Object-Oriented CSS
1.指导思想: http://oocss.org/ 2.reset.css http://meyerweb.com/eric/tools/css/reset/ 3.normalize.css http ...
- 内置模块加载器(commonjs规范)的使用
index9.html <html><head> <title>模块加载器</title> <script src="jquery-1. ...
- [BZOJ 1486][HNOI2009]最小圈(二分答案+dfs写的spfa判负环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1486 分析:容易想到先二分答案x,然后把所有边的权值-x,那么如果图中存在权值和为0的 ...
- jQuery Mobile学习日记
本次主讲人是王思伦啦啦啦~ 框架特性 jQuery Mobile 以“Write Less, Do More”作为目标,为所有的主流移动操作系统平台提供了高度统一的 UI 框架:jQuery 的移动框 ...
- Tensorflow学习笔记(一):MNIST机器学习入门
学习深度学习,首先从深度学习的入门MNIST入手.通过这个例子,了解Tensorflow的工作流程和机器学习的基本概念. 一 MNIST数据集 MNIST是入门级的计算机视觉数据集,包含了各种手写数 ...
- java操作mysql中的编码问题解决
要注意以下几点 1.在连接mysql数据库时 jdbc:mysql://localhost:3306/xiaonei?useUnicode=true&characterEncoding=utf ...
- java.lang.NoSuchFieldError: deferredExpression
处理:遇到这个异常的时候是用jstl标签,是版本问题,由于MyEclipse添加Java EE5,其中自动包括了jstl1.2的版本,lib中又存在一个jstl1.1.2的jar包,把旧版本的删掉就可 ...