memcache服务应用实践
Posted blog-css-com
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了memcache服务应用实践相关的知识,希望对你有一定的参考价值。
一, Memcached介绍
1.1 Memcached与常见同类软件对比
(1)Memcached是什么?
Memcached是一个开源的,支持高性能,高并发的分布式内存缓存系统,由C语言编写,总共2000多行代码。从软件名称上看,前3个字符“Mem”就是内存的意思,而接下来的后面5个字符“cache”就是缓存的意思,最后一个字符d,是daemon的意思,代表是服务器端守护进程模式服务。
Memcached服务分为服务器端和客户端两部分,其中,服务器端软件的名字形如Memcached-1.4.24.tar.gz,客户端软件的名字形如Memcache-2.25.tar.gz
Memcached软件诞生于2003年,最初由LiveJournal的Brad Fitzpatrick开发完成。Memcache是整个项目的名称,而Memcached是服务器端的主程序名,因其协议简单,应用部署方便,且支持高并发,因此被互联网企业广泛使用,直到现在仍然如此。其官方网站地址:http://memcached.org/.
(2)Memcached的作用
传统场景中,多数Web应用都将数据保存到关系型数据库中(例如:mysql),Web服务器从中读取数据并在浏览器中显示。但随着数据量的增大,访问的集中,关系型数据库的负担就会出现加重,响应缓慢,导致网站打开延迟等问题,影响用户体验。
这时就需要Memcached软件出马了。使用Memcached的主要目的是,通过在自身内存中缓存关系型数据库的查询结果,减少数据库被访问的次数,以提高动态Web应用的速度,提高网站架构的并发能力和可扩展性。
Memcached服务的运行原理是通过在事先规划好的系统内存空间中临时缓存数据库中的各类数据,以达到减少前端业务服务对数据库的直接高并发访问,从而提升大规模网站集群中动态服务的并发访问能力。
-生产场景的Memcached服务一般被用来保存网站中经常被读取的对象或数据,就像我们的客户端浏览器也会把经常访问的网页缓存起来一样,通过内存缓存来存取对象或数据要比磁盘存取快很多,因为磁盘是机械的,因此,在当今的IT企业中,Memcached的应用范围很广泛。
2 互联网常见内存缓存服务软件
二,Memcached的用途与应用场景
2.1 Memcached常见用途工作流程
Memcached是一种内存缓存软件,在工作中经常用来缓存数据库的查询数据,数据被缓存在事先与分配的Memcached管理的内存中,可以通过API或命令的方式存取内存中缓存的这些数据,Memcached服务内存中缓存的数据就像一张巨大的hash表,每条数据都是以key-value对的形式存在。
2.1.1网站读取Memcached数据时工作流程
从逻辑上来说,当程序访问后端数据库获取数据时会优先访问Memcached缓存,如果缓存中有数据就直接返回给客户端用户,如果没有合适的数据(没有命中),再去后端的数据库读取数据,读取到需要的数据后,就会把数据返回给客户端,同时还会把读取到的数据缓存到Memcached内存中,这样客户端用户再次请求相同的数据时就会直接读取Memcached缓存的数据了,这就大大地减轻了后端数据库的压力,并提高了整个网站的响应速度,提升了用户体验。
展示了Memcached缓存系统和后端数据库系统的协作流程
后缓存技术---数据库局部的数据缓存到memcache中(热点数据较多)
先缓存技术-----数据库的所有数据的缓存到memcache中大大提高了服务器的命中率
如上图所示:使用Memcached缓存查询的数据来减少数据库压力的具体工作流程如下:
(1)Web程序首先检查客户端请求的数据是否在Memcached缓存中存在,如果存在,直接把请求的数据返回给客户端,此时不再请求后端数据库。
(2)如果请求的数据在Memcached缓存中不存在,则程序会去请求数据库服务,把从数据库中取到的数据返回给客户端,同时把新取到的数据缓存一份到Memcached缓存中。
2.1.2 网站更新Memcached数据时的工作流程
具体流程如下:
(1)当程序更新或删除数据时,会首先处理后端数据库中的数据。
(2)在处理后端数据库中数据的同时,也会通知Memcached,告诉它对应的旧数据失效,从而保证Memcached中缓存的数据始终和数据库中一致,这个数据一致性非常重要,也是大型网站分布式缓存集群最头疼的问题所在。
(3)如果是在高并发读写场合,除了要程序通知Memcached过期的缓存失效外,还可能要通过相关机制,例如在数据库上部署相关程序(如在数据库中设置触发器使用UDFs),实现当数据库有更新时就把数据更新到Memcached服务中,这样一来,客户端在访问新数据时,因预先把更新过的数据库数据复制到Memcached中缓存起来了,所以可以减少第一次查询数据库带来的访问压力,提升Memcached中缓存的命中率,甚至新浪门户还会把持久化存储Redis做成MySQL数据库的从库,实现真正的主从复制。
下图为Memcached网站作为缓存应用更新数据的流程
memcache到服务作为缓存应用通过相关软件更新数据的流程
http://static.zybuluo.com/chensiqi/um4nsru1t315dtbwe8p9bnhf/QQ%E6%88%AA%E5%9B%BE20170804233252.png在生产工作中,网站Web服务器作为缓存应用更新数据的方案更为常用,即由网站程序负责更新Memcached缓存。
2.2 Memcached在企业中的应用场景
2.2.1 作为数据库的查询数据缓存
(1)完整数据缓存
例如:电商的商品分类功能不是经常变动的,因此可以事先放到Memcached里,然后再对外提供数据访问。这个过程被称之为“数据预热”。
此时只需读取缓存,无需读取数据库就能得到Memcached缓存里的所有商品分类数据了,所以数据库的访问压力就会大大降低。
为什么商品分类数据可以事先放在缓存里呢?
因为,商品分类几乎都是由内部人员管理的,如果需要更新数据,更新数据库后,就可以把数据同时更新到Memcached里。
如果把商品分类数据做成静态化文件,然后,通过在前端Web缓存或者使用CDN加速效果更好。
(2)热点数据缓存
热点数据缓存一般是用于由用户更新的商品,例如淘宝的卖家,在卖家新增商品后,网站程序就会把商品写入后端数据库,同时把这部分数据,放入Memcached内存中,下一次访问这个商品的请求就直接从Memcached内存中取走了。这种方法用来缓存网站热点的数据,即利用Memcached缓存经常被访问的数据。
提示:
这个过程可以通过程序实现,也可以在数据库上安装相关软件进行设置,直接由数据库把内容更新到Memcached中,就相当于Memcached是MySQL的从库一样。
如果碰到电商双11,秒杀高并发的业务场景,必须要事先预热各种缓存,包括前端的Web缓存和后端的数据库缓存。
也就是先把数据放入内存预热,然后逐步动态更新。此时,会先读取缓存,如果缓存里没有对应的数据,再去读取数据库,然后把读到的数据放入缓存。如果数据库里的数据更新,需要同时触发缓存更新,防止给用户过期的数据,当然对于百万级别并发还有很多其他的工作要做。
绝大多数的网站动态数据都是保存在数据库当中的,每次频繁地存取数据库,会导致数据库性能急剧下降,无法同时服务更多的用过户(比如MySQL特别频繁的锁表就存在此问题),那么,就可以让Memcached来分担数据库的压力。增加Memcached服务的好处除了可以分担数据库的压力以外,还包括无须改动整个网站架构,只须简单地修改下程序逻辑,让程序先读取Memcached缓存查询数据即可,当然别忘了,更新数据时也要更新Memcached缓存。
2.2.2 作为集群节点的session会话共享存储
即把客户端用户请求多个前端应用服务集群产生的session会话信息,统一存储到一个Memcached缓存中。由于session会话数据是存储在内存中的,所以速度很快。
三,Memcached的特点与工作机制
3.1 Memcached的特点
Memcached作为高并发,高性能的缓存服务,具有如下特点:
协议简单。Memcached的协议实现很简单,采用的是基于文本行的协议,能通过telnet/nc等命令直接操作memcached服务存储数据。
支持epoll/kqueue异步I/O模型,使用libevent作为事件处理通知机制。
简单的说,libevent是一套利用c开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,确保即使服务器端的连接数增加也能发挥很好的性能。Memcached就是利用这个libevent库进行异步事件处理的。
memcache服务安装
1 下载公网源
安装支持包
yum -y install libevent libevent-devel nc
yum -y install memcached
启动memcached
Memcached启动命令相关参数说明
进程与连接设置:
|命令参数|说明|
|--|--|
|-d|以守护进程(daemon)方式运行服务|
|-u|指定运行Memcached的用户,如果当前用户为root,需要使用此参数指定用户|
|-l|指定Memcached进程监听的服务器IP地址,可以不设置此参数|
|-p(小写)|指定Memcached服务监听TCP端口号。默认为11211|
|-P(大写)|设置保存Memcached的pid文件($$),保存PID到指定文件|
内存相关设置:
命令参数 说明
-m 指定Memcached服务可以缓存数据的最大内存,默认为64MB
-M Memcached服务内存不够时禁止LRU,如果内存满了会报错
-n 为key+value——flags分配的最小内存空间,默认为48字节
-f chunk size增长因子,默认为1.25
-L 启用大内存页,可以降低内存浪费,改进性能
并发连接设置:
并发连接设置 说明
-c 最大的并发连接数,默认是1024
-t 线程数,默认4.由于Memcached采用的是NIO,所以太多线程作用不大
-R 每个event最大请求数,默认是20
-C 禁用CAS(可以禁止版本计数,减少开销)
测试参数:
-v 打印较少的errors/warnings
-vv 打印非常多调试信息和错误输出到控制台
-vvv 打印极多的调试信息和错误输出,也打印内部状态转变
向memcached中写入数据实践
出现STORED表示成功添加key1级对应的数据
通过printf配置nc从Memcached中读取数据
get 查数据
delete 删除数据
运维连接memcached服务端
memcached客户端
安装部署客户端
cd /usr/local/php/lib
vim php.ini
检查php语法
重启php
打开浏览器
输入 域名/test_inifo.php
入
以上是关于memcache服务应用实践的主要内容,如果未能解决你的问题,请参考以下文章
MySQL InnoDB Memcached Plugin在Oray公司的实践
Key/Value之王Memcached初探:Memcached解决Session的分布式存储场景的应用