`
robbin
  • 浏览: 4821564 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:137077
社区版块
存档分类
最新评论

贴一段遍历memcached缓存对象的小脚本

    博客分类:
  • Tech
阅读更多
memcached因为性能的缘故,没有提供遍历整个缓存当中对象的功能,不过memcached也提供了很多命令来监控memcached的状态,例如stats命令就有:

stats
stats reset
stats malloc
stats maps
stats sizes
stats slabs
stats items
stats cachedump slab_id limit_num
stats detail [on|off|dump]


不一一详细解释了,比较有价值的是stats items和stats cachedump,以及stats detail dump这几个命令,用前两条命令,实际上我们可以遍历整个memcached缓存(尽管效率低下),后一条命令则可以显示最近memcached当中对缓存对象的详细操作情况。

因为我想详细了解一下JavaEye在线运行的memcached服务器当中缓存对象的详细情况,所以花了几十分钟用ruby写了一个小脚本,用来方便的统计缓存对象,此外它还可以让你方便的发送stats命令。用法很简单:

1、统计memcached server当中的对象:

./memcached.rb

输出的结果大致是这样的:

Problem : 4564
GroupPost : 5643
User : 27133
Group : 144
...
Post : 44442
PostText : 255286
......
views : 36260
Forum : 27
Category : 15065

可以告诉你每个对象缓存的确切数量,比方说PostText被缓存了25万个对象,页面被缓存了3.6万个。这个统计方法是根据Rails内置的Cache生成的key做的解析,也许你要根据自己的应用调整一下解析代码。

2、统计memcached的对象和对象的大小

./memcached.rb stats sizes

3、监控memcached的缓存操作情况
./memcached.rb stats detail on
./memcached.rb stats detail dump
./memcached.rb stats detail off

以下是该脚本的源代码,写的很粗糙。

#!/usr/bin/env ruby
require 'socket'

# stats
# stats reset
# stats malloc
# stats maps
# stats sizes
# stats slabs
# stats items
# stats cachedump slab_id limit_num
# stats detail [on|off|dump]

class Memcache
  class << self
    def open(host, port)
      s = TCPSocket.open(host, port)
      yield s if block_given?
    ensure
      s.close if s
    end
  
    def command(command_string, s)
      s.send(command_string + "\r\n", 0)
      buff = []
      until ["END", "OK", "DELETE", "ERROR"].include?(line = s.gets.strip) do
        buff << line 
      end
      buff
    end
  
    def exec(command_string, host = "javaeye", port = 11211)
      open(host, port) { |socket| command(command_string, socket).each {|line| puts line } }
    end
    
    def cache_stats(host = "javaeye", port = 11211)
      cache_objects = {}
      open(host, port) do |socket|
        slabs = []
        command("stats items", socket).each do |line|
          slab_id = line.split[1].split(":")[1].to_i
          slabs << slab_id unless slabs.include?(slab_id)
        end
        slabs.each do |slab_id|
          puts "browse slab #{slab_id}..."
          command("stats cachedump #{slab_id} 0", socket).each do |item|
            key = item.split[1].split("/")[0].to_s
            cache_objects.include?(key) ? cache_objects[key] += 1 : cache_objects[key] = 1
          end
        end
      end
      cache_objects.each_pair {|key, value| puts "#{key} : #{value}"}
    end
  end
end

if ARGV.size == 0
  Memcache.cache_stats
else
  Memcache.exec(ARGV.join(" "))
end
分享到:
评论
8 楼 student007 2012-01-20  
我使用的 组件 是 xmemcached
7 楼 student007 2012-01-20  
你好,我的需求是 获取memcached中的 所有key 及其对应值,
我在 服务端 使用stats 命令 看到的 STAT curr_items 2362349 ,
通过使用getKeyIterator 方法,却只获得了 39607 个 key。
请问 这事怎么回事?
我的邮件 490836924@qq.com 谢谢
6 楼 robbin 2008-10-23  
ahuaxuan 写道

请教robbin大哥,我记得memcachetool可以移动slab中page到另一个slab中,这个是用什么命令呢
-------------------------------------------

找到了,是 slabs reassign #{from} #{to} \r\n

问题是只有一个slab满了才能把其他slab中的page移动过来,看来这个操作的前提条件还是比较严格的


我们JavaEye的memcached server是所有的slab都满了,缓存命中率又很高,达到了96%。所以一直没有机会用上这个命令,呵呵。
5 楼 ahuaxuan 2008-10-23  
请教robbin大哥,我记得memcachetool可以移动slab中page到另一个slab中,这个是用什么命令呢
-------------------------------------------

找到了,是 slabs reassign #{from} #{to} \r\n

问题是只有一个slab满了才能把其他slab中的page移动过来,看来这个操作的前提条件还是比较严格的
4 楼 hank 2008-10-22  
你好,我现在要使用memcached,目前正在为key如何定义犯难。主要问题在于如何保证从memcached中取出的和数据库中的保持一致,因为同一表同一字段的数据可以用不同的sql获取,如果进行了修改,如何才能保证memcached中的也都修改了呢?请指点迷津!!!谢谢
3 楼 zhtxc 2008-10-15  
  
2 楼 zhtxc 2008-10-15  
[url][/url][flash=200,200][/flash]

    [*]

    [*]

    [*]

    [*]
1 楼 wangxuliangboy 2008-10-13  
你好,请问能不能把这两个命令(stats items和stats cachedump)遍历的过程说一下
不过通过stats detail dump也可以拿到所有的KEY,应该也可以遍历

相关推荐

    .net c# memcached缓存获取所有缓存键的方法步骤.docx

    Memcached 是一种流行的分布式缓存系统,广泛应用于各种 Web 应用程序中。.NET 平台下的 Memcached 客户端实现了对 Memcached 服务器的访问和操作。本文将详细介绍如何使用 .NET C# 语言实现 Memcached 缓存获取所有...

    php memcached缓存操作类

    在PHP开发中,缓存是提高网站性能的关键技术之一,Memcached是一款广泛应用的分布式内存对象缓存系统。这个“php memcached缓存操作类”旨在简化开发者对Memcached的使用,提供一个方便、高效的接口来处理数据缓存。...

    memcached缓存使用演示

    Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。它通过将数据存储在内存中,使得数据的读取速度大大提高,尤其在处理高并发请求时表现卓越。 ### ...

    搭建Memcached缓存服务器1

    `OPTIONS`参数用于设置Memcached缓存服务器的连接参数,例如`OPTIONS=”-1 127.0.0.1”`表示只能从本机访问Memcached缓存服务器。 5. 启动Memcached缓存服务器 使用service命令启动Memcached缓存服务器,命令如下:`...

    Memcached内存对象缓存

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...

    韩顺平 PHP Memcached缓存技术资料源码笔记图解PPT_Ady

    Memcached是一款分布式内存对象缓存系统,广泛应用于高性能网站和应用中。它设计的目标是简化并加速动态Web应用程序的数据存储,通过将数据存储在内存中,避免频繁读取或写入数据库,从而提高系统响应速度。 二、...

    memcached缓存处理

    `memcached`是一个高性能、分布式内存对象缓存系统,用于在动态系统中减少数据库负载。它通过将数据存储在内存中来加速读取操作,而不是每次请求都去查询数据库。由于其轻量级的设计和简单易用的接口,memcached被...

    使用spring aop对web 应用数据进行memcached缓存

    标题 "使用Spring AOP对Web应用数据进行Memcached缓存" 涉及到的关键技术是Spring AOP(面向切面编程)和Memcached,这是一种常见的高性能、分布式内存对象缓存系统。在Web应用程序中,使用缓存可以显著提高数据访问...

    memcached 缓存图片

    Memcached是一种高性能、分布式内存对象缓存系统,用于在动态应用中减少数据库负载,提高网站性能。它通过在内存中存储数据,使频繁访问的数据能够快速获取,从而减少了对硬盘I/O操作的依赖。在本示例中,我们将探讨...

    MemCached 缓存系统配置说明

    这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统,但是其实Memcached服务端本身是单实例的,只是在客户端实现过程中可以根据存储的主键做分区存储,而这个区就是Memcached服务端的一个或者多个...

    memcached缓存

    memcached 缓存 jar包,tomcat共享缓存可用,java开发数据库缓存也可用。

    Memcached缓存机制 用好Cache,优化应用

    Memcached是一款高性能、分布式的内存对象缓存系统,主要用于加速Web应用程序,通过将数据存储在内存中,减少对数据库的直接访问,从而提高系统的响应速度和效率。Memcached的设计理念是简单、快速,它支持多种编程...

    php memcached 缓存

    Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高网站的响应速度。PHP与Memcached的结合,使得开发者能够轻松地在PHP应用中实现数据缓存。 ### Memcached的...

    memcached缓存服务器

    Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。这个“memcached缓存服务器”压缩包提供的版本是1.2.1,适用于Windows 32位系统。 **一、...

    缓存服务器memcached下载

    Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库负载,提高页面加载速度,从而显著提升网站的整体性能。Memcached的设计理念是简单而高效,它将数据存储在内存中,通过...

    SSM整合memcached缓存

    Memcached是一款轻量级的分布式内存对象缓存系统,用于减少数据库负载,提高应用程序性能。在SSM项目中集成Memcached,可以显著提升数据读取速度,降低对数据库的依赖。 首先,让我们深入了解一下SSM框架: 1. ...

    memcached缓存服务器64位

    memcached缓存服务器 ,64位安装包 ,内有简单的使用说明

    Memcached缓存技术资料源码

    Memcached是一款高性能的分布式内存对象缓存系统,它被广泛应用于Web应用中,用于缓解数据库的压力,提高数据访问速度。本文将深入探讨Memcached的基本概念、工作原理、安装配置、使用方法以及源码分析。 **一、...

Global site tag (gtag.js) - Google Analytics