- 一、memcache简介
- 特征
- 支持的语言
- Memcached 运行
- 二、安装memcache示例
- 1.解压相关软件包
- 2.编译安装memcache
- 3.建立软连接,便于系统识别
- 4.启动memcache
- 三、memcache基本操作
- 1.安装telnet工具连接数据库
- 2.基本操作命令演示
- 四、客户端访问memcache
- 安装LAMP架构
- 1.安装Apache
- 2.安装MySQL
- 3.安装PHP
- 4.测试mysql的连通性
- 5.安装memcache客户端工具
一、memcache简介
- Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
- Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
- Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
- Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
- 本质上,它是一个简洁的key-value存储系统。
- 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
特征
加粗样式memcached作为高速运行的分布式缓存服务器,具有以下的特点。
- 协议简单
- 基于libevent的事件处理
- 内置内存存储方式
- memcached不互相通信的分布式
支持的语言
许多语言都实现了连接memcached的客户端,其中以Perl、PHP为主。仅仅memcached网站上列出的有:
- Perl
- PHP
- Python
- Ruby
- C#
- C/C++
- Lua
Memcached 运行
Memcached命令的运行:
/usr/local/memcached/bin/memcached -h ## 命令帮助
注意:如果使用自动安装 memcached 命令位于 /usr/local/bin/memcached。
启动选项 | 描述 |
-d | 启动一个守护进程; |
-m | 分配给Memcache使用的内存数量,单位是MB; |
-u | 运行Memcache的用户; |
-l | 监听的服务器IP地址,可以有多个地址; |
-p | 设置Memcache监听的端口,,最好是1024以上的端口; |
-c | 最大运行的并发连接数,默认是1024; |
-P | 设置保存Memcache的pid文件。 |
二、安装memcache示例
1.解压相关软件包
[root@localhost ~]# tar zxxf memcached-1.5.6.tar.gz -C /opt/
[root@localhost ~]# tar zxxf libevent-2.1.8-stable.tar.gz -C /opt/
2.编译安装memcache
[root@localhost ~]# yum -y install gcc gcc-c++ make
[root@localhost ~]# cd /opt/libevent-2.1.8-stable
[root@localhost ~]# ./configure --prefix=/usr/local/libevent
[root@localhost libevent-2.1.8-stable]# make -j3 && make install
[root@localhost ~]# cd /opt/memcached-1.5.6
[root@localhost memcached-1.5.6]# ./configure \
> --prefix=/usr/local/memcached \
> --with-libevent=/usr/local/libevent/ ##加载事件库的功能,并指明路径
[root@localhost memcached-1.5.6]# make -j3 && make install
3.建立软连接,便于系统识别
[root@localhost ~]# ln -s /usr/local/memcached/bin/memcached /usr/local/bin/
4.启动memcache
[root@localhost ~]# memcached -d -m 32m -p 11211 -u root ## -d指定守护进程,-m指定缓存大小,-p指定端口,-u指定用户
[root@localhost ~]# netstat -anpt | grep memc
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 10573/memcached
tcp6 0 0 :::11211 :::* LISTEN 10573/memcached
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
setenforce: SELinux is disabled
三、memcache基本操作
1.安装telnet工具连接数据库
[root@localhost ~]# yum -y install telnet
[root@localhost ~]# telnet 127.0.0.1 11211 ##进入数据库
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
2.基本操作命令演示
- add创建键
add name 0 0 7 ## 新增键name,第一个0表示不设置序列号,第二个0表示不设置超时时间,最后7指的是字节长度
zhaoliu ##输入值"zhaoliu";注意,字节长度一定要和输入的键的值向匹配,否则会报错。
STORED ##表示数据输入成功,error则表示失败
- get获取键值
get name ##查看name键的值,有效期和字节长度
VALUE name 0 7 ##提示键名name,超时时间0,长度7
zhaolou ## 键值为zhaolou
END
- gets获取键值和更新因子(每进行一次操作,更新因子加1,同DNS的主从更新)
gets name ## ##会比使用get查看的结果末尾多一个数值,这个数值是更新因子,每对这个键执行一次操作(如get、set等等),更新因子都会加1
VALUE name 0 7 1
zhaolou
END
-set对键进行修改(键可以是已经存在的也可以是不存在的)
set name 0 0 9 ##可以通过set命令更新键的属性和值,若该键不存在,可以充当add创建的作用
zhaoliuyu
STORED
get name ## 查看键值
VALUE name 0 9
zhaoliuyu
END
- replace修改键的属性和值,不同于set,只能修改已经存在的键且值不为空的键
replace name 0 0 6 ##修改键name的长度为6
yellow
STORED
get name ##查看键值
VALUE name 0 6
yellow
END
- 检查更新,同样也是修改键的属性和值,但是必须是在更新因子相同时才更新(即最后的数值4要和gets得出的更新因子相同才执行)
gets name ##查看更新因子,现在是3
VALUE name 0 6 3
yellow
END
cas name 0 0 7 4 ##使用cas更新键值,但是更新因子不同步
1234
get name ## 查看键值,错误数据
CLIENT_ERROR bad data chunk
ERROR
gets name ## 重新查看更新因子,还是3
VALUE name 0 6 3
yellow
END
cas name 0 0 4 3 ##同步更新因子,进行数据更新
abcd
STORED
get name ##查看键值,数据更新成功
VALUE name 0 4
abcd
END
- append 在原本的值后面追加
get name ##查看原本的值
VALUE name 0 6
yellow
END
append name 0 0 3 ## 追加长度为3 的值RED
RED
STORED
get name ##再次查看,RED追加到原本的值yellow后面
VALUE name 0 9
yellowRED
END
- prepend 在原值前面追加
prepend name 0 0 2 ## 在原值前面追加长度为2 的值GO
GO
STORED
get name ##查看键值
VALUE name 0 11
GOyellowRED
END
- delete 删除键
delete name ##删除name键
DELETED ##提示删除成功
get name ##查看name键,已经消失
END
- flush_all,清空所有库数据
- quit 退出数据库
四、客户端访问memcache
安装LAMP架构
前面有写过详细的安装,这里就直接放脚本执行,不再多解释了
1.安装Apache
[root@localhost ~]# vi apache.sh
#!/bin/bash
echo "正在解压包……"
P1=$(find / -name httpd*.bz2)
P2=$(find / -name apr-util*tar.gz)
P3=$(find / -name apr-[0-9]*tar.gz)
tar zvxf $P2 -C /opt >/dev/null
tar zvxf $P3 -C /opt >/dev/null
read -p "您的Apache源码包名是否为$P1(yes|no)" PAN
if [ $PAN = yes ]
then
echo "正在解压Apache"
tar jvxf $P1 -C /opt >/dev/null
else
exit
fi
P4=$(find /opt/ -name "apr-[0-9].[0-9]*")
P5=$(find /opt/ -name "apr-util-[0-9].[0-9]*")
P6=$(find /opt/ -name "httpd-[0-9].[0-9]*")
mv $P4 $P6/srclib/apr
mv $P5 $P6/srclib/apr-util
##################
echo "正在安装环境"
yum -y install \
gcc \
gcc-c++ \
make \
pcre-devel \
expat-devel \
perl >/dev/null
cd $P6
echo "配置Apache"
./configure \
--prefix=/usr/local/httpd \
--enable-so \
--enable-rewrite \
--enable-charset-lite \
--enable-cgi
echo "###编译及安装###"
make && make install
ln -s /usr/local/httpd/conf/httpd.conf /etc/
ln -s /usr/local/httpd/bin/* /usr/local/bin/
echo "
[Unit]
Description=The Apache HTTP Server
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/httpd/logs/httpd.pid
ExecStart= /usr/local/bin/apachectl $OPTIONS
ExecrReload= /bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target" >/lib/systemd/system/httpd.service
systemctl start httpd.service
systemctl enable httpd.service
systemctl is-enabled httpd.service
2.安装MySQL
这里使用的是mysql5.6版本安装
[root@localhost ~]# vi mysql.sh
#!/bin/bash
yum -y install \
ncurses \
ncurses-devel \
bison \
gcc \
gcc-c++ \
expect \
cmake
yum install -y ncurses-devel autoconf
P1=$(find / -name "mysql-[0-9]*.gz")
read -p "核对软件名称$P1是否正确(yes|no):" T
if [ $T = yes ]
then
tar zvxf $P1 -C /opt
else
exit
fi
P2=$(find /opt/ -name mysql-[0-9].*[0-9])
cd $P2
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DSYSCONFIDIR=/etc \
-DMYSQL_DATADIR=/home/mysql/ \
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock
make && make install
cp $P2/support-files/my-default.cnf /etc/my.cnf
cp $P2/support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
chkconfig --add /etc/init.d/mysqld
chkconfig mysqld --level 235 on
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
echo $PATH
useradd -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql/
/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql
ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock
sed -ir '46s/$/\/usr\/local\/mysql/' /etc/init.d/mysqld
sed -ir '47s/$/\home\/mysql/' /etc/init.d/mysqld
service mysqld start
STA=$(netstat -anpt | grep 3306 |wc -l)
if [[ $STA -ge 1 ]]
then
echo "mysql启动正常"
else
echo "mysql启动失败"
fi
/usr/bin/expect <<EOF
spawn /usr/local/mysql/bin/mysqladmin -uroot -p password
expect {
"Enter" {send "\r";exp_continue}
"password" {send "abc123\r";exp_continue}
"password" {send "abc123\r"}
}
expect eof
EOF
echo "安装完成,请执行 source /etc/profile 命令,完成优化。
3.安装PHP
PHP使用的是5.6版本
[root@localhost ~]# vi php.sh
#!/bin/bash
P1=$(find / -name php*.bz2)
read -p "您的PHP源码包名是否为$P1(yes|no)" PAN
if [ $PAN = yes ]
then
echo "正在解压PHP源码包"
tar jvxf $P1 -C /opt >/dev/null
else
exit
fi
yum -y install \
gd \
libpng \
libpng-devel \
pcre \
pcre-devel \
libxml2-devel \
libjpeg-devel
P2=$(find / -name "php-[0-9].[0-9].[0-9][0-9]")
cd $P2
./configure \
--prefix=/usr/local/php5 \
--with-gd \
--with-zlib \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-mysql=/usr/local/mysql \
--with-config-file-path=/usr/local/php5 \
--enable-mbstring
make -j3 && make install
cp $P2/php.ini-development /usr/local/php5/php.ini
ln -s /usr/local/php5/bin/* /usr/local/bin/
ln -s /usr/local/php5/sbin/* /usr/local/sbin/
sed -i '393aAddType application/x-httpd-php\ .php\nAddType application/x-httpd-php-source\ .phps' /usr/local/httpd/conf/httpd.conf
sed -i -r '/DirectoryIndex index.html/s/$/ php.html/' /usr/local/httpd/conf/httpd.conf
echo "<?php
phpinfo();
?> " >/usr/local/httpd/htdocs/index.php
systemctl restart httpd
service httpd restart
4.测试mysql的连通性
[root@localhost ~]# mysql -u root -p ##进入数据库授权
mysql> CREATE DATABASE sky;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT all ON sky.* TO 'skyuser'@'%' IDENTIFIED BY 'admin123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
[root@localhost htdocs]# vi index.php
<?php
$link=mysqli_connect('192.168.10.20','skyuser','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>
[root@localhost htdocs]# systemctl restart httpd
5.安装memcache客户端工具
[root@localhost ~]# yum -y install autoconf
[root@localhost ~]# ls
……省略部分
memcache-2.2.7.tgz
[root@localhost ~]# tar zxvf memcache-2.2.7.tgz -C /opt
[root@localhost ~]# cd /opt/memcache-2.2.7/
[root@localhost memcache-2.2.7]# /usr/local/php5/bin/phpize ##增加PHP模块后生成的对memcache配置的脚本(configure文件)
Configuring for:
PHP Api Version: 20160303
Zend Module Api No: 20160303
Zend Extension Api No: 320160303
[root@localhost memcache-2.2.7]# ./configure \
> --enable-memcache \
> --with-php-config=/usr/local/php5/bin/php-config
……省略部分
creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h ##这里提示创建了config.h文件,PHP7.0以上版本可能出现不兼容,文件创建会失败,最好用5.0版本
[root@localhost memcache-2.2.7]# make && make install
…………省略部分
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
Build complete.
Don't forget to run 'make test'.
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-zts-20131226/
## 编译安装完成后,会提示生成一个共享扩展文件目录,这里需要将这个目录路径记录下来,需要放入配置文件中
[root@localhost ~]# vi /usr/local/php5/php.ini
738行// extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-zts-20131226/" ##填写刚刚记录下的路径,找个合适位置插入这两行配置
739行// extension = memcache.so ##加载扩展模块,memcache
[root@localhost htdocs]# vim /usr/local/httpd/htdocs/index.php ##编写测试网页
<?php
$memcache = new Memcache() ;
$memcache->connect('192.168.10.10',11211); ##指向memcache服务器ip和端口
$memcache->set('key','Memcache test Successfull!',0,60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>
[root@localhost ~]# systemctl restart httpd
访问http://192.168.10.20/index.php