memcached 就是这么简单

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了memcached 就是这么简单相关的知识,希望对你有一定的参考价值。

memcached

以key:value方式存储数据的服务器

以URI地址作为key,以实际页面作为value,缓存http对象数据 


memcached: 缓存服务器,但本身无法决定缓存任何数据 ;非持久性

一半依赖于客户端(决定缓存哪些数据,缓存时长,key)

一半依赖于服务器(提供存储缓存数据的能力)


清除缓存数据的机制:

lazy:惰性,只要还有剩余缓存空间可用,之前缓存的数据不会自动清除

LRU:最近最少使用

非持久性服务器

缓存数据保存到内存中

48bytes最小

1M最大

避免内存碎片

buddy system:伙伴系统

避免内存外碎片(内存页面间的碎片)

将页面间的碎片重新组合成一个连续空间使用

slab allocator: slab分配器

存储小于内存单个页面大小(4K)的数据时,内存事先分配好符合各种小数据的空间使用

避免内存内碎片

slab class

memcached分配的内存空间大小的类别(48bytes的,80bytes的)

slab chunk

每个类别中分割的内存块的大小 

memcached:不通信的分布式缓存服务器




memcached安装配置


安装libevent,用于提供基于事件驱动的API

# tar zxf libevent-2.0.20-stable.tar.gz 

# cd libevent-2.0.20-stable

# ./configure --prefix=/usr/local/libevent

# make && make install 


安装memcached 

# yum  install -y cyrus-sasl-devel


# tar zxf memcached-1.4.15.tar.gz 

# cd memcached-1.4.15

# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/ --enable-sasl

# make && make install 


memcached启动选项:

-p <num>:指定监听在TCP协议的端口,默认为11211

-U <num>:指定监听在UDP协议的端口,默认为11211;为0表示关闭监听UDP协议 

-s <file>:指定监听在本地套接字

-l <addr>:指定监听的地址

-d:以daemon服务方式运行

-u <username>:指定运行的用户

-m <num>:以MB为单位,指定memcached使用的最大内存空间,默认为64M

-t <num>:指定用于处理入站请求的最大线程数,仅在memcached编译时开启支持线程才有效

-f <factor>: 指定slab allocator定义预先分配内存空间大小固定的块时的增长因子

-n <bytes>:指定最小的slab chunk大小,单位是字节 默认为48bytes

-P <file>:指定PID文件

-S:启用SASL认证功能

-c <num>: 最大并发连接数据,默认为1024


启动memcached进程 

# /usr/local/memcached/bin/memcached -m 128 -n 20 -f 1.1 -d -u nobody


# netstat -tunlp | grep memcached

tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      6979/memcached      

tcp        0      0 :::11211                    :::*                        LISTEN      6979/memcached      

udp        0      0 0.0.0.0:11211               0.0.0.0:*                               6979/memcached      

udp        0      0 :::11211                    :::*                                    6979/memcached    


memcached服务启动脚本:

#!/bin/bash

#

# Init file for memcached

#

# chkconfig: - 86 14

# description: Distributed memory caching daemon

#

# processname: memcached

# config: /etc/sysconfig/memcached


. /etc/rc.d/init.d/functions


## Default variables

PORT="11211"

USER="nobody"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS=""


RETVAL=0

prog="/usr/local/memcached/bin/memcached"

desc="Distributed memory caching"

lockfile="/var/lock/subsys/memcached"


start() {

        echo -n $"Starting $desc (memcached): "

        daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE  "$OPTIONS"

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && touch $lockfile

        return $RETVAL

}


stop() {

        echo -n $"Shutting down $desc (memcached): "

        killproc $prog

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && rm -f $lockfile

        return $RETVAL

}


restart() {

        stop

        start

}


reload() {

        echo -n $"Reloading $desc ($prog): "

        killproc $prog -HUP

        RETVAL=$?

        echo

        return $RETVAL

}


case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        restart

        ;;

  condrestart)

        [ -e $lockfile ] && restart

        RETVAL=$?

        ;;       

  reload)

        reload

        ;;

  status)

        status $prog

        RETVAL=$?

        ;;

   *)

        echo $"Usage: $0 {start|stop|restart|condrestart|status}"

        RETVAL=1

esac


exit $RETVAL


memcached常用命令


add命令:添加一个键

add keyname flag timeout datasize


get命令:获取键对应的值

get keyname 



# telnet 10.1.1.1 11211

Trying 10.1.1.1...

