Memcache介绍

1.What is Memcache?

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

Memcache由Danga Interactive开发,官方网站http://www.danga.com/memcached/ 。最初为了加速LiveJournal.com 访问速度而开发的,后来被很多大型的网站采用。LJ每秒动态页面访问量几千次,用户700万。

使用libevent进行网络IO处理,libevent作为一种新的非阻塞网络IO方式以高效的方法(epoll/kqueue)组织IO,分布式散列对象到不同的服务器,查询复杂度是O(1)。

基于memcache作者对分布式cache的理解和解决方案,memcache完全可以用到其他地方 比如分布式数据库、 分布式计算等领域。目前被广泛应用在facebook、wikipedia、sina、tom、sourceforge等大型网站。

2.Memcahce的实现机制

memcache本身在分布式应用中,单个结点之间是 Server相互独立,不会存在同级之间的通信。客户端对多个server通过一个连接池进行连接,可以设置连接池当中每个Memcached的连接数权 重,以根据服务器性能调整每台Memcached的连接数比例权重,实现近似的负载均衡。用户不必关心数据存放在哪个节点,由客户端统一算法进行分配。

memcache的Server结点对数据的存储操作都是在 内存中完成,对内存分配和回收采用了曾在SunOS实现的分页机制,预分配一个大内存(默认是 <= 200M),然后分页切块:将1M的内存片(slab)根据需要截取成若干种不同大小的内存块(chunk)来进行使用,共有80、100、128、 160、...1M这数十种大小不同的内存块(可以设置最小的块大小),默认按照125%递增(可以设置递增比例),对每个数据对象的存储便在所切的块中 进行操作,没有涉及到任何磁盘IO操作,绝对不会使用到SWAP虚拟内存,其性能瓶颈都在网络通信部分,而memcache正是将这一部分抛给了一个中间 层完成。可以说memcached是一个单进程、单线程、监听某个网络端口的daemon(或非daemon),是一个轻量级的应用服务进程

存放在内存的数据通过LRU算法进行淘汰出内存,同时可以通过删除和设置失效时间来淘汰存放在内存的数据。

3.Memcached的安装

服务端Memcached

需要libevent支持(epoll需要Linux 2.6+)http://www.monkey.org/~provos/libevent/

下载memcahced(最新版本1.2.2)http://www.danga.com/memcached/download.bml)

./configure --enable-threads

make

make install

Slackware下需要:

cd /usr/lib

ln -s /usr/local/lib/libevent.so libevent.so

4.Memcached的启动

memcached -d -m 1024 -l 172.16.194.182 -p 11211 -u user_00 -v >>/data/logs/memcached_11211.log

-p port number to listen on

-l interface to listen on, default is INDRR_ANY

-d run as a daemon

-r maximize core file limit

-t numbers of threads(default is 4,no more than the number of CPUs)

-u assume identity of (only when run as root)

-m max memory to use for items in megabytes, default is 64 MB

-M return error on memory exhausted (rather than removing items)

-c max simultaneous connections, default is 1024

-k lock down all paged memory

-v verbose (print errors/warnings while in event loop)

-vv very verbose (also print client commands/reponses)

-h print this help and exit

-i print memcached and libevent license

5.Memcache的优点

由于使用自己的动态内存chunk分配机制(其它cache 系统都使用System V的共享内存),每个key的值所占用的内存与chunk大小接近(其它Cache系统的chunk大小是在配置文件里面设置的固定大小),使得内存浪费 非常少,同时又支持客户端对存储数据的zilb压缩和还原,使得占用内存进一步减少,因而与其它cache系统相比其占用内存最少。

使用了性能最高的epoll,其负载能力相当强,并且支持其它cache系统都不支持的UDP协议连接和Unix域套接口

可以使用字符串作为key(其它Cache系统都只能使用数字),可以直接存取数组和对象,无需在存储的时候进行串行化(serialize)和反串行化(unserialize),对于程序处理数组和对象更为方便

使用连接池,可以定制每个Memcached实例所支持的连接数权重,便于根据各个服务器的性能来调整每个Memcached所承载的连接,实现部分负载均衡

程序中无需关注数据被定位在哪一台服务器,由客户端来实现数据分布(各种语言的客户端的key定位算法都相同)

可以设置key的有效期过期时间,过期后系统将进行自动淘汰。其它cache系统不能设置key的过期时间,只能根据LRU算法进行淘汰。

客户端支持C、C#、Perl、PHP、Java、Ruby、Python等语言,方便多种语言操作相同缓存数据

6.Memcache的缺点

不支持根据条件进行查询等操作,如果必须使用条件搜索,那么只能通过程序先获取需要的一组key值,通过Memcached来一次性get获取(即get一个key的数组)

key与value是一一对应关系,如果需要一对多的对应,那么只能是将value设置为一个数组或者对象(即set或replace一个key,其value为数组或对象)

和DB不存在同步关系,其数据全部由Web程序来提供插入、更新和删除,Memcached不负责从数据库中读取数据来更新cache,所以DB的数据更新需要在Web程序中实现。

数据恢复机制比较薄弱,由于不同的key是根据一种算法保存在不同的Memcached实例所划分的内存中,所以其数据恢复相对比较困难
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值