Memcached是一个内存数据库,数据以key/value键值对的形式保存在服务器预先分配的内存区块中,由于Memcached服务自身没有对缓存的数据进行持久化存储的设计,因此,在服务器端的Memcached进程重启之后,数据就会丢失。且当内存中缓存的数据容量达到启动时设定的内存值时,也会自动使用LRU算法删除过期的数据
Memcached应用场景
- 作为数据库的查询数据缓存
- 作为集群节点的session会话共享存储
Memcached预热及重启
- 当需要大面积重启Memcached时,首先要在前端控制网站入口的访问流量,然后重启Memcached集群进行预热,所有数据预热完毕之后,再逐步放开前端网站入口流量
- 启动集群服务器时,一定要从网站集群的后端一次往前端开启,特别是要提前预热
Memcached删除机制
- 不主动检车item对象是否过期,而是在get时才会检查item对象是否过期以及是否应该删除
- 当删除item对象时,一般不释放内存空间,而是做删除标记,将指针放入slot回收插槽,下次分配的时候直接使用
- 当内存空间满的时候,将会根据LRU算法把最近最少使用的item对象删除
- 数据存入可以设定过期时间,但是数据过期后不会立即删除,而是在get时检查item对象是否过期以及是否应该删除
- 如果不希望系统使用LRU算法清除数据,可以使用-M参数
安装Memcached
#安装libevent #Memcached采用的是异步epoll/kqueue非阻塞I/O网络模型,其实现方式是基于异步的libevent时间单进程、单线程模式。使用libevent作为事件通知机制; #应用程序端通过指定服务器的IP地址及端口,就可以连接Memcached服务进行通信 yum install libevent libevent-devel #安装Memcached yum安装的版本略低,但是不影响使用,建议使用yum或rpm包方式安装,简单易用 yum install memcached #如果想安装更高版本的则需要编译安装 wget http://memcached.org/files/memcached-1.4.39.tar.gz tar zxf memcached-1.4.39.tar.gz cd memcached-1.4.39 ./configure --prefix=/usr/local/memcached make && make install ln -s /usr/local/memcached/bin/memcached /usr/bin/memcached #我们可以把启动命令放入/etc/rc.local,以便下次开机自启动
Memcached服务的基本管理
#启动Memcached memcached -m 16m -p 11211 -d -uroot -c 8192 #启动命令相关参数书名 -d 以守护进程方式运行服务 -u 指定运行Memcached用户 -l 指定监听的服务器IP地址,可以不设置此参数 -p 指定监听的端口,默认为11211 -P 保存PID到指定文件 -m 指定可以缓存数据的最大内存,默认为64MB -M 服务内存不够时禁止LRU,如果内存满了会报错(rather than removing items) -L 启用大内存也,可以降低内存浪费,改进性能 -c 最大并发连接数,默认是1024 -t 线程数,默认4.由于Memcached采用的是NIO,所以太多线程作用不大 -R 每个event最大请求数,默认是20 -C 禁用CAS(可以禁止版本计数,减少开销) #关闭Memcached 单实例:ps -ef|grep memcached|grep -v grep|awk '{print $2}'|xargs kill 多实例: kill `cat /var/run/11211.pid` #启动多实例最好在启动时增加-P参数指定固定的pid文件,这样便于管理
工作中如何配置Memcached
和开发人员进行深入沟通,确定内存大小以及业务的重要性,进行决定是否采用负载均衡、集群,以及确定并发连接数等。对于运维人员,部署Memcached一般就是安装Memcached服务端,把服务启动起来,做好监控,配置好开机自启动。客户端的PHP程序一般在安装LNMP环境时都会提前安装Memcached客户端插件,Java程序环境下,开发人员会用第三方的JAR包直接连接Memcached服务。