透过stats命令分析Memcached的内部状态

原文:http://www.educity.cn/wenda/360165.html

  telnet 到机器上去 看看memcach状态

  通过stats命令分析Memcached的内部状态 收藏
Memcached有个stats命令,通过它可以查看Memcached服务的许多状态信息。使用方法如下:
先在命令行直接输入telnet 主机名端口号,连接到memcached服务器,然后再连接成功后,输入stats 命令,即可显示当前memcached服务的状态信息。
比如在我本机测试如下:
stats
STAT pid 1552
STAT uptime 3792
STAT time 1262517674
STAT version 1.2.6
STAT pointer_size 32
STAT curr_items 1
STAT total_items 2
STAT bytes 593
STAT curr_connections 2
STAT total_connections 28
STAT connection_structures 9
STAT cmd_get 3
STAT cmd_set 2
STAT get_hits 2
STAT get_misses 1
STAT evictions 0
STAT bytes_read 1284
STAT bytes_written 5362
STAT limit_maxbytes 67108864
STAT threads 1
END
这里显示了很多状态信息,下边详细解释每个状态项:
1. pid: memcached服务进程的进程ID
2. uptime: memcached服务从启动到当前所经过的时间,单位是秒。
3. time: memcached服务器所在主机当前系统的时间,单位是秒。
4. version: memcached组件的版本。这里是我当前使用的1.2.6。
5. pointer_size:服务器所在主机操作系统的指针大小,一般为32或64.
6. curr_items:表示当前缓存中存放的所有缓存对象的数量。不包括目前已经从缓存中删除的对象。
7. total_items:表示从memcached服务启动到当前时间,系统存储过的所有对象的数量,包括目前已经从缓存中删除的对象。
8. bytes:表示系统存储缓存对象所使用的存储空间,单位为字节。
9. curr_connections:表示当前系统打开的连接数。
10. total_connections:表示从memcached服务启动到当前时间,系统打开过的连接的总数。
11. connection_structures:表示从memcached服务启动到当前时间,被服务器分配的连接结构的数量,这个解释是协议文档给的,具体什么意思,我目前还没搞明白。
12. cmd_get:累积获取数据的数量,这里是3,因为我测试过3次,第一次因为没有序列化对象,所以获取数据失败,是null,后边有2次是我用不同对象测试了2次。
13. cmd_set:累积保存数据的树立数量,这里是2.虽然我存储了3次,但是第一次因为没有序列化,所以没有保存到缓存,也就没有记录。
14. get_hits:表示获取数据成功的次数。
15. get_misses:表示获取数据失败的次数。
16. evictions:为了给新的数据项目释放空间,从缓存移除的缓存对象的数目。比如超过缓存大小时根据LRU算法移除的对象,以及过期的对象。
17. bytes_read:memcached服务器从网络读取的总的字节数。
18. bytes_written:memcached服务器发送到网络的总的字节数。
19. limit_maxbytes:memcached服务缓存允许使用的最大字节数。这里为67108864字节,也就是是64M.与我们启动memcached服务设置的大小一致。
20. threads:被请求的工作线程的总数量。这个解释是协议文档给的,具体什么意思,我目前还没搞明白。
总结:stats命令总体来说很有用,通过这个命令我们很清楚当前memcached服务的各方面的信息。除此之外,我还没有其他方法可以知道这些状态信息。可能还有其他途径,可能我对memcached组件还不太熟悉吧。

  --------------------------------操作分割线-------------------------------------------------

  在测试用Memcached组件缓存对象的时候,发现总是无法正确存储,保存的地方也没有报告任何异常,从服务器控制台看到的信息也没有保存成功的信息,但是取数据的时候,取出来的也是空的,在获取user对象name属性的地方抛出了空指针异常。很显然没有保存成功,这是为什么呢?昨天用字符串测试都OK,今天用对象就不行了呢?Memcached不号称是内存对象缓存组件吗?

  想了下,终于知道为什么了?因为Memcached有独立的服务器端组件,是独立于应用系统的,从客户端(应用系统)保存对象到memcached是必须通过网络传输,而网络传入都是2进制数据,所以必须经过序列化,否则无法存储到Memcached服务器端的缓存中。而昨天测试的字符串成功是因为Java的String对象本身已经实现了序列化接口。于是将需要缓存的User对象序列化处理,然后再次测试,一切OK.

  部分测试代码如下:

  public void put(String key,Object value)
  { 
   long start = System.nanoTime();
   memcachedClient.set(key, value); 
    System.out.println("put time :" + (System.nanoTime()-start)/1000000D);
  }

  public User get(String key)
  { 
   long start = System.nanoTime();
   User obj = (User)memcachedClient.get(key);
    System.out.println("get time :" + (System.nanoTime()-start)/1000000D);
    return obj;
  }

  public static void main(String[] args)
  {   
   CacheClient cache = new CacheClient();
   User user = ObjectFactory.createUser(32);
   cache.put("32", user);
   user = cache.get("32");
   System.out.println(user.getName());
  }

  

java memcached 客启端的调用

  java memcached 客启端的调用

  2.1 下载客户端jar 包java_memcached-release_X.x.jar

  可下载最新

三、简单Demo

  建工程、拷jar 包、再拷下面代码。

  package comcache;

import java.util.Date;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

public class SimpleMemCachedClient {

  protected static MemCachedClient mcc = new MemCachedClient();
  protected static SockIOPool sUpool = null;
  static {
    String[] servers = { "localhost:11211" };
    Integer[] weights = { 3, 3, 2 };

    sUpool = SockIOPool.getInstance();
    sUpool.setServers(servers);
    sUpool.setWeights(weights);
    sUpool.setMaintSleep(30);
    sUpool.setNagle(false);
    sUpool.setSocketTO(3000);
    sUpool.setSocketConnectTO(0);
    sUpool.initialize();
  }

  public static void main(String[] args) {
    mcc.set("testKey", "This is a test String",
        new Date(new Date().getTime() + 10000));// 过期时间为10秒
    String bar = mcc.get("testKey").toString();

    System.out.println("testKey--$amp;>quot;$ + bar);
    while (true) {
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(mcc.get("testKey"));
    }
  }
}

  Demo 成功后就讲 下面两个类的一些设置参数:SockIOPool 、MemCachedClient

四、SockIOPool 是socket 连接池类

  setServers(String[] servers) :设置服务器信息数组;

  setWeights(String[] weights) :设置服务器权重数组;

  setInitConn(int count) :设置初始连接数;

  setMinConn(int minConn) :设置最小连接数;

  setMaxConn(int maxConn) :设置最大连接数;

  setMaxIdle(long arg0) :设置最大处理时间;

  setMaintSleep(long arg0) :主线程的睡眠时间;

  initialize() :初始化连接池。

五、MemCachedClient 类及其常用方法

  add(String key, Object value) :添加一个键值对到缓存中;

  add(String key, Object value,Date expires) :添加一个键值对到缓存中,并设置其超时时间;

  set(String key, Object value) :在缓存中设置一个键的值;

  set(String key, Object value, Date expires) :在缓存中设置一个键的值,并设置其超时时间;

  get(String key) :获得某个键的值。

  incr(String key) :为某个键上的值执行+1 操作;

  decr(String key) :为某个键上的值执行-1 操作;

  replace(String key, String value) :将某个键的值替换成新的值;

  replace(String key, String value, Date expires) :将某个键的值替换成新的值,并设置其超时时间。

  六、Memcached 优化

  可以参考:hyj_dx 

  1、客户端在与 memcached 服务建立连接之后,进行存取对象的操作,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

  2、当存入cached的数据超过了cached的容量后会将最长时间没调用的对象挤出,这正好应征了cached的特征。

  3、利用memcached常用的做法:在每取得一次cached对象后,重新设置这个对象的cache时间,这样能够使得经常被调用的对象可以长期滞留在缓存中,使得效率增倍。

  memcached 技术配置参数研究

  failover表示对于服务器出现问题时的自动修复。
initConn初始的时候连接数,
minConn表示最小闲置连接数,
maxConn最大连接数,
maintSleep表示是否需要延时结束
nagle是TCP对于socket创建的算法,
socketTO是socket连接超时时间,
aliveCheck表示心跳检查,确定服务器的状态。
Servers是memcached服务端开的地址和ip列表字符串,
weights是上面服务器的权重,必须数量一致,否则权重无效
可从以下几方面考虑优化
1. 重新设置配置参数。
2. 尽量使用小容量的数据内容.
3. 增加memcached提高服务获取的内存总量、提高命中率。
4. 可以采用多个memcache服务进行侦听,分开处理,针对服务提供的频繁度划分服务内存
5. 根据服务器的性能不同设置权重 weights
6. 对需要使用memcache服务的机器ip,服务端做访问限制。
避免memcached里的数据不会被别有心意的人再利用,或责保证服务器的内存不被漫天遍地的垃圾数据所堆积,造成命中极低
7. 优化memcached客户端的代码。

  、、、、、、、、、、

  七、小技巧

  h 显示帮助

  -p 监听的端口

  -l 连接的IP地址, 默认是本机

  -d start 启动memcached服务

  -d restart 重起memcached服务

  -d stop|shutdown 关闭正在运行的memcached服务

  -d install 安装memcached服务

  -d uninstall 卸载memcached服务

  -u 以的身份运行 (仅在以root运行的时候有效)

  -m 最大内存使用,单位MB。默认为64MB

  -M 内存耗尽时返回错误,而不是删除项

  -c 最大同时连接数,默认为1024

  -f 块大小增长因子,默认为1.25

  -n 最小分配空间,key+value+flags默认为48

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值