一 NoSQL简介 php
NoSQL(NoSQL = Not Only SQL ),意即"不只仅是SQL",泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了不少难以克服的问题,而非关系型的数据库则因为其自己的特色获得了很是迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤为是大数据应用难题。 mysql
非关系型数据库就是NoSQL,关系型数据库表明MySQL linux
对于关系型数据库来讲,是须要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量很是大的时候就很耗费时间和资源,尤为是数据是须要从磁盘里去检索 git
NoSQL数据库存储原理很是简单(典型的数据类型为k-v),不存在繁杂的关系链,好比mysql查询的时候,须要找到对应的库、表(一般是多个表)以及字段。 web
NoSQL数据库的四大分类 redis
k-v形式 算法
memcached、redis 适合储存用户信息,好比会话、配置文件、参数、购物车等等。这些信息通常都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。 sql
文档数据库 mongodb
mongodb将数据以文档的形式储存。每一个文档都是一系列数据项的集合。每一个数据项都有一个名称与对应的值,值既能够是简单的数据类型,如字符串、数字和日期等;也能够是复杂的类型,若有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性能够是不一样的,数据可使用XML、JSON或者JSONB等多种形式存储。 数据库
列存储数据库。
这部分数据库一般是用来应对分布式存储的海量数据。键仍然存在,可是它们的特色是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
图形(Graph)数据库
图形结构的数据库同其余行列以及刚性结构的SQL数据库不一样,它是使用灵活的图形模型,而且可以扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),所以进行数据库查询须要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph.
NoSQL数据库在如下的这几种状况下比较适用:
一、数据模型比较简单;
二、须要灵活性更强的IT系统;
三、对数据库性能要求较高;
四、不须要高度的数据一致性;
五、对于给定key,比较容易映射复杂值的环境。
分类 |
Examples举例 |
典型应用场景 |
数据模型 |
优势 |
缺点 |
键值(key-value) |
Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB |
内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 |
Key 指向 Value 的键值对,一般用hash table来实现 |
查找速度快 |
数据无结构化,一般只被看成字符串或者二进制数据 |
列存储数据库 |
Cassandra, HBase, Riak |
分布式的文件系统 |
以列簇式存储,将同一列数据存在一块儿 |
查找速度快,可扩展性强,更容易进行分布式扩展 |
功能相对局限 |
文档型数据库 |
CouchDB, MongoDb |
Web应用(与Key-Value相似,Value是结构化的,不一样的是数据库可以了解Value的内容) |
Key-Value对应的键值对,Value为结构化数据 |
数据结构要求不严格,表结构可变,不须要像关系型数据库同样须要预先定义表结构 |
查询性能不高,并且缺少统一的查询语法。 |
图形(Graph)数据库 |
Neo4J, InfoGrid, Infinite Graph |
社交网络,推荐系统等。专一于构建关系图谱 |
图结构 |
利用图结构相关算法。好比最短路径寻址,N度关系查找等 |
不少时候须要对整个图作计算才能得出须要的信息,并且这种结构不太好作分布式的集群方案。 |
二 Memcached数据存储方式
Memcached是国外社区网站LiveJournal团队开发,目的是为了经过缓存数据库查询结果,减小数据库访问次数,从而提升动态web站点性能。
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它经过在内存中缓存数据和对象来减小读取数据库的次数,从而提升动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,可是客户端能够用任何语言来编写,并经过memcached协议与守护进程通讯。
官方站点 http://www.memcached.org/
数据结构简单(k-v),数据存放在内存里
多线程
基于c/s架构,协议简单
基于libevent的事件处理
自主内存存储处理(slab allowcation)
数据过时方式:Lazy Expiration 和 LRU
Memcached的数据流向:
1 web从db上查询到结果
2 把结果存储到memcached中
3 再次用到该结果,从缓存memcached中取
Slab allocation:
1:先把内存分红不少个Slab,这个大小是预先规定好的,以解决内存碎片的问题。分配给Slab的内存空间被称为Page,默认是1M。一个Slab下能够有多个Page。
2.Page为内存分配的最小单位。
Memcached的内存分配以page为单位,默认状况下一个page是1M,能够经过-I参数在启动时指定。若是须要申请内存 时,memcached会划分出一个新的page并分配给须要的slab区域。page一旦被分配在重启前不会被回收或者从新分配
3.而后把一个Page分红不少个chunk块,chunk块是用于缓存记录的空间。Chunk的
大小是先有一个基本值,而后根据增加因子来增大。每个page中chunk是相等的空间大小。
Memcached里面保存着slab内空闲的chunk列表,当收到要保存的item的时候,它
会根据item的大小,去选择一个最合适的slab,而后找到空闲的chunk,把数据存放进去。
Growth factor:
Memcached在启动时经过-f选项能够指定 Growth Factor因子。该值控制chunk大小的差别。默认值为1.25。
经过memcached-tool命令查看指定Memcached实例的不一样slab状态,能够看到各Item所占大小(chunk大小)差距为1.25
命令:# memcached-tool 127.0.0.1:11211 display
数据过时方式
Lazy Expiration
Memcached 内部不会监视记录是否过时,而是在get时查看记录的时间戳,检查记录是否过时。这种技术被称为lazy(惰性)expiration。所以,Memcached不会在过时监视上耗费CPU时间。
LRU(Least Recently Used最近最少使用)
Memcached会优先使用已超时的记录的空间,但即便如此,也会发生追加新记录时空间不足的状况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除"最近最少使用"的记录的机制。所以,当内存空间不足时(没法从slab class获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。
懒惰删除机制
删除item对象时,不释放内存,做删除标记,指针放入slot回收插槽,次分配的时候直接使用
注意:memcached的LRU不是全局的,而是针对slab的,能够说是区域性的
三 memcached安装与启动
yum list |grep memcache
yum install -y memcached libmemcached libevent
启动:systemctl start memcached
[root@greg02 ~]#systemctl start memcached
[root@greg02 ~]#ps aux |grep memcache
memcach+ 2495 0.0 0.0 325568 1184 ? Ssl 18:17 0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root 2502 0.0 0.0 112664 968 pts/0 S+ 18:17 0:00 grep --color=auto memcache
参数说明:
-d 是启动一个守护进程
-m 是分配给Memcache使用的内存数量,单位是MB
-u 是运行Memcache的用户
-l 是监听的服务器IP地址
-p 是设置Memcache监听的端口,最好是1024以上的端口
-c 选项是最大运行的并发链接数,默认是1024,按照你服务器的负载量来设定
-P 是设置保存Memcache的pid文件
vim /etc/sysconfig/memcached 能够配置参数
好比加上监听的ip,能够把OPTIONS="" 改成OPTIONS="127.0.0.1"
其中-m指定memcached分配内存
-c指定最大并发数
-u指定运行memcached服务的用户
启动也能够用:memcached -d -m 10 -u root -l 127.0.0.1 -p 12000 -c 256 -P /tmp/memcached.pid
四 查看memcached状态
1.memcached-tool 127.0.0.1:11211 stats
2.echo stats |nc 127.0.0.1 11211须要安装nc工具 yum install -y nc
3.若安装libmemcached(yum install –y memcached)后,可使用命令
memstat --servers=127.0.0.1:11211 查看memcached服务状态
五 memcached命令行
存储命令: set/add/replace/append/prepend/cas
获取命令: get/gets
其余命令: delete/stats..
telnet 127.0.0.1 11211
Memcached语法规则
<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
注:\r\n在windows下是Enter键
<command name> 能够是set, add, replace
set表示按照相应的<key>存储该数据,没有的时候增长,有的时候覆盖
add表示按照相应的<key>添加该数据,可是若是该<key>已经存在则会操做失败
replace表示按照相应的<key>替换数据,可是若是该<key>不存在则操做失败。
<key> 客户端须要保存数据的key
<flags> 是一个16位的无符号的整数(以十进制的方式表示)。
该标志将和须要存储的数据一块儿存储,并在客户端get数据时返回。
客户端能够将此标志用作特殊用途,此标志对服务器来讲是不透明的。
<exptime> 为过时的时间。
若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)。
若是非0(unix时间或者距离此时的秒数),当过时后,服务器能够保证用户得不到该数据(以服务器时间为标准)。
<bytes> 须要存储的字节数,当用户但愿存储空数据时<bytes>能够为0
<data block>须要存储的内容,输入完成后,最后客户端须要加上\r\n(直接点击Enter)做为结束标志。
Memcached数据示例:
六 Memcached数据导出和导入
导出:
memcached-tool 127.0.0.1:11211 dump > data.txt
cat data.txt
导入:
nc 127.0.0.1 11211 < data.txt
若nc命令不存在,yum install nc
注意:导出的数据是带有一个时间戳的,这个时间戳就是该条数据过时的时间点,若是当前时间已经超过该时间戳,那么是导入不进去的
vim mdata.txt中的设置。
七 PHP链接Memcached
先安装php的memcache扩展
cd /usr/local/src/
wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
tar zxf memcache-2.2.3.tgz
cd memcache-2.2.3
/usr/local/php-fpm/bin/phpize
[root@greg02 memcache-2.2.3]#/usr/local/php-fpm/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
解决安装yum install m4;yum install autoconf
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make && make install
安装完后会有相似这样的提示:
[root@greg02 memcache-2.2.3]#make install
Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
而后修改php.ini添加一行
vim /usr/local/php-fpm/etc/php.ini
extension="memcache.so"
检查/usr/local/php/bin/php-fpm –m
下载测试脚本
curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
1.php内容也能够参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/1.php
执行脚本
/usr/local/php-fpm/bin/php 1.php
或者将1.php放到某个虚拟主机根目录下面,在浏览器访问,便可看到效果
最终能够看到数据以下:
[0] => aaa
[1] => bbb
[2] => ccc
[3] => ddd
八 Memcached中存储session
本实例是在lamp/lnmp环境下实现
编辑php.ini添加两行
session.save_handler = memcache
session.save_path = "tcp://192.168.0.9:11211"
或者httpd.conf中对应的虚拟主机中添加
php_value session.save_handler "memcache"
php_value session.save_path "tcp://192.168.0.9:11211"
或者php-fpm.conf对应的pool中添加
php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.0.9:11211 "
wget http://study.lishiming.net/.mem_se.txt
mv .mem_se.txt /usr/local/apache2/htdocs/session.php
其中session.php内容能够参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/session.php
curl localhost/session.php
相似于1443702394<br><br>1443702394<br><br>i44nunao0g3o7vf2su0hnc5440
telnet 127.0.0.1 11211
get i44nunao0g3o7vf2su0hnc5440