您的位置:首页 > 数据库 > Memcache

memcached介绍以及安装

2016-07-22 16:20 483 查看
今天学习了解到非关系型数据库NoSQL。对于NoSQL想必大家也有所了解,不了解的可以上网搜一下其基本原理以及相对关系型数据库有哪些优势,在这里我就不多说了。在接下来的几篇文章中我会简单讲一下memcached、redis以及MongoDB的安装及相关配置,相关文件内容都是我学习时从网上寻找的资料整理而成,希望能帮助有需要的人省去查找资料的时间,也欢迎大家评论留言互相指正互相学习。

常见的Nosql数据库有:

键值(Key-Value)数据库 :redis、memcached、riak
面向文档(Document-Oriented)数据库 :MongoDB、CouchDB、RavenDB
列存储(Wide Column Store/Column-Family)数据库 :Cassandra、HBase
图(Graph-Oriented)数据库 :Neo4J、Infinite Graph、OrientDB

在这里我先简单介绍一下memcached。

memcached
是国外社区网站LiveJournal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能。官方站点 http://memcached.org/

memcached运行流程图



memcached特点
基于C/S架构,协议简单
基于libevent 的事件处理
自主内存存储处理
存储方式为slab allocation
Slab Allocation的原理――将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。
Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。
Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。其结构图如下:



Growth Factor
memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制slab之间的差异,chunk大小的差异。默认值为1.25。

Slab Allocation的缺点:
Slab Allocation可以有效的解决内存碎片问题,但是在如下情况下,会导致内存的浪费:
每个slab的chunk大小是固定的,当item的占用空间实际小于chunk大小时,会出现内存浪费
每个slab的大小是固定的(因为page是固定的),当slab不能被他所拥有的chunk整除时,会出现内存浪费
按照Growth Factor因子生成指定大小的slab,而某slab id根本未被使用时,会出现内存浪费

通过memcache添加tem的时候:
1.Memcache计算item的大小(key+value+flags),选取合适的slab(刚好能放下该item的slab)
2.如果这个item对应的slab未出现过,则申请1个page(注意,这1M空间不论是否达到memcached使用内存都可以申请成功)并加该item存入slab中的chunk
3.如果item对应的slab出现过,则在该slab中优先选择expired(free_chunks)和delete(在1.2.2中delete的chunk存在着不能被重复利用的问题)的chunk进行存储,其次将选择未使用过的chunk(free_chunks_end)进行存储。</p>
4.如果item对应的slab出现过,但是对应的slab已经存储满了,那么会申请一个新的page,这个page被分为对应大小的chunk,继续存储。
5. 如果item对应的slab出现过,但是对应的slab已经存储满了并且memcache也达到了最大内存使用。将使用lru算法,清除item(可能将未过期的item清除)此时会有eviction++

数据过期方式:
Lazy Expiration
memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。
LRU
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当内存空间不足时(无法从slab class slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

适用memcached的业务场景:1)如果网站包含了访问量很大的动态网页,因而数据库的负载将会很高。由于大部分数据库请求都是读操作,那么memcached可以显著地减小数据库负载。2)如果数据库服务器的负载比较低但CPU使用率很高,这时可以缓存计算好的结果( computed objects )和渲染后的网页模板(enderred templates)。3)利用memcached可以缓存session数据、临时数据以减少对他们的数据库写操作。4)缓存一些很小但是被频繁访问的文件。5)缓存Web ‘services’(非IBM宣扬的Web Services,译者注)或RSS feeds的结果.。
不适用memcached的业务场景:1)缓存对象的大小大于1MBMemcached本身就不是为了处理庞大的多媒体(large media)和巨大的二进制块(streaming huge blobs)而设计的。2)key的长度大于250字符3)虚拟主机不让运行memcached服务如果应用本身托管在低端的虚拟私有服务器上,像vmware, xen这类虚拟化技术并不适合运行memcached。Memcached需要接管和控制大块的内存,如果memcached管理的内存被OS或 hypervisor交换出去,memcached的性能将大打折扣。4)应用运行在不安全的环境中Memcached为提供任何安全策略,仅仅通过telnet就可以访问到memcached。如果应用运行在共享的系统上,需要着重考虑安全问题。5)业务本身需要的是持久化数据或者说需要的应该是database

接下来就是安装memcached,在这里我用yum安装,在后面的redis我用源码包安装。
yum install -y libevent memcached libmemcached
启动:
/etc/init.d/memcached start
查看进程:
ps aux |grep memcached
查看memcached运行状态
memcached-tool 127.0.0.1:11211 stats

默认监听127.0.0.1:11211,默认使用内存64M,我们也可以调节 /etc/sysconfig/memcached这个文件中的一些参数

-d选项是启动一个守护进程
-m是分配给Memcache使用的内存数量,单位是MB,这里是200MB
-u是运行Memcache的用户,如果当前为 root 的话,需要使用此参数指定用户。
-l是监听的服务器IP地址
-p是设置Memcache监听的端口,默认是11211
-c选项是最大运行的并发连接数,默认是1024
-P是设置保存Memcache的pid文件
命令行用法:
telnet 127.0.0.1 11211
set key1 0 60 3 //设置key1键,0是标识位,60表示过期时间为60秒,3表示value为3字节
abc
STORED
get key1
VALUE key1 0 3
abc
END
语法规则
<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
注:\r\n表示回车
a) <command name> 可以是”set”, “add”, “replace”,“delete”。
“set”表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。
“add”表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。
“replace”表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败。
“delete”会删除一个key值。
b) <key> 客户端需要保存数据的key。
c) <flags> 是一个16位的无符号的整数(以十进制的方式表示)。
该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
d) <exptime> 过期的时间。
若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)。
如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
e) <bytes> 需要存储的字节数,当用户希望存储空数据时<bytes>可以为0
f) <data block>需要存储的内容,输入完成后,最后客户端需要加上”\r\n”(windows直接点击Enter)作为”命令头”的结束标志。

下一篇文章会讲解php结合memcached。

本文出自 “linux运维” 博客,请务必保留此出处http://zhumy.blog.51cto.com/11647651/1828848
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: