Memcached 看一遍就懂了

来源:互联网 发布:泰国乳胶枕 知乎 编辑:程序博客网 时间:2024/06/14 23:22

本文总结了学习Memcached的一些关键点:

目录

  • 目录
  • Memcached是什么
  • Memcached特点
  • Memcached安装步骤
  • Memcached客户端
  • Memcached与Redis比较
  • Memcached与Memcache的区别
  • Memcached与java内存比较


Memcached是什么?

Memcached 是一个高性能的分布式内存对象缓存系统,通过减轻数据库负载来提升动态Web应用的性能。Memcached基于一个存储键/值对的HashMap。Memcached 由社交平台LiveJournal的BradFitzpatrick开发,目前被各网站广泛应用。这是一套免费开源软件,以BSDlicense授权发布。

官方是这样描述的:

Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.

官方网站:http://memcached.org/
GitHub:https://github.com/memcached/memcached

目前最新稳定版本:v1.4.36 (2017-3-19)


Memcached特点

  • 内存缓存数据
  • 协议简单
  • 分布式服务器之间不互相通讯

内存缓存数据
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除很少使用的缓存。memcached本身是为缓存而设计,不支持持久化,数据不会永久性存储。

协议简单
memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。因此,通过telnet也能在memcached上保存数据、取得数据。另外,memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙之后。

memcached命令及说明:https://github.com/memcached/memcached/wiki/Commands

通过telnet连接使用memcached:

telnet 127.0.0.1 11211 (memcached默认端口:11211)Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.set myKey 0 0 3  保存命令bar              数据STORED           结果get myKey        取得命令VALUE myKey 0 3  数据bar              数据END              结束行quit  

服务器之间不互相通讯
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息,这样比较容易横向扩展。那么,怎样进行分布式呢?这完全取决于客户端的实现,列如,memcached的java客户端XMemcached,默认分布的策略是按照key的哈希值模以(mod)连接数得到的余数,对应的连接就是将要存储的节点。XMemcached还支持一致性哈希(consistent hash)。


Memcached安装步骤

Redhat/CentOS/Fedora:

yum install memcached

Debian/Ubuntu:

apt-get install memcached

源码安装(Memcached依赖libevent,确保操作系统已安装libevent):

wget https://memcached.org/latesttar -zxf memcached-1.x.x.tar.gzcd memcached-1.x.x./configure --prefix=/usr/local/memcachedmake && make test && sudo make install

windows安装:

官网并未提供 Memcached 的windows平台安装包,而网上还是有被重新编译以适用于windows环境的安装包。建议还是使用虚拟机安装linux进行学习研究。


Memcached客户端

许多语言都实现了连接memcached的客户端,如:PHP,C#,C/C++,JAVA,Python,Ruby等等。这里着重介绍Java客户端。

Memcached的Java客户端:

  • memcached client for java
    jar包名称为java-memcached-2.x.x.jar。出现得较早,使用传统阻塞IO,性能低于较后两者,由Greg Whalin维护的客户端,现在可能停止维护了,实际项目使用中几乎不用它。
    参考:https://github.com/gwhalin/Memcached-Java-Client

  • SpyMemcached
    由Dustin Sallings实现, 基于java nio,支持异步,单线程的memcached客户端。
    参考:http://code.google.com/p/spymemcached/

  • XMemcached
    XMemcached同样是基于java nio的客户端,它也使用得比较广泛,而且有较详细的中文API文档,具有如下特点:高性能、支持完整的协议、支持客户端分布、允许设置节点权重、动态增删节点、支持JMX、与Spring框架和Hibernate-memcached的集成、客户端连接池、可扩展性好等。
    参考:http://code.google.com/p/xmemcached/
    参考:https://github.com/killme2008/xmemcached/wiki


Memcached与Redis比较

  • Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。
  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

    如何选择?

    下面内容来自Redis作者在stackoverflow上的一个回答,对应的问题是《Is memcached a dinosaur in comparison to Redis?》(相比Redis,Memcached真的过时了吗?)

You should not care too much about performances. Redis is faster per core with small values, but memcached is able to use multiple cores with a single executable and TCP port without help from the client. Also memcached is faster with big values in the order of 100k. Redis recently improved a lot about big values (unstable branch) but still memcached is faster in this use case. The point here is: nor one or the other will likely going to be your bottleneck for the query-per-second they can deliver.

没有必要过多的关心性能,因为二者的性能都已经足够高了。由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。(比如瓶颈可能会在网卡)

You should care about memory usage. For simple key-value pairs memcached is more memory efficient. If you use Redis hashes, Redis is more memory efficient. Depends on the use case.

如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。

You should care about persistence and replication, two features only available in Redis. Even if your goal is to build a cache it helps that after an upgrade or a reboot your data are still there.

如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。

You should care about the kind of operations you need. In Redis there are a lot of complex operations, even just considering the caching use case, you often can do a lot more in a single operation, without requiring data to be processed client side (a lot of I/O is sometimes needed). This operations are often as fast as plain GET and SET. So if you don’t need just GEt/SET but more complex things Redis can help a lot (think at timeline caching).

当然,最后还得说到你的具体应用需求。Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果你需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

来源:http://blog.nosqlfan.com/html/3729.html
英文原文:http://stackoverflow.com/questions/2873249/is-memcached-a-dinosaur-in-comparison-to-redis


Memcached与Memcache的区别

(个人粗略理解)在大部分场合下只有memcached而没有memcache,只有在谈及PHP时需要区分memcached与memcache。

在PHP里有两个扩展组件分别是memcached与memcache,它们是用来使用Memcached服务的客户端,它们使用不同的实现方式。

参考资料:
memcache扩展: http://pecl.php.net/package/memcache
memcached扩展: http://pecl.php.net/package/memcached


Memcached与java内存比较

java内存优势
- java内存不经过网络所以速度更快(例如,HashMap).
- java内存不需要序列化,对象可以直接获取使用.

Memcached优势
- Memcached可以在应用系统集群的多个实例之间共享访问。
- Memcached可以在不同服务器之间共享访问(例如由不同语言实现的系统),但需要约定一个键值规范。
- Memcached会处理超时的缓存值,所以可以控制缓存的时效.

参考:http://www.incentergy.de/blog/2013/12/11/big-data-architecture-patterns-for-performance/

0 0
原创粉丝点击