zoukankan      html  css  js  c++  java
  • 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

    telnet 127.0.0.1 11211

    memcache写入操作

    telnet写入memcache命令格式

     command name> key> flags> exptime> bytes> data block>

    参数详解:

    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> 需要存储的字节数(不包含最后的” ”),当用户希望存储空数据时,可以为0

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

    7. data block>

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

    telnet 响应命令

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

    1. STORED:表示存储成功

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

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

    示例

    set key 32 0 10
    helloworld
    STORED

    获取 Key&Value

    get key>*

    参数详解:

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

    2. :命令结束

    响应结果

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

    VALUE key> flags> bytes>
    data block>

    参数详解:

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

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

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

    4. 文本行的结束标志

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

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

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

    示例

    get key VALUE key 32 10 helloworld END

    删除KeyValue

    delete key> time>

    参数详解:

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

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

    3. 命令头的结束

    检查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)

  • 相关阅读:
    搭建一个免费的,无限流量的Bloggithub Pages和Jekyll入门
    通过扩展方法 链式方法 为MVC 3 视图添加验证
    让移动UI模式设计者获得灵感的10个有用的网站资源
    企业级应用架构(NHibernater+Spring.Net+MVC3)_V1.0
    把博客放在Github
    实例化需求—流程
    nginx+keepalievd,实现负载均衡和故障点切换。keepalived双机热备。
    古城钟楼
    从初步使用该控件到多维数据集控件PivotGridControl
    搜索引擎的评价
  • 原文地址:https://www.cnblogs.com/sandea/p/5390219.html
Copyright © 2011-2022 走看看