关系数据库:依据关系模型创建的数据库,关系模型就是“一对一、一对多、多对多”,二维表格模型,关系模型包括数据结构(数据存储的问题,二维表),操作指令集合(sql语句),完整性约束(表内数据约束、表与表之间的约束)
特点:
安全(因为存储在磁盘中,不会说突然断电数据就没有了)
容易理解(建立在关系模型上)
不节省空间(因为建立在关系模型上,就要遵循某些规则,好比数据中某字段值即使为空仍要分配空间)
非关系型数据库
非关系型数据库主要是基于“非关系模型”的数据库
非关系型模型比如有:
列模型(Hbase):存储的数据是一列列的。关系型数据库以一行作为一个记录,列模型数据库以一列为一个记录。(这种模型,数据即索引,IO很快,主要是一些分布式数据库)
键值对模型(redis,memcache db):存储的数据是一个个“键值对”,比如name:liming,那么name这个键里面存的值就是liming
文档类模型(mongo db):以一个个文档来存储数据,有点类似“键值对”
特点:
效率高(因为存储在内存中)、不安全(断电丢失数据,但其中redis可以同步数据到磁盘中),现在很多非关系型数据库都开始支持转存到磁盘中。
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统,是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
Memcached主要由两部分组成:独立运行的Memcached服务实例,以及用于访问这些服务实例的客户端。
用户需要通过一个Memcached客户端来完成对缓存服务所记录信息的访问。该客户端知道服务端缓存系统中所包含的所有Memcached服务实例。在需要访问具有特定键值的数据时,该客户端内部会根据所需要读取的数据的键值,如“foo”,以及当前Memcached缓存服务的配置来计算相应的哈希值,以决定到底是哪个Memcached实例记录了用户所需要访问的信息。在决定记录了所需要信息的Memcached实例之后,Memcached客户端将从配置中读取该Memcached服务实例所在地址,并向该Memcached实例发送数据访问请求,以从该Memcached实例中读取具有键值“foo”的信息。
在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实例失效了,那么需要由该实例所记录的数据将暂时失效,而其它实例所记录的数据仍然还在:
一个节点的失效现在将只会导致一部分数据不再在缓存系统中存在,而并没有导致其它实例上所记录的数据的目标实例发生变化。
1)memory:内存存储速度快,对于内存的要求高,所缓存的内容非持久化。对于 CPU 要求很低,所以常常采用将 Memcached 服务端和一些 CPU 高消耗 Memory 低消耗应用部属在一起 。(否则会互相挤占资源)
2)集中式cache:需要非单点保证其可靠性,这需要 cluster 的工作,可以将多个 Memcached 作为一个虚拟的 cluster ,同时对于 cluster 的读写和普通的 memcached 的读写性能没有差别。
3)分布式扩展:可以将部属在一台机器上的多个 Memcached 服务端或者部署在多个机器上的 Memcached 服务端组成一个虚拟的服务端,对于调用者来说完全屏蔽和透明。提高的单机器的内存利用率 。
4)socket通信: Socket 传输速率应该比较高(当前支持 Tcp 和 udp 两种模式,同时根据客户端的不同可以选择使用 nio 的同步或者异步调用方式)
一台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、网页测试
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
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首页识别:
DirectoryIndex index.php index.html
#约370行添加支持PHP后缀:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
6、添加PHP测试内容
vim /usr/local/httpd/htdocs/index.php
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
Success!!";
else echo "Fail!!";
mysql_close();
?>
页面出现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
connect('192.168.76.156',11211);
$memcache->set('key','Memcache test Successfull!',0,60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>
15.重启httpd服务,去网页验证客户端能否连接服务端