NoSQL(NoSQL = Not Only SQL),意味反sql运动,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势愈加高涨。它指的是非关系型的数据库。javascript
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的sns类型的web2.0纯动态网站已经显得力不从心,暴露了不少难以克服的问题,而非关系型的数据库则因为自己的特色获得了很是迅速的发展。php
高并发读写的性能 大数据量的扩展(分布式存储) 配置简单css
灵活、高效的操做与数据模型 低廉的成本html
没有统一的标准 没有正式的官方支持 各类产品还不算成熟java
新浪微博 Redis Google Bigtable Amazon SimpleDB 淘宝数据平台 Tairmysql
优酷视频 MongoDB 飞信空间 HandlerSocket 视觉中国网站 MongoDBlinux
Memcached是danga的一个项目,最先是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被不少大型的网站采用。 官方网站: www.danga.com 和 memcached.orgweb
Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界很多人使用这个缓存项目来构建本身大负载的网站,来分担数据库的压力,经过在内存里维护一个统一的巨大的hash表,它可以用来存储各类格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,而后从内存中读取,从而大大提升读取速度。(注: 摘自百度全科)redis
Memcached是一个高性能的分布式的内存对象缓存系统sql
分布式的概念:咱们在实际的项目中可使用多台memcache服务器,共同工做,存储的数据是分布式的。
一、下载软件,并解压,拷贝到指定的位置,通常便于管理,和服务器的环境在同一个目录下
二、以管理员的方式进入到cmd窗口,并进入到memcache所在的目录
memcache.exe –d install 安装:安装完成后,经过Windows+R调出运行界面输入services.msc查看服务以下
三、安装完成后,启动memcache服务
memcached.exe –d start
启动后,能够经过netstat –an命令查看memcahce的端口是否监听状态,memcache的端口号是,11211
四、安装可能失败的缘由:
a 若是你是用win7,win8系统,他对安全性要求高,所以,须要你们使用管理员的身份来安装和启动. 具体是 程序开始===>全部程序==》附件==》cmd(单击右键,选择以管理员的身份来执行)
b存放memcached.exe 目录不要有中文或者特殊字符
c 安装成功,可是启动会报告一个错误信息,提示缺乏xx.dll ,你能够从别的机器拷贝该dll文件,而后放入到system32下便可.
d若是上面三个方法都不能够,能够直接 cmd>memcached.exe -p 端口 【这种方式不能关闭窗口】
五、在启动时指定的一些基本命令
-p 监听的端口 -l <ip地址>绑定地址(默认:全部都容许,不管内外网或者本机ip,有安全隐患,若设置为127.0.0.1就只能本机访问)
-d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务 -d uninstall 卸载memcached服务 -u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB -M 内存耗尽时返回错误,而不是删除项 -c 最大同时链接数,默认是1024
-f 块大小增加因子,默认是1.25 -n 最小分配空间,key+value+flags默认是48 -h 显示帮助
链接方式:telnet ip地址 端口号 telnet localhost 11211
数据存储格式:相似于关联数组
第一列 第二列
键名(通常是字符串) 具体的数据内容(除了资源)
增删改查操做
一、添加数据
add 键的名称 0 缓存的时间 数据的长度 (回车后添加内容) 0表示不压缩:
好比:add color 0 100 3 表示向memcache里面添加的数据键为color,缓存的周期是100秒,数据的长度是3
二、获取数据
get 键名 get color
三、修改数据
replace 要求键名必须存在,若是不存在,则提示一个错误。
set set 指令也能够替换数据,若是键存在则替换,若是不存在,则等于添加。
四、删除数据
基本语法:delete 键名称
flush_all 清空全部的数据
五、其余的一些命令
六、获取memcache查询的成功率
memcache查询效率 = get_hits / cmd_get
一、从网上下载memcache php的扩展,该扩展要和php的版本一致。要下载php版本对应的memcache的扩展。
二、把对应的memcache扩展拷贝到php安装目录的ext下面。
三、修改php配置文件php.ini打开扩展支持 extension=php_memcache.dll
四、重启apache,经过运行phpinfo()函数来进行测试。
五、简单使用,能够存储字符串、整数、小数、对象、数组,其中存储数组时只能是一维数组,存储时以序列化方式存储
<?php $mem=new Memcache(); $mem->connect("localhost",11211); //先完成数据的取出 //若是把取出的data数据给缓存到memcache里面 //取出的数据是由sql语句决定的。键由sql语句字符串,值就是取出的数据 $sql = "select title from dede_archives limit 5"; $key = md5($sql); echo $key; //先从memcache里面取出数据 $data = $mem->get($key);//根据键名称从memcache里面取出数据 //判断是否取出数据,若是数据为空,则从数据库里面获取数据。 if(!$data){ $conn = mysql_connect("localhost",'root','root'); mysql_query("use itdede"); //mysql_select_db(); mysql_query("set names utf8"); $res = mysql_query($sql,$conn); $data = array(); while($row=mysql_fetch_assoc($res)){ $data[]=$row; } //从数据库里面获取的数据,添加到memcache里面。 $mem->add($key,$data,MEMCACHE_COMPRESSED,100); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"> <head> <title>新建网页</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="description" content="" /> <meta name="keywords" content="" /> <script type="text/javascript"></script> <style type="text/css"></style> </head> <body> <?php foreach($data as $v){?> <li><?php echo $v['title']?></li> <?php }?> </body> </html>
使用范围:在没有php操做memcache扩展的前提下使用,推荐使用php,memcache的扩展。
测试前:要关闭扩展。具体的使用步骤:
一、把源码文件拷贝到项目的指定位置。
二、引入源码文件
方法一:在php.ini文件中配置
一、设置存储方式: session.save_handler=memcache
二、设置存储位置:session.save_path="tcp://localhost:11211,tpc://192.168.1.89:11211"
session文件存储到memcache是经过sessionid做键的;把session文件存储到memcache后,不影响session的任何操做。
方法二:直接在文件中设置,其实这样更好,由于不会影响到别人的使用session的方式
ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://localhost:11211");
原理以下图: 具体代码以下图:
若是只有一台电脑,无需虚拟机也能够模拟两台memcache 服务器。能够经过memcached.exe –p 11210来开启。
具体代码如图:
一、生命周期的问题
①秒数,可是有限制,不能超过 2592000秒(30天)。
②时间戳,好比咱们要设置超过1个月,则以下设置
$mem->add('name1','yangguang',MEMCACHE_COMPRESSED,time()+3600*24*31);若是设置为0,则表示永不过时。
存储到memcache里面的数据,什么状况下会丢失:
(1)生命周期到了(2)关闭memcache服务(3)关机,重启。
二、memcache中善于存储哪些数据
①更新比较频繁的数据(用户的在线状态),查询比较频繁,数据量不是很大。
②安全性不是很高。
若是没有memcache这个产品,能够经过mysql的memory存储引擎。
三、memcache的安全性
①内网(两块网卡,memcache在启动时指定那台访问)
memcached –d –u root –l 192.168.1.100 –p 11211.指定只有192.168.1.100服务器才能访问。
②防火墙
在linux中,设置命令:iptables -a input -p 协议 -s 能够访问ip -dport 端口 -j ACCEPT
例如:
iptables –a input –p tcp –s 192.168.1.1 –dport 11211 –j ACCEPT
iptables –a input –p tcp –s 192.168.1.1 –dport 11211 –j ACCEPT
四、Memcached机制深刻了解
①基于c/s架构,协议简单
②基于libevent的事件处理
③内置内存存储方式
④基于客户端的分布式
redis是一个开源的,先进的key-value存储。它一般被称为数据结构服务器,由于键能够包含字符串、哈希、链表、集合和有序集合。
(1)架构方式:c/s 客户端和服务器
(2)redis不只能够存储到内存中,并且能够把数据同步到硬盘中,达到数据的存储持久化。
(3)redis数据存储是键值对,存储的值的类型有五种:string(字符串),hash(哈希),list(链表),set(无序集合),zset(有序集合),这些数据类型都支持push/pop、add/remove及取交集和并集及更丰富的操做、Redis支持各类不一样方式的排序。
(4)提供的API语言包括:C C++ C# Clojure Common Lisp Erlang Haskell Java Javascript Lua Objective-C Perl PHP Python Ruby Scala Go Tcl
http://redis.googlecode.com/files/redis-2.4.17.tar.gz
tar zxvf redis-2.4.17.tar.gz
cd redis-2.4.17
make
cd src && make install
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mv redis.conf /usr/local/redis/etc
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
启动格式:redis-server 指定的配置文件
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
打开配置文件/etc/redis.conf,若是须要在后台运行,把daemonize项改成yes
pkill redis-server
string(字符串):相似于memcache里面的数据存储方式 key values
hash(哈希):相似于关系型数据库里面的行,也是键值对,值里面又有键值对
list(链表):能够模拟队列和栈。数据存储是有顺序的。
队列:先进先出。栈:先进后出。
set(集合) 集合的示意图:
zset(有序集合) 集合里面的内容是有序的
String是最简单的类型,一个 key对应一个Value,String类型是二进制安全的。Redis的 string能够包含任何数据,好比jpg图片或者序列化的对象。
语法:set 键名称 值。set name zhangsan,从新设置则直接覆盖
语法:get 键值。get name
setnx name zhangsan
语法:setex 名称 有效期 值。setex color 10 red
语法:setrange 键名称 开始替换序号 替换的内容。setrange email 7 qq.com
语法: mset 名称1 值1 名称2 值2 mset name lisi age 18 height 168
msetnx name lisi age 18 height 168
getset name wangwu
getrange name 0 5
mget name age height
incr age incrby age 45
decr age decrby age 45
append name is man
strlen name
Redis hash是一个string类型的field和value的映射表。它的添加、删除操做都是0(1)(平均)。hash特别适合用于存储对象。相较于将对象的每一个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,而且能够更方便的存取整个对象。
语法: hset 哈希名称 字段名称 值 hset myhash name xiaowang
语法:hget 哈希名称 字段名称 hget myhash name
hsetnx myhash name lisi
语法:hmset 哈希名称 field1 value1 field2 value2 hmset hash2 name yuguo age 77
语法:hmget 哈希名称 field1 field2 hmset hash2 name age
hincrby hash2 age 20
hexists hash2 age
hlen hash2
语法:hdel 哈希名 field hdel hash2 age
hkeys hash2
hvals hash2
hgetall hash2
list是一个链表结构,主要功能是push、pop、获取一个范围的全部值等等,操做中key 理解为链表的名字。redis的list类型其实就是一个每一个子元素都是string 类型的双向链表。咱们能够经过push、pop操做从链表的头部或者尾部添加删除元素,这样list既能够做为栈,又能够做为队列。
语法:lpush 链表名称 值内容
语法:lrange 链表名称 0 -1,注意0 和 -1 表示取值范围,从头部到尾部。
语法:rpush 链表名称 值内容
set是集合,它是string类型的无序集合。set是经过hash table实现的、添加、删除和查找的复杂度都是0(1)。对集合咱们能够取并集、交集、差集。经过这些操做咱们能够实现sns中的好友推荐和blog的tag功能。
语法:sadd 集合名 元素
语法:sdiffstore 新的集合 集合1 集合2
sorted set是set的一个升级版本,他在set的基础上增长了一个顺序属性,这一属性在添加修改元素的时候能够指定,每次指定后,zset会自动从新按新的值调整顺序。能够理解为有两列的mysql表,一列存value,一列存顺序。操做中的key理解为zset的名字。
语法:zadd 集合名 序号 内容
(11)zremrangebyrank删除集合中排名在给定区间的元素
redis提供了丰富的命令对数据库和各类数据库类型进行操做,这些命令能够在linux终端使用。
本例中咱们获取了dir这个参数配置的值,若是想获取所有参数的配置只须要执行”config get *”便可将所有的值都显示出来
设置客户端链接后进行任何其余操做前须要使用密码。注意:由于 redis速度至关快,因此在一台比较好的服务器下,一个外部的用户能够在一秒钟进行150k次的密码尝试,这意味着你须要指定很是很是强大的密码来防止暴力破解。
#requirepass 设置的密码 设置完密码后,redis服务要重启
好比:requirepass guangzhou
第一种方式:登陆后,执行auth 设置的密码 后才能操做,不然不能任何操做
第二种方式:在登陆时,输入密码 /usr/local/redis/bin/redis-cli –a 设置的密码
redis是一个支持持久化的内存数据库,也就是说redis须要常常将内存中的数据同步到硬盘来保证持久化。
redis支持两种持久化方式:
快照是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。能够经过配置设置自动作快照持久化的方式。咱们能够配置redis在n秒内若是超过m个key修改就自动作快照。
快照方式的缺点:因为快照方式是在必定间隔作一次的,因此若是redis意外down掉的话,就会丢失最后一次快照后的全部修改。
aof比快照方式有更好的持久化性,是因为在使用aof时,redis会将每个收到的写命令都经过write函数追加到文件中,当redis重启时会经过从新执行文件中保存的写命令来在内存中重建整个数据库的内容。
固然因为os会在内核中缓存write作的修改,因此可能不是当即写到磁盘上。这样aof方式的持久化也仍是有可能会丢失部分修改。能够经过配置文件告诉reids咱们想要经过fsync函数强制os写入到磁盘的时机。
daemonize若是须要在后台运行,把该项改成yes pidfile:配置多个pid的地址 默认在/var/run/redis.pid
bind:绑定ip,设置后只接受来自该ip的请求 port:监听端口,默认为6379
timeout:设置客户端链接时的超时时间,单位为秒。 logfile:配置log文件的地址。
databases:设置数据库的个数,默认使用的数据库为0 sava:设置redis进行数据库镜像的频率。
rdbcompression:在进行镜像备份时,是否进行压缩。 Dbfilename:镜像备份文件的文件名。
Dir:数据库镜像备份的文件放置路径。 Slaveof:设置数据库为其余数据库的从数据库。
Masterauth:主数据库链接须要的密码验证。 Requirepass:设置登陆时须要使用的密码。
Maxclients:限制同时链接的客户数量 Maxmemory:设置redis可以使用的最大内存。
Appendonly:开启append only模式。