Connected to 10.1.1.1.

Escape character is ‘^]‘.


add mykey 0 30 5 //添加一个键,名称为mykey

hello

STORED


get mykey   //获取mykey键对应的值

VALUE mykey 0 5

hello

END



perl module 

cache::memcached

php

memcache

memcached

C/C++

libmemcached


memadmin基于GUI管理memcached的工具


配置PHP整合memcached 

1、安装memcache 

# tar zxf memcache-2.2.5.tgz

# cd memcache-2.2.5

# /usr/local/php/bin/phpize 

Configuring for:

PHP Api Version:         20090626

Zend Module Api No:      20090626

Zend Extension Api No:   220090626

# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache

# make && make install 


安装完成后,会有如下提示信息:

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/


2、编辑/etc/php.d/memcache.ini文件,指定PHP支持memcache.so扩展模块 

# vim /etc/php.d/memcache.ini 

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache.so


3、重启php-fpm服务

# /etc/init.d/php-fpm restart

Gracefully shutting down php-fpm . done

Starting php-fpm  done


通过客户端浏览器访问index.php页面,查看memcache模块信息


创建如下php测试页面,查看php是否启用memcached 

# vim /web/htdocs/test.php 

<?php

$mem = new Memcache;

$mem->connect("127.0.0.1", 11211)  or die("Could not connect");


$version = $mem->getVersion();

echo "Server‘s version: ".$version."<br/>\n";


$mem->set(‘testkey‘, ‘Hello World‘, 0, 600) or die("Failed to save data at the memcached server");

echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";


$get_result = $mem->get(‘testkey‘);

echo "$get_result is from memcached server.";         

?>


在客户端浏览器输入 http://10.1.1.1/test.php ,可看到如下信息,表示成功

Server‘s version: 1.4.15

Store data in the cache (data will expire in 600 seconds)

Hello World is from memcached server.






nginx整合memcached


server {

        listen 80;

        server_name www.bj.com;

        location / {

           set $memcached_key $uri;

           memcached_pass 127.0.0.1:11211;

           default_type text/html;

           error_page   404 @fallback;

        }


        location @fallback {

           proxy_pass http://172.16.0.1;

        }

 }





配置memcached保存php session 

条件:各PHP服务器要支持memcache 

 提供一台memcached服务器 IP地址 10.1.1.1  默认端口11211 

 

此环境memeched服务及PHP全都安装在同一台机器上,IP地址为10.1.1.1 


1、修改php.ini配置文件,指定使用memcache缓存数据并指定memcached服务器IP/端口 

# vim /etc/php.ini 

session.save_handler = memcache

session.save_path = "tcp://10.1.1.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15"


# /etc/init.d/php-fpm restart 



2、测试 


新建php页面setsess.php,为客户端设置启用session:

<?php

session_start();

if (!isset($_SESSION[‘www.bj.com‘])) {

  $_SESSION[‘www.bj.com‘] = time();

}

print $_SESSION[‘www.bj.com‘];

print "<br><br>";

print "Session ID: " . session_id();

?>


新建php页面showsess.php,获取当前用户的会话ID:

<?php

session_start();

$memcache_obj = new Memcache;

$memcache_obj->connect(‘172.16.200.11‘, 11211);

$mysess=session_id();

var_dump($memcache_obj->get($mysess));

$memcache_obj->close();

?>


访问http://10.1.1.1/setsess.php页面时,可看到如下session ID:

1451393251


Session ID: af5ad1mvvgi9i249n31p1iflj2


访问http://10.1.1.1/showsess.php页面时,可看到如下session id的返回信息

string(24) "www.bj.com|i:1451393251;"


上、下session ID一致



安装memadmin以GUI界面管理memcached服务器


# tar zxf memadmin-1.0.12.tar.gz 

将解压目录复制到网站根目录下

# mv memadmin /web/htdocs/memadmin


访问 http://10.1.1.1/memadmin即可打开GUI界面工具


可编辑/web/htdocs/memadmin目录下的config.php文件,修改默认登录的用户名、密码





本文出自 “江湖笑笑生” 博客,请务必保留此出处http://hashlinux.blog.51cto.com/9647696/1760520

以上是关于memcached 就是这么简单的主要内容,如果未能解决你的问题,请参考以下文章

Memcache服务搭建

Memcache服务搭建

memcache的简单应用

怎么合理的使用memcache缓存?如果缓存数据量过大怎么部署?

简单介绍Memcached

8.Memcache