分布式缓存——memcached

关系数据库与非关系数据库

关系数据库:依据关系模型创建的数据库,关系模型就是“一对一、一对多、多对多”,二维表格模型,关系模型包括数据结构(数据存储的问题,二维表),操作指令集合(sql语句),完整性约束(表内数据约束、表与表之间的约束)

特点:

安全(因为存储在磁盘中,不会说突然断电数据就没有了)

容易理解(建立在关系模型上)

不节省空间(因为建立在关系模型上,就要遵循某些规则,好比数据中某字段值即使为空仍要分配空间)

非关系型数据库

非关系型数据库主要是基于“非关系模型”的数据库

非关系型模型比如有:

列模型(Hbase):存储的数据是一列列的。关系型数据库以一行作为一个记录,列模型数据库以一列为一个记录。(这种模型,数据即索引,IO很快,主要是一些分布式数据库)

键值对模型(redis,memcache db):存储的数据是一个个“键值对”,比如name:liming,那么name这个键里面存的值就是liming

文档类模型(mongo db):以一个个文档来存储数据,有点类似“键值对”

特点:

效率高(因为存储在内存中)、不安全(断电丢失数据,但其中redis可以同步数据到磁盘中),现在很多非关系型数据库都开始支持转存到磁盘中。

memcached介绍

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统,是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
在这里插入图片描述

memcahced工作原理

Memcached主要由两部分组成:独立运行的Memcached服务实例,以及用于访问这些服务实例的客户端。
在这里插入图片描述
用户需要通过一个Memcached客户端来完成对缓存服务所记录信息的访问。该客户端知道服务端缓存系统中所包含的所有Memcached服务实例。在需要访问具有特定键值的数据时,该客户端内部会根据所需要读取的数据的键值,如“foo”,以及当前Memcached缓存服务的配置来计算相应的哈希值,以决定到底是哪个Memcached实例记录了用户所需要访问的信息。在决定记录了所需要信息的Memcached实例之后,Memcached客户端将从配置中读取该Memcached服务实例所在地址,并向该Memcached实例发送数据访问请求,以从该Memcached实例中读取具有键值“foo”的信息。

在Memcached中,每条记录都由四部分组成:记录的键,有效期,一系列可选的标记以及表示记录内容的数据。由于记录内容的数据中并不包含任何数据结构,因此我们在Memcached中所记录的数据需要是经过序列化之后的表示。

memcached内存管理机制

通常情况下,一个内存管理算法所最需要考虑的问题就是内存的碎片化(Fragmentation):在长时间地分配及回收之后,被系统所使用的内存将趋向于散落在不连续的空间中。这使得系统很难找到连续内存空间,一方面增大了内存分配失败的概率,另一方面也使得内存分配工作变得更为复杂,降低了运行效率。

为了解决这个问题,Memcached使用了一种叫Slab的结构。在该分配算法中,内存将按照1MB的大小划分为页,而该页内存则会继续被分割为一系列具有相同大小的内存块。

slab管理:在一条新的记录到来时,Memcached会首先检查该记录的大小,并根据记录的大小选择记录所需要存储到的Slab类型。接下来,Memcached就会检查其内部所包含的该类型Slab。如果这些Slab中有空余的块,那么Memcached就会使用该块记录该条信息。如果已经没有Slab拥有空闲的具有合适大小的块,那么Memcached就会创建一个新的页,并将该页按照目标Slab的类型进行划分。
Memcached使用这种方式来分配内存的好处则在于,其可以降低由于记录的多次读写而导致的碎片化。

各个Slab中块的大小默认情况下是按照1.25倍的方式来递增的。优化salb:如果数据在通常情况下都比较小,那么我们就需要将最小块的大小调整得小一些。如果数据的大小变动不是很大,那么我们可以将块大小的递增倍数设置得小一些,从而使得各个块的大小尽量地贴近需要存储的数据,以提高内存的利用率。

由于缓存系统拥有有限的资源,因此其会在某一时刻被服务所产生的数据填满。如果此时缓存系统再次接收到一个缓存数据的请求,那么它就会根据LRU(Least
recently
used)算法以及数据的过期时间来决定需要从缓存系统中移除的数据。而Memcached所使用的过期算法比较特殊,又被称为延迟过期(Lazy
expiration):当用户从Memcached实例中读取数据的时候,其将首先通过配置中所设置的过期时间来决定该数据是否过期。如果是,那么在下一次写入数据却没有足够空间的时候,Memcached会选择该过期数据所在的内存块作为新数据的目标地址。如果在写入时没有相应的记录被标记为过期,那么LRU算法才被执行,从而找到最久没有被使用的需要被替换的数据。

高可用实现原理

Memcached所使用的解决方法就是Consistent Hashing(一致性Hash)。

首先请考虑一个圆,在该圆上分布了多个点,以表示整数0到1023。这些整数平均分布在整个圆上:
在这里插入图片描述
而在上图中,我们则突出地显示了6个蓝点。这六个蓝点基本上将该圆进行了六等分。而它们所对应的就是在当前Memcached缓存系统中所包含的三个Memcached实例m1,m2以及m3。好,接下来我们则对当前需要存储的数据执行哈希计算,并找到该哈希结果900在该圆上所对应的点:
在这里插入图片描述
可以看到,该点在顺时针距离上离表示0的那个蓝点最近,因此这个具有哈希值900的数据将记录在Memcached实例m1中。
如果其中的一个Memcached实例失效了,那么需要由该实例所记录的数据将暂时失效,而其它实例所记录的数据仍然还在:
在这里插入图片描述

一个节点的失效现在将只会导致一部分数据不再在缓存系统中存在,而并没有导致其它实例上所记录的数据的目标实例发生变化。

memcached 特点

1)memory:内存存储速度快,对于内存的要求高,所缓存的内容非持久化。对于 CPU 要求很低,所以常常采用将 Memcached 服务端和一些 CPU 高消耗 Memory 低消耗应用部属在一起 。(否则会互相挤占资源)

2)集中式cache:需要非单点保证其可靠性,这需要 cluster 的工作,可以将多个 Memcached 作为一个虚拟的 cluster ,同时对于 cluster 的读写和普通的 memcached 的读写性能没有差别。

3)分布式扩展:可以将部属在一台机器上的多个 Memcached 服务端或者部署在多个机器上的 Memcached 服务端组成一个虚拟的服务端,对于调用者来说完全屏蔽和透明。提高的单机器的内存利用率 。

4)socket通信: Socket 传输速率应该比较高(当前支持 Tcp 和 udp 两种模式,同时根据客户端的不同可以选择使用 nio 的同步或者异步调用方式)

memcached安装配置

一台memcached服务器192.168.76.156,一台客户端192.168.76.172

一、安装memcached服务器

1、安装libevent

1)

yum install gcc gcc-c++ make -y
tar -xf libevent-2.1.8-stable.tar.gz -C /opt

2)编译安装

 cd /opt/libevent-2.1.8stable
   ./configure  --prefix=/usr/local/libevent
 Make && make install   

2、安装memcached

1)

  tar xf memcached-1.5.6.tar.gz -C /opt/

2)编译安装

./configure  --prefix=/usr/local/memcached  --with-libevent=/usr/local/libevent/
make && make install          #编译安装  

3)

