`
寻找出路的苍蝇
  • 浏览: 34393 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多

Memcached是什么?

Memcached是一个高性能的、分布式的内存对象的Key-Value缓存系统,它能减少数据库负载,为动态Web应用提速。

Memcached是分布式的,它是基于网络的,也就是说,Mecmcached通常是以独立的进程部署到独立的服务器上,用于为业务应用提供动态缓存服务,对Memcached服务器的访问一定是通过网络进行的。

Memcached本身是用C实现的,通常以集群方式部署到多台服务器上,对客户端提供分布式缓存服务。

Memcached是一个对象缓存系统,它会自主管理服务器的内存,为数据分配合适的存储空间,尽可能高效地利用空间。

Memcached即可以缓存原始数据类型,也可以缓存序列化的对象。

注意:客户端访问Memcached集群时,具体选择集群中的哪台服务器来存储数据,这个策略不是由Memcached本身提供的,而是由客户端实现的,客户端会选择合适的算法确定访问哪台服务器。

另外,Memcached以Key-Value存取数据,K-V是一种扁平结构,所以要特别注意Key的唯一性问题。如果用同一个Key值存储数据,那么先前该Key的值将被覆盖。建议实际使用时按一定规则来分配Key。

Memcached适合什么场合?

通常可用作数据库的前端Cache,以减轻数据库的负载。

如果一个Web应用中对数据库的访问非常频繁,而且多数的查询都是一样的,这种情况下最适合使用Memcached作为前端缓存。虽然数据库本身也是有Cached的,但是依然需要解析SQL、完成一些必要的辅助操作、格式化查询结果等。而如果把查询结果格式化后直接放到Memcached中,那么对于同一个查询,则根本无须访问数据库,直接从Memcached中取出格式化的结果数据返回给客户端即可,如此可大大减轻数据库服务器的压力。

Memcached是分布式的内存缓存系统,如果应用不是分布式的,则根本无须使用Memcached。因为Memcached服务必须是通过网络访问,而且客户端与Memcached服务之间的通信还要遵循Memcached定义的协议,对于非分布式的简单Web应用而言,使用Memcached可能会加重服务器的负载,性能反而降低。

 

Memcached协议要点(文本协议)

  • 建议客户端缓存TCP链接以节省创建的开销
  • 协议中有两种类型的数据:文本和非结构化数据,前者用来表示命令或服务端客户端交互,后者用来表示被缓存的数据。所以服务端不去管客户端存进来的是什么,当客户端来取时,只是以字节流的形式原样返还。
  • 上述两种数据类型都会以'\r\n'结束,由于被缓存的对象里也有可能含有\r\n,所以客户端应该以数据长度作为对象结束的依据,而不是\r\n
  • key用来标识存进memcached的对象,key是一个长度小于250的字串,且不能含有控制字符或空格
  • 一些命令中可以有过期时间,这个时间是一个整数值,如果大于60*60*24*30(30天),它将被作为一个Unix时间
  • 错误代码一共有三种
    1. "ERROR\r\n" 表示客户端发送了一个不存在的命令
    2. "CLIENT_ERROR <error>\r\n" 表示客户端的命令格式不正确
    3. "SERVER_ERROR <error>\r\n" 表示服务端错误。当严重的错误发生时,服务端在发送完这个响应后会关闭链接

服务器端主要命令

存储命令

set|add|replace|append|prepend <key> <flags> <exptime> <bytes> [noreply]\r\n
或
cas <key> <flags> <exptime> <bytes> <cas unqiue> [noreply]\r\n
后跟
<data block>\r\n

 

命令说明:

  1. set: 置值
  2. add: 如果不存在,置值
  3. replace: 如果存在,置值
  4. append: 如果存在,在原值后添加
  5. prepend: 如果存在,在原值前添加
  6. cas: check and set,检查并置值,确保在上次获取值后没有被置过值

参数说明:

  1. <flags>: 一个16-bit无符号整数(1.2.1以后版本为32-bit),每次取操作时会随数据返回,客户端可以用它来作位图标识一些数据的属性(如是否压缩过,是否序列化过等等),这个值是服务端透明的,服务器只是原样返回
  2. <bytes>: <data block>的长度,不含\r\n
  3. <cas unique>: 一个随gets命令返回的32位整数,标识这个对象被置值的次数
  4. noreply : 让服务端沉默

返回说明:

  • "STORED\r\n": 成功
  • "NOT_STORED\r\n": add了已存在的,replace|append|prepend了不存在的,或者该对象已经在删除队列中了
  • "EXISTS\r\n":cas方法要设置的对象已经被更改了
  • "NOT_FOUND\r\n":cas方法要设置的对象不存在或者已经被删除了

取回命令

get <key>*\r\n
gets <key>*\r\n
 

命令说明:

  1. get 取得一个或多个对象by keys
  2. gets 取得一个或多个对象(包括其cas_id)by keys

参数说明:

  1. <key>* 一个key或空格分隔的多个key

返回说明:

VALUE <key> <flags> <bytes> [<cas unique>]\r\n
<data block>\r\n
...
END\r\n

删除命令

delete <key> [<time>] [noreply]\r\n

 

参数说明:

  1. <time> 以秒计的间隔或系统时间,在这个时间之前,对象会被扔到删除对列中。对该对象的get,add,replace操作将会被失败,但set会成功。这是个可选参数,默认为0,表示不放到队列中而直接删除(free chunk)

返回说明:

  • "DELETED\r\n" 成功
  • "NOT_FOUND\r\n" 未找到

递增递减命令

incr <key> <value> [noreply]\r\n
decr <key> <value> [noreply]\r\n
 

命令说明:

  1. 这两个命令是原子操作
  2. 这两个操作的前提是这个key存在且其值是一个有效的64-bit无符号整数的十进制表示(在内部存储时,其实是用的字符串)
  3. decr至0后,再decr不会有效果。但incr到最大值后会溢出

参数说明:

  1. <value>: 期望增减的值,64-bit无符号整数的十进制表示

返回说明:

  • "NOT_FOUND\r\n" 找不到
  • <value>\r\n , 增减后新的值

统计命令

stats\r\n  : 全局统计
stats slabs\r\n  : 统计slabs的使用情况
stats items\r\n  : 统计各slab class中的item的情况
stats sizes\r\n  : 统计每个大小档次中item数量(需要遍历所有item,慎用)
 

其它命令

flush_all [<delay>]\r\n : 将所有对象置为不可获取状态,即全清,慎用。delay以秒计,没有表示马上执行
version\r\n : 返回server版本
verbosity <level>\r\n : 调整server的日志输出level:0|1|2,2最详细
quit\r\n : 告诉server关闭此链接
 

Memcached客户端

让我们来想象下作为Memcached的客户端,它应该具备什么样的功能?

首先,它要能与Mecmcached服务器交互,这就是说,客户端要解析Memcached协议,能连接到服务器。

第二,要能进行数据存取,这是作为一个客户端的主要功能。客户端能以Key-Value形式存取数据。

第三,除了进行基本的数据存取,还能发送其它控制命令,并取得命令执行结果。如利用客户端进行统计分析等。当然,这也可以看作数据存取的一种。

第四,如果Memcached服务是分布式的,那么客户端要负责负载均衡。也就是说,客户端要依据一定算法将数据存储均衡分布到集群节点上。

Memcached的Java客户端目前主要有三种:spymemcached ,  Memcached-Java-Client and Xmemcached。

Spymemcached和Xmemcached是基于NIO的,Memcached-Java-Client是基于传统Socket连接的。

Xmemcached用法非常简单,以下是最基本的用法:

    MemcachedClientBuilder builder = new XMemcachedClientBuilder(
                                        AddrUtil.getAddresses("localhost:11211"));
    MemcachedClient memcachedClient = builder.build();
    try {
                memcachedClient.set("hello", 0, "Hello,xmemcached");
                String value = memcachedClient.get("hello");
                System.out.println("hello=" + value);
                memcachedClient.delete("hello");
                value = memcachedClient.get("hello");
                System.out.println("hello=" + value);
    } catch (MemcachedException e) {
                System.err.println("MemcachedClient operation fail");
                e.printStackTrace();
    } catch (TimeoutException e) {
                System.err.println("MemcachedClient operation timeout");
                e.printStackTrace();
    } catch (InterruptedException e) {
                // ignore
    }
    try {
              //close memcached client
                memcachedClient.shutdown();
    } catch (IOException e) {
                System.err.println("Shutdown MemcachedClient fail");
                e.printStackTrace();
    }
分享到:
评论

相关推荐

    memcached使用小结(PHP).docx

    下面是 Memcached 的使用小结: 安装 Memcached 1. 安装 libevent,因为 Memcached 使用 libevent 作为事件驱动。 2. 使用 ./configure; make; make 安装 Memcached。 3. 安装 pecl::memcache,使用 pecl 命令行...

    深入理解redis_memcached失效原理(小结)

    Redis 和 Memcached 都是广泛使用的内存数据存储系统,它们常用于缓存和快速数据访问。本文主要讨论了这两种技术的缓存失效原理,特别是针对 Redis 的失效机制进行了深入解析。 首先,我们要明白如何触发 key 的...

    Memcached 服务器集群安装配置和测试

    小结:Memcached 服务器集群的安装配置和测试是一个复杂的过程,需要安装和配置多个组件,包括 libevent、Memcached 和 magent。在配置防火墙和启动服务时,需要注意防火墙的设置和服务的参数。最后,需要验证服务...

    nosql 入门教程

    1.6 小结 16 第2章 NoSQL上手初体验 17 2.1 第一印象——两个简单的例子 17 2.1.1 简单的位置偏好数据集 17 2.1.2 存储汽车品牌和型号数据 22 2.2 使用多种语言 30 2.2.1 MongoDB驱动 30 2.2.2 初识Thrift ...

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    由国内著名技术社区联合推荐的2012年IT技术力作:《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》,即将上架发行,此书从Web应用、数据备份与恢复、网络存储应用、运维监控与性能优化、...14.6 本章小结

    php页面缓存方法小结_.docx

    PHP页面缓存是一种提高网站性能的技术,通过存储和重用已生成的HTML页面,...然而,对于更复杂的缓存需求,如动态内容分片、多层缓存或分布式缓存,可能需要使用更高级的解决方案,例如Memcached、Redis或PHP的APC等。

    php 5.3.5安装memcache注意事项小结

    标题中的“php 5.3.5安装memcache注意事项小结”是指在Windows操作系统上,为PHP 5.3.5版本安装Memcache扩展时需要注意的一些关键步骤和要点。Memcache是一个高性能的分布式内存对象缓存系统,常用于加速动态Web应用...

    提高PHP编程效率的53个要点(经验小结)

    使用memcached可以缓存运算码(OPcode),减轻数据库负载,并加速动态Web应用。在处理字符串长度验证时,isset()函数因其作为语言结构的特性,比strlen()函数执行更快,因为它避免了函数调用的额外开销。 在脚本优化...

    优化PHP代码技巧的小结

    【优化PHP代码技巧的小结】 在开发PHP应用时,代码优化是提高性能的关键步骤。以下是一些关于PHP代码优化的实用技巧: 1. **使用静态方法**:如果一个方法不依赖于实例状态,应声明为静态,这可以提高约1/4的执行...

    php实现计数器方法小结

    2. **内存缓存**:可以考虑使用内存缓存(如Redis或Memcached)来暂存计数值,提高性能,减少磁盘IO。 3. **日志处理**:对于大量访问的网站,定期汇总日志并更新计数值可能更为合适,而不是每次访问都更新。 4. **...

    redis简单介绍及安装使用小结

    它与Memcached相似,都是基于内存的数据存储,但Redis提供了更多丰富的数据类型,包括字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set)。这些数据类型使得Redis在多种应用场景下具有更高的...

    java面试最全八股文

    小结: 与NoSQL的关系编辑 CAP的是什么关系 为什么会是这样 选择权衡 延伸 分布式系统的典型应用 分布式事务、分布式锁 常用的分布式事务解决方案介绍有多少种? 一、一致性理论 二、一致性模型 三、分布式事务解决...

    PHP缓存技术的多种方法小结

    6. 内存缓存:内存缓存如Memcached,是分布式内存对象存储系统,它可以在多个服务器之间共享数据,减轻数据库负载,显著提升应用程序性能。 7. PHP缓冲器:包括eaccelerator、APC、phpa和XCache等,它们将PHP代码...

    亮剑.NET深入体验与实战精要2

    本章小结 77 第2章 细节决定成败 79 2.1 Equals()和运算符==的区别 80 2.2 const和readonly的区别 82 2.3 private、protected、public和internal的区别 86 2.4 sealed、new、virtual、abstract与override 87 2.5 ...

Global site tag (gtag.js) - Google Analytics