Memcached 介绍
1、Memcached简介
Memcached是国外社区网站LiveJournal的开发团队开发的高性能分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度,提高可扩展性。
2、Memcached特点
- 基于C/S架构,协议简单
- 基于libevent的事件处理机制
- 自主内存存储处理
- 基于客户端的Memcached分布式
- 自主内存存储方式
- 数据存储方式:Slab Allocation
- 数据过期方式:Lazy Expiration + LRU
说明:
Slab Allocation
Slab Allocation 的原理是将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk 的集合),如图
另外slab allocator 还有重复使用已分配的内存功能。即分配到的内存不会释放,而是重复利用。但这也可能会导致不能有效的使用分配的内存。
Lazy Expiration
Memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术成为lazy expiration。Memcached不会在过期监视上浪费CPU时间。
LRU
Memcached会优先使用已超时的记录空间,但即使如此,也会发生追加新纪录时空间不足的情况。这时需要使用Least Recently Used(LRU)机制,删除最近最少使用的记录方式来分配空间。
Memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术成为lazy expiration。Memcached不会在过期监视上浪费CPU时间。
LRU
Memcached会优先使用已超时的记录空间,但即使如此,也会发生追加新纪录时空间不足的情况。这时需要使用Least Recently Used(LRU)机制,删除最近最少使用的记录方式来分配空间。
3、Memcachedz配置
Memcached服务器在启动时需要对关键的参数进行配置,参数及作用如下:
- -p <num> Memcached的TCP监听端口,缺省配置为11211;
- -U <num> Memcached的UDP监听端口,缺省配置为11211,为0时表示关闭UDP监听;
- -s <file> Memcached监听的UNIX套接字路径;
- -a <mask> 访问UNIX套接字的八进制掩码,缺省配置为0700;
- -l <addr> 监听的服务器IP地址,默认为所有网卡;
- -d 为Memcached服务器启动守护进程;
- -r 最大core文件大小;
- -u <username> 运行Memcached的用户,如果当前为root的话需要使用此参数指定用户;
- -m <num> 分配给Memcached使用的内存数量,单位是MB;
- -M 指示Memcached在内存用光的时候返回错误而不是使用LRU算法移除数据记录;
- -c <num> 最大并发连数,缺省配置为1024;
- -v –vv –vvv 设定服务器端打印的消息的详细程度,其中-v仅打印错误和警告信息,-vv在-v的基础上还会打印客户端的命令和相应,-vvv在-vv的基础上还会打印内存状态转换信息;
- -f <factor> 用于设置chunk大小的递增因子;
- -n <bytes> 最小的chunk大小,缺省配置为48个字节;
- -t <num> Memcached服务器使用的线程数,缺省配置为4个;
- -L 尝试使用大内存页;
- -R 每个事件的最大请求数,缺省配置为20个;
- -C 禁用CAS,CAS模式会带来8个字节的冗余;
4、Memcached与redis对比
- 性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。
- 内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。
- Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。
总之Redis支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。支持数据的备份,即master-slave模式的数据备份。支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
5、Memcached适用场景
- 访问频繁的字典数据
- 大量的hot数据(热门数据缓存)
- 页面缓存(web站常用)
- 搜索的查询条件和结果(热门搜索的内容缓存起来)
- 临时处理数据(不需要入库,排重)