清除memcache中的缓存一些方法总结
以前有同事需要我清除memcache缓存,我总是直接使用kill命令结束掉这个进程,后来才知道有更简单的方法,来清除memcachd的缓存,记录一下,以备不时之需:
1.首先使用ssh命令登录到memcached所在服务器,命令如下:
代码如下 | 复制代码 |
#ssh root@192.168.1.1 |
输入root密码后可登录对应的服务器;
2.使用telnet命令后接tomcat服务配置文件中指定的memcached启动端口:
代码如下 | 复制代码 |
#telnet localhost 11211 |
之后显示:
Trying 127.0.0.1…
Connected to localhost.localdomain (127.0.0.1).
Escape character is ‘^]’.
3.此时输入如下内容并回车即可清除缓存内容:
代码如下 | 复制代码 |
flush_all |
4.最后退出telnet使用quit命令,再exit退出远程主机。
清除过期缓存
代码如下 | 复制代码 |
/** * Memcached的过期内存回收 */ class mem_dtor extends Memcache { private $server_id; public function __construct($host,$port) { $this->server_id = "$host:$port"; $this->connect($host,$port); } // 回收所有过期的内存 public function gc() { $t = time(); $_this = $this; $func = function($key,$info) use ($t,$_this) { if($info[1] - $t delete($key); } }; $this->lists($func); } // 查看所有缓存内容的信息 public function info() { $t = time(); $func = function($key,$info) use ($t) { echo $key,' => Exp:',$info[1] - $t,"n"; //查看缓存对象的剩余过期时间 }; $this->lists($func); } private function lists($func) { $sid = $this->server_id; $items = $this->getExtendedStats('items'); //获取memcached状态 foreach($items[$sid]['items'] as $slab_id => $slab) //获取指定server id 的 所有Slab { $item = $this->getExtendedStats('cachedump',$slab_id,0); //遍历所有Slab foreach($item[$sid] as $key => $info) //获取Slab中缓存对象信息 { $func($key,$info); } } } } $mem = new mem_dtor('127.0.0.1',11211); $mem->info();//查看状态 $mem->gc(); //回收 |
memcache缓存的批量删除方案
memcache默认只支持使用delete(key)和 flush_all,这两种方法都太极端了,不能满足用户的特定需求,如:批量删除‘aaaaaaaa_'开头的所有缓存,这个时候该怎么办?
1 getExtendStats 遍历所有item,删除指定的key(不推荐)
网上有对应的php代码和perl程序,感兴趣的可以看看,在本地测试时可以使用,但是在真是服务器上请不要使用。
2 memcache结合DB
方法:每次set缓存时,将key值存入数据库,在要删除缓存时查询数据库,查询出对应的信息,在memcache中将其删除
缺点:浪费数据裤磁盘
3 memcache伪命名空间(推荐)
memcache默认不提供命名空间,但可以设置一个全局变量,来模拟命名空间,代码如下:
代码如下 | 复制代码 |
//生成一个用来保存 namespace 的 key
|
以上是个人见解,欢迎拍板