ln -s /usr/local/memcache/bin/* /usr/local/bin 

4)

memcached -d -m 32m -p 11211 -u root    //   开启服务(-d守护进程  -m缓存大小32M  -p端口11211)

5)
netstat -anpt | grep memcached
在这里插入图片描述
二、memcache API 客户端安装

搭建LAMP架构

1、安装apache服务

tar xf apr-1.6.2.tar.gz -C /opt    
tar xf apr-util-1.6.0.tar.gz -C /opt
tar jvxf httpd-2.4.29.tar.bz2 -C /opt
cd   /opt
mv apr-1.6.2 httpd-2.4.29/srclib/apr
mv apr-util-1.6.0 httpd-2.4.29/srclib/apr-util

2、

yum -y install gcc gcc-c++ make pcre-devel expat-devel  perl -y

3、编译安装

cd  /opt/httpd-2.4.29 
./configure --prefix=/usr/local/httpd --enable-so  --enable-rewrite --enable-charset-lite --enable-cgi
make 
make  install

4、添加系统服务

cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd  #将启动脚本拷贝服务程序目录下
vim /etc/init.d/httpd  #修改启动脚本
#chkconfig: 35 85 21   #35级别自动运行  第85个启动 第21个关闭
#description: Apache is a World Wide Web server.

5、修改配置文件

vi /usr/local/httpd/conf/httpd.conf
ServerName  www.yun.com:80  #填写完全主机名
Listen 192.168.65.173:80  #监听本地IP

6、优化服务

ln -s /usr/local/httpd/conf/httpd.conf  /etc/httpd  #优化配置文件路径
ln -s /usr/local/httpd/bin/*  /usr/local/bin/  #优化命令路径
chkconfig --add httpd //将httpd加入到service管理器

7、.重启服务,关闭防火墙

systemctl stop firewalld.service
setenforce 0
systemct httpd start
netstat -anpt | grep “80”

8、网页测试

输入192.168.76.172
在这里插入图片描述
安装MySQL数据库

1、解压软件包,安装编译环境工具

yum -y install ncurses-devel bison libaio-devel cmake
tar xzvf mysql-5.6.26.tar.gz -C /opt

2、编译安装

cd /opt/mysql-5.6.26 
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 

3、添加系统服务

cp support-files/mysql.server /etc/init.d/mysqld #添加系统服务
chmod 755 /etc/init.d/mysqld #添加执行权限
chkconfig --add /etc/init.d/mysqld #将mysqld添加为系统服务
chkconfig mysqld --level 235 on #
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile #重新读取系统环境变量
useradd -s /sbin/nologin mysql #创建进程用户mysql
chown -R mysql:mysql /usr/local/mysql/ #修改mysql安装目录的所有者,所属组

4、初始化数据库

/usr/local/mysql/scripts/mysql_install_db 
--user=mysql 
--ldata=/var/lib/mysql 
--basedir=/usr/local/mysql 
--datadir=/home/mysql

5、建立软连接

ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock

6、修改配置文件

cp support-files/my-default.cnf /etc/my.cnf 
vim /etc/init.d/mysqld
basedir=/usr/local/mysql 
datadir=/home/mysql

7、启动服务

systemctl start mysqld
mysqladmin -u root password "abc123" //给数据库root账号设置密码
netstat -anpt | grep 3306

在这里插入图片描述
安装PHP

1、

`yum -y install gd libpng libpng-devel pcre pcre-devel libxm12-devel libjpeg-devel`

2、

tar xjvf php-5.6.11.tar.bz2 -C /opt

3、编译安装

cd /opt/php-5.6.11  
./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
make install

4、创建配置文件

ln -s /usr/local/php5/bin/ /usr/local/bin/ #优化命令路径(软连接)
ln -s /usr/local/php5/sbin/ /usr/local/sbin/

5、修改配置文件

vim /etc/httpd.conf

在156行检查下面这条语句是否存在,如果不存在,要重新安装mysql,如果还没有,直接重装apache

LoadModule php5_module modules/libphp5.so

#约256行添加php首页识别:

<IfModule dir_module>
DirectoryIndex index.php index.html 
</IfModule>

#约370行添加支持PHP后缀:

<IfModule mime_module>
AddType application/x-httpd-php .php 
AddType application/x-httpd-php-source .phps
<IfModule mime_module>

6、添加PHP测试内容

vim /usr/local/httpd/htdocs/index.php
<?php
phpinfo();
?>

7、重启httpd服务

在网页测试“http://192.168.76.172/index.php”
在这里插入图片描述
8、测试数据库

mysql -u root -pabc123 #进入数据库
CREATE DATABASE sky; 
GRANT all ON sky.* TO 'skyuser'@'%' IDENTIFIED BY 'admin123';
flush privileges; 
exit

9、修改站点内容

vim /usr/local/httpd/htdocs/index1.php
<?php
$link=mysql_connect('192.168.76.172','skyuser','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
mysql_close();
?>

在这里插入图片描述
10、网页验证

页面出现success“

11、安装memcached客户端

yum install autoconf -y
tar zvxf memcache-2.2.7.tgz -C /opt/
cd /opt/memcache-2.2.7

12、安装编译

./configure --enable-memcache --with-php-config=/usr/local/php5/bin/php-config
make 
make install

/usr/local/php5/lib/php/extensions/no-debug-zts-20131226 #复制此行

13、配置PHP添加Memcached组件

vim /usr/local/php5/php.ini 
搜索extension_dir = ,增加下面2行
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-
zts-20131226/" 
extension = memcache.so

14.编写测试页面

vim /usr/local/httpd/htdocs/index.php
<?php
$memcache = new Memcache();
$memcache->connect('192.168.76.156',11211);
$memcache->set('key','Memcache test Successfull!',0,60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>

15.重启httpd服务,去网页验证客户端能否连接服务端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值