memcache由浅入深

1.  memcached介绍

      一套仅利用内存来进行数据缓存的软件,常用于web服务后端和数据库前端。

      可临时缓存web系统查询过的数据库数据,当用户请求查询数据,优先从memcached获取数据。

      memcached服务分为服务器和客户端。

2.  memcached作用

      1.  传统场景中,客户端查询动态数据,要从数据库中获取,但是随着并发数和访问量的增大,这样数据库的负担就会变大,并且会出现响应慢,导致访问网站慢,影响用户体验。

         如果在数据库前面加一个memcached,这样会提前把数据保存到memcached中,用户访问数据的时候,会直接从memcached直接读取数据,而不是数据库,这样可以减轻数据库的负担。

3.  互联网常见内存缓存服务软件

软件 类型 主要作用 缓存的数据
 memcached 纯内存型   后端数据库的缓存  缓存用户重复请求的动态内容
 squid,nginx 内存缓存  缓存前端的服务内容  缓存静态数据,图片,css,js,html代码
 redis  可持久化存储   后端数据库的缓存  缓存用户重复请求的动态内容

4.  memcached的工作流程

    1.  网站读取memcached数据时工作流程

        1.  web程序首先检查memcached是否存在数据,存在就从memcached获取数据,然后返回给客户端。

        2.  如果不存在,web程序就向数据库发送请求,从数据库获取数据,并且web程序向memcached缓存一份。

        3.  当有其他用户访问网站,就直接从memcached获取数据。

    2.  网站更新memcached数据的工作流程

        1.  当web程序更新或删除数据时,首先处理数据库中的数据。

        2.  在处理数据库的数据的时候,同时会通知memcached,告诉它旧数据失效,同时把数据库更新的数据更新到memcached中。

5.  大型网站7层分层

      1.  缓存和压缩,需要在nginx上配置,缓存静态资源(css,js,html,图片);压缩静态资源(html,css,js)

      2.  启用nginx缓存或者使用CDN,中小公司都是使用CDN。

      3.  静态层,尽可能把动态资源转化成静态资源。

      4.  动态层,通过消息队列Q,生成静态页面。

      5.  数据库缓存

      6.  数据库层

      7.  存储层

6.  memcache分布式缓存

      1.  使用常见的LVS和haproxy做cache的负载均衡。使用的调度算法:url  hash

7.  memcached服务应用优化案例

      1.  用户打开网站慢,经运维人员排查看,mysql数据库负载很高,load值为20~30。

      2.  登录数据库后,show full processlist;发现数据库中有大量的"like %杜冷丁%"语句。

      3.  使用sphinx搜索服务实现用户搜索。

      4.  在数据库前端添加memcached服务。

      5.  为数据库配置读写分离。减轻主库压力。

8.  memcached的特点

      1.  协议简单。可以通过telnet/nc等命令直接操作memcached存取数据。

      2.  支持epoll异步I/O模型,使用libevent作为事件处理通知机制。

      3.  采用key/values键值数据类型。

      4.  全内存缓存,效率高。

9.  memcached工作原理

      1.  采用C/S架构,在服务器端开启memcached守护进程,可以指定监听本地的IP地址,端口号,并发访问连接数,以及分配了多少内存来处理客户端请求。

      2.  Socket事件处理机制

         由C语言来实现的,全部代码2000多行,采用异步epoll非阻塞网络I/O模型,基于异步的libevent事件作为事件通知机制。

      3.  数据存储机制

      4.  内存管理机制

         slab内存管理机制,提前规划好slab,

      5.  多线程处理机制

      6.  memcache的检测过期与删除机制

10.  memcached服务安装

      1.  安装libevent及连接工具nc

          [root@rsync-server ~]# rpm -qa libevent libevent-devel nc  检查一下是否已经安装

          [root@rsync-server ~]# yum install libevent libevent-devel nc -y  安装三个软件包

      2.  yum安装memcached,也可以编译安装

          [root@rsync-server ~]# yum install memcached -y      

wget http://memcached.org/files/memcached-1.5.8.tar.gz
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure && make && sudo make install

11.  memcached的基本管理

      1.  常用参数

          -l  监听哪个IP

          -p  监听哪个端口,默认11211

          -c  memcached最大的并发数,默认为1024

          -d  以守护进程方式运行服务

          -u  指定用户        

          -m  指定缓存数据的最大内存,默认为64MB

          -P  设置保存memcached的pid文件

          --v  调试信息

      2.  启动memcached

           memcached -p 11211 -u root -c 10240 -d

          memcached -p 11212 -u root -c 10240 -d

          /usr/bin/memcached -d -p 11212 -l 192.168.1.170 -u root -m 8192 -c 4096 -P /var/run/memcached.pid

          启用多个memcached实例

      3.  将开启的命令添加到/etc/rc.local文件中,以便下次开机可以自动启动。

          echo "start memcached"  >> /etc/rc.local

          echo "/usr/local/bin/memcached -p 11211 -u root -c 10240 -d"   >> /etc/rc.local

          echo "/usr/local/bin/memcached -p 11212 -u root -c 10240 -d"   >> /etc/rc.local

          注意:centos7默认/etc/rc.d/rc.local没有执行权限,需要给它执行权限,才会执行上面的命令。

      4.  memcached启动脚本

          

#!/bin/sh
#
# memcached:    MemCached Daemon
#
# chkconfig:    - 90 25
# description:  MemCached Daemon
# Source function library.
# Author: pkey san 2015/12/07
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
prog=memcached
pidfile=${PIDFILE-/var/run/memcached.pid}
start()
{
        echo -n $"Starting memcached: "
        daemon --pidfile=${pidfile} /usr/local/bin/memcached -u daemon -d -m 512 -l 127.0.0.1 -c 4096 -p 11211
        echo `ps aux |grep memcached |grep 11211 |grep -v grep |awk '{print $2}'` >$pidfile
        echo
}
stop()
{
        echo -n $"Shutting down memcached: "
        killproc  $prog
        echo
}
rh_status(){
status -p ${pidfile} $prog
}
[ -f /usr/local/bin/memcached ] || exit 0
# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        rh_status
        ;;
  restart|reload)
        stop
        start
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart|reload|}"
        exit 1
esac
exit 0

  

12.  操作memcached服务

      1.  

 

 

          

posted @ 2018-06-24 13:15  奋斗史  阅读(176)  评论(0)    收藏  举报