单元目标:
1.NoSQL介绍
2.Redis的介绍
3.Redis适用场合
4.Redis的安装与部署
5.Redis的数据类型
6.Redis的经常使用命令
7.Redis的高级应用
经过这七点你们会对redis有深入的理解。首先看NoSQL的介绍,什么是NoSQL啊,NoSQL = Not Only SQL,什么意思啊?不只仅为SQL,他意为反SQL运动,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势愈加高涨。它指的是
非关系型的数据库。
还记得我们的mysql吗,还有谁呢,sql server,oracle等等一些数据库,这些数据库都是关系型数据库,而NoSQL呢,是非关系型数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,MySql在处理高并发读写的时候压力会很是的大,暴露了不少难以克服的问题,而我们的NoSQL呢,因为它自己的一些特色呢,获得了很是迅速的发展。
那么它有什么特色呢,首先的我们的redis它是以key-value的形式存储的,key是键,键值式存储,什么是键值式存储我想你们并不陌生,JS里面我们用键值式存储的数据类型是什么类型,JS里面我们用JSON对象,JSON对象,他是个大括号,{key:value,key:value}这就是一个键值式存储的JSON,这就是一个JSON对象。而我们的PHP当中,以key-value形式存储的数据类型有什么呢,数组,array(“key” = > value)
以上这两种数据类型,是否是都是以key-value形式来存储的吧。那么NoSQL和我们传统的关系型数据库有什么不同呢,它不必定遵循我们传统数据库的一些基本要求,好比说遵循
SQL标准、
ACID属性、
表结构等等。
我们在mysql当中进行增删改查,插入一条数据用insert语句,删是delete语句,改用update语句,查用select语句,这整个都是一个SQL标准语句,整个都是一个语句,但这些个语句呢,在我们的NoSQL当中彻底不适用,也就是说在NoSql当中我们的SQL语句是很差使的,还有我们的ACID属性,
什么是ACID属性呢,ACID表明我们的事务处理,虽然我们的redis也支持事务,可是redis的事务还很是很是的简单,以致于还知足不了我们的要求。什么是事务啊,举个例子:
举个银行转帐的例子,好比说小李有1000元,小明手里也为1000元,如今我要实现一个功能,我如今要把这小李手里的这1000元转帐给小明,转帐之后我们小李是否是要变成900,而后小明变成1100,那么整个的一个过程是什么呢,首先第一步,是否是要从小李那里减100,第二步呢,是否是要给小明加100,这是否是一个过程,而这整个的一个过程就称之为一个事务,若是我执行完第一步,第二步没有执行,那么整个事务会干吗,会回滚,也就是说,第一步完成,第二步没有完成,我们第一步也会干吗,也会回撤,是什么意思呢,好比说我第一步,小李减了100,这个时候服务器忽然被关掉了,说着说down掉了啦,服务器出了问题啦,那我小明是否是没有加上这100,那我不可能把这100块钱蒸发掉吧,我们这样作就不合适了,因此整个要作一个事务,也就是说这儿你减了100啦,可是你小明这儿没有加上100,这个事务是没有完成的,那么你这儿小李减100就,不成功,不成功你的小李的帐户不会被减100,这就是说这两步都完成,这一个事务才算是完成,若是其中的一步没有完成,整个都会回滚到初始状态,这就是我们的ACID属性。
我们的NoSQL一样没有一个固定的表结构,我们还及得mysql当中,若是咱们要插入一条数据,你首先要先建好我们的表结构,而后经过我们的表结构来往里面插入数据对不对,可是我们的NoSQL不须要,你们若是学过我们前门的mogodb数据库,我们是否是没有建立一个表啊,直接往里面插入数据,一样redis也是同样的,这是他同一个的一个NoSQL的一个特色,
那么你们来看一下这一类NoSQL的数据库它们都有什么样的特色啊,
首先他
非关系型,这是他主要的特色,
而后他是什么
分布式的,他在建立之初就是以分布式来建立的,这个作起来主从分离,主从复制,主从分离,读写分离,
这个作起来要比我们的mysql要简单一些要轻松一些,而且他是
开源的,
以及他是
水平可扩展的,
NoSQL特色,
在
处理超大量的数据上有很大的有势,要比我们的mysql要有很大的优点,
再有呢,
运行在较便宜的PC服务器集群上,
以及它击碎了性能瓶颈,
我们在作mysql是否是作了不少优化吖,可是NoSQL呢不须要,NoSQL性能很是高,来我们来看一下,他具备什么样的性能,为何它的性能好呢,
NoSQL的适用场景,
首先我们的NoSQL呢,对于数据的高并发读写有很大的优点,
我们在对mysql进行一次上万次的sql查询,可能还顶得住,可是若是对mysql进行一个上万次写的请求呢,我们的硬盘io是否是就没法承受了,对我们的io是否是要求就比较高,这样就会形成我们的效率低下吧~
可是NoSQL呢对于我们上万次的写是很是很是的轻松的,
对于海量数据的高效率存储和访问呢,国外一个站friedfeed一个月就能够达到2.5亿的用户动态,对于我们关系型数据库来讲呢,在一张2.5亿条数据的表里面要进行SQL查询,你们可想而知是否是很是很是的慢,以致于慢到我们不能够忍受,可是NoSQL作起来会很是的轻松,
对数据的高可扩展和高可用性呢,首先对于一个要24小时提供不间断服务的网站来讲呢,对数据库系统进行升级和扩展是否是很是痛苦啊,每每须要停机维护以及数据迁移,那为何数据库我们不能来增长一个服务器结点呢,
不能增长服务器结点来完成呢,这个时候我们NoSQL来作分布式吧,刚刚说过了NoSQL来作分布式是否是很是的轻松,以及NoSQL没有一个固定的表结构,
在你未来对系统进行迭代开发的时候,若是我们要对表结构进行更改,MySQL作起来是否是很是的麻烦,要对之前的数据进行彻底的更改吧,
可是我们的NoSQL不须要,由于他没有固定的表结构,这是NoSQL三个重要的适用场景,
Redis的介绍,这是他官方的一个介绍,
Redis is an open source, advanced key-value store. It is often referred to as
a data structure server since keys can contain strings, hashes, lists, sets and
sorted sets.
为何要定义个数据结构服务器,学过数据结构的都知道,字符串,哈希,链表,集合以及有序集合,这五种类型是否是相似于我们的数据结构里面的类型,
Redis是一个开源的,先进的key-value存储。他一般被称为数据结构服务器,由于键能够包含字符串,哈希,链表,结合和有序集合,
redis的链表能够作成栈,也能够作成队列,栈是先进后出,而我们的队列呢,是否是先进先出呢,由于上下是通的,而我们的栈呢是上通下堵的,
Redis是一个Key-Value存储系统。它支持存储的value类型不少,包括string(字符串)、list(链表)、set(集合)、zset(有序集合)。
这些数据类型呢,都支持什么,push/pop、add/remove。
push/pop什么意思啊,还记得我们php里面,对数组进行压入跟弹出吗,array_push这是我们对数组进行一个压入吧,对它弹出呢,是否是array_pop同样的,
一样的我们的list里面,我一样能够往里面压入数据,也能够向外面弹数据,一样的对我们的集合,集合就相似于我们数学里面的一个集合,
这个集合能够添加add,能够删除remove,能够对他里面的键进行添加和删除,以及集合与集合之间能够有交集,还有并集,还能够是差集,这是集合的相关操做,
因此说我们的redis操做起来是很是的丰富的,它还支持各类不一样方式的排序,由于redis还有有序集合,有序集合他是给你增长一个字段,增长一个键来存储它的顺序,
为了保证效率数据都是缓存在内存中的,这就是redis快的一个缘由,可是
存储在内存当中,我们是否是
有必定的风险啊,若是我哪一天我服务器忽然断掉了,忽然down掉了,内存当中的东西是否是会释放,
数据是否是也会丢失啊,因此我们的redis支持,
周期性的把数据更新到磁盘里面。或者把相关的读写操做写入,读不存啊,
把修改或者写入操做,追加到我们的记录文件里面。
这个时候有相似于我们的bin-log了吧,相似于mysql当中的bin-log啦存的都是
更新数据、删除数据或者是插入数据的相关操做吧,
这就是说我们更新或者写入磁盘有两种方式,一种是
把数据进行快照,还有一种方式就是
把我们的操做记录下来,这是他保存数据的两种方式,
Redis提供的API语言包括我们的c、c++、C#、Erlang、java、Javascript、Lua、Objective-C、Perl、PHP、Python、Ruby等
目前全球最大的Redis用户是新浪微博,在新浪有200多台物理机,有400多个端口正在运行这Redis,有超过4G的数据在Redis上来为微博用户提供服务。
那他在新浪微博是怎么用的呢,在新浪微博redis的部署场景不少,大概分为以下的2种:
1.应用程序直接访问Redis数据库,
applications是我们的应用程序,他直接向我们的redis服务器来进行写入操做吧,读呢,一样也从我们的数据库中来读,
这是他的第一种场景,这样子作起来是否是比较简单,是否是和我们的php+mysql是否是同样的啊,
这样子作起来比较简单,只不过说仅仅是怎么的mysql替换成了redis,可是这样子作起来有些不安全,若是我那天redis down掉了,
或者是内存当中的数据被释放掉了,我数据是否是永久丢失了,这样会有必定的问题,
2.那么他有第二种场景,首先应用程序,直接访问我们的redis,可是当redis访问失败时候,他会用第二种方案,直接访问mysql。
首先我们的应用程序会先访问redis,由于redis会比我们的mysql要快吧,这么这个时候redis会跟后面的mysql集群来进行同步,他俩的数据是彻底
同步的,
当你的redis集群出现问题了之后,我就是当前的应用系统直接去访问他不成功了吧,直接去访问redis不成功了吧,那怎么办,他会去找谁啊,回去找后面的mysql,
这样子是否是达到一个
双重保险啊,以致于我们的网站不会被G掉,这是redis在新浪微博的两种适用场景,
redis把海量数据装进redis比mysql把海量数据装入mysql要轻松多,
把大象装进冰箱的过程:
一、打开冰箱门
二、把大象装进去
三、把冰箱门关上
首先
链接数据库,而后把数据
写入到数据库里面,最后
关闭数据库吧,
redis很容易让大象本身走进冰箱里面,由于,我刚才是否是说了,他有五种数据类型,
这五种数据类型呢,能够为大象定制不一样的冰箱,也就是说为我们的数据定制不一样的数据类型,
这样作起来灵活的数据结构和数据操做,
redis具体的适用场景:
1.取最新的n个数据的操做,
2.排行榜应用,取top n操做,
3。须要精确谁的难过过时时间的应用,redis能够对键设置过时时间,多长时间有效,这是MySQL没法作到的。
4.计数器的应用,新浪微博主要用在计数器上面,
5.Uniq的操做,获取哦某段时间全部数据排重值,
6.实时系统,反垃圾系统
7.Pub/Sub构建实时消息系统,这是redis独有的一个系统,pub/sub,发布与订阅,后面详细介绍,
8.构建队列系统,list类型能够构建栈或者队列,
9.以及redis能够作缓存,
说着这么多我们的redis跟我们的mysql到底有什么样的不一样点,
redis
|
mysql
|
mogodb
|
库
|
库
|
库
|
无
|
表
|
集合
|
无
|
字段行列
|
无
|
首先第一点redis和mysql都有库的概念,第二点我们的mysql是否是有个表的概念,可是我们的redis没有表的概念,
第三点mysql有字段的概念 ,行跟列的概念,redis没有这些概念,mogodb也是有库,那表呢是集合,可是这个集合跟redis的集合是不同的,
我们redis的集合是数据类型,而mogodb中的集合呢,类是于mysql当中的表,那么字段跟行跟列呢,他一样也没有,
reids没有表和字段,前面说过啦,NoSQL不存在表结构吧,这就是他不存在表结构的缘由,这就是这三个的对比,
Redis的安装和部署,
下载Stable稳定版本的,尽可能不要用Release版本的或者测试版本的。我们尽可能使用它的标准版,这样子稳定一些。
第一步下载下载完之后我们给它传到linux下,行吗,我们作安装与部署我们所有在linux下面去作,
首先我们第一步是先解压,安装我们的源代码包的时候须要先解压,解压用我们的tar
tar zxvf redis-2.4.17.tar.gz
选择用zxvf,v表明现实详细信息,这个v能够不加,而后后面选中你的包名,解压出来干吗进入到我们的包里面
cd redis-2.4.17
redis不一样于mogodb,mogodb是否是我们解压出来以后就直接看成绿色版来用啊,
我们redis须要编译,须要make一下,可是他没有干吗,没有配置configure吧
直接进行编译,没有进行配置,配置完之后直接跳到它的src文件夹里面
cd src
&&
make install
来进行安装,这样子就会使我们的redis安装成功,
安装成功之后呢,我们为了便于管理,我们给他建立一个文件夹,建立到我们的usr/local/redis/bin目录下面。
步骤三,移动文件,便于管理:
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mv /lamp/redis-2.4.17/redis.conf /usr/local/redis/etc
cd /lamp/redis-2.4.17/src
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli
redis-server /usr/local/redis/bin
/bin 用来放
命令,
/etc 用来放
配置文件,
建立完文件后,咱们使用mv,mv能够移动,也能够更名,
把命令和配置文件都移动过来,这样作是为了管理,
步骤四:启动Redis服务:启动用的是我们的redis-server命令,可是要指定一个配置文件
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
Redis服务端默认的链接端口是6379,
mysql的默认端口是 3306
mogodb默认端口是 27017 28017
那么启动完服务以后怎么来启动redis客户端呢,
步骤五:客户端链接
能够经过redis-cli命令
/usr/local/redis/bin/redis-cli
步骤六:中止Redis实例
咱们可使用/usr/local/redis/bin/redis-cli shutdown
也可使用pkill redis-server
也可使用killall
还能够好似用kill -9均可以的,
启动虚拟机,
我先来讲一下个人环境,我们来,对虚拟机,我们来使用VMware Nerwork Adapter VMnet1,
打开网络与共享中心->更改适配器设置
为何不实用桥接呢,使用桥接我们是否是得插网线啊,我们为了方便啊,
我们使用VMnet1->属性,来看一下它的属性,来打开一下它的ipv4
ip我这里是
88网段的,而且
ip是88.1
个人
Linux系统的ip是88.89是跟他统一网段的,
若是不是同一网段,我们是否是链接不成功啊,
必须是同一网段啊,可是ip不可以相同,
VMware Workstation->File->Open
首先打开个人一个镜像啊,这是以前我作好的一个系统,
这个系统呢,我前面有快照,我们把他恢复到纯lamp环境下,这里面我只有
我们的lamp环境,没有其余软件,好我们启动一下,
系统启动成功我们用root用户来登陆,登陆成功之后我们来看一下我们的ip地址,
看ip我们用什么命令,
ifconfig
eth0的ip是192.168.88.89
lo是什么,lo是回环网卡,
那好我如今既而后ip地址,我能够
经过VMnet1对我们的linxu进行远程链接,
登陆成功之后我们用ifconfg看下是否是192.168.88.89看一下是否是登陆成功了,
登陆成功之后,咱们先看下我们的软件包,一个是redis-2.4.17.tar这是他的服务器软件包
owlient-phpredis-2.1.1.-1-g90ecd17.tar这个包是我们的php链接redis须要打的一个扩展模块,
今天先利用ftp把redis-2.4.17.tar上传到服务器上面, 咱们进入到根目录下面的lamp目录下面,编译我们lamp环境的时候,我全部的
软件包都在这里面放着,redis也不例外,咱们把他放进来,传上来之后,咱们
#cd /lamp
#ll
发现我们的redis是否是上传成功,上传成功之后我们第一步是否是须要解压啊,用tar命令来解压,由于压缩包以tar.gz结尾的,
#tar zxvf redis-2. ....用tab补全,
解压成功之后,进入到我们的redis目录
#cd redis-2.4.17
进来之后第二步须要干什么,须要make,make是我们的编译吧~
编译成功之后我们须要进入,
#ll
须要进入我们的
src目录下
#cd src
而后
#make install
那如今来看一下,
#ll
如今来看一下是否是有我们的redis的相关命令
redis-cli等等,,,,
那好我如今为了便于管理,我们须要建立文件夹,
#cd /usr/local/
我全部的源代码包都安装在此,
#ll
我全部的软件都在这里放着,咱们把redis也放在这里能够吧,
建立目录我们用mkdir命令
-p指定一个递归建立,
#mkdir -p /usr/local/redis/bin 存放redis命令
#mkdir -p /usr/local/redis/etc 来存放redis配置文件
如今就有了一个redis文件夹,
#cd /lamp/
#cd redis-2.4.17
#ll
如今就把redis.conf移动到redis下面的etc下面
#mv ./redis.conf usr/local/redis/etc/
下一步我们在移动src里面的相关命令,把全部标绿色的命令都移动到redis/bin/目录地下,
这两个目录是我刚才建立的,
这个时候已经安装成功了,我们能够启动一下,
#cd bin
咱们刚才说了启动redis服务用我们的redis-server命令
#./redis-server
启动,这个时候启动成功,可是有一个
警告
:
你们会看到,他占用我们当前的一个session(会话), 他没有后台启动吧,端口是6379是他的一个默认端口,
可是没有一个配置文件指定, 没有指定配置文件,我刚刚说了,启动的时候,是否是能够指定我们的配置文件。
#./redis-server /usr/local/redis/etc/redis.conf
第一个警告没有,启动,那我如今仍是在前台运行,占用我们的session
我们先给她关闭掉,用Ctrl + C退出,那么我们有没有办法让他回台运行呢,
还及得mysql当中启动mysql后台启动mysql是怎么启动的吗
#mysqld_safe --user=mysql &
若是要后台启动是否是
加一个&符,表示后台做业,
那我们mogodb后台启动是怎么启动的,是否是加一个#--fork
这是mysql跟mogodb后台启动的两种方式,那我们redis后台启动怎么启动啊,能用这两种方式吗,答案是不行的,那我们怎么样让他进行后台启动呢,
首先我们啦看下配置文件,redis配置文件中有个daemonize,若是须要后台运行,把该项改成yes,
我手工编辑一下,
#vi /usr/loval/redis/etc/redis.conf
首先第一项就是daemonize默认是no,把他改为yes,下面咱们来启动并指定他的配置文件,
你们来看如今是否是没有东西在前台做业了,可是启动成功了没有呢,那我们来看一下它的端口,看以进程启动我们是否是用
#ps -ef | grep redis
那么怎么看它的端口,你们还记得redis的端口,默认端口是
6379,
我们查看这个6379端口占用了没有,我们用命令:
#netstat -tunpl | grep 6379
也就是说我们的redis服务器启动成功,而且我们的配置文件指定了
/usr/local/redis/etc/redis.conf
那么配置文件里面除了对我们后台运行有配置,还有什么配置啊,来我们详细来看一下,
pidfile 配置多个pid的地址 默认在/var/run/redis.pid
还能够绑定我们的ip用
bind 帮顶ip,设置后
只接受来自该ip的请求,
port 监听端口,默认为6379
timeout设置客户端链接时的超时时间,单位为秒,
loglevel,logfile ,日志级别和日志文件,
databases设置数据库的个数,默认使用的数据库为0,
save设置redis进行数据库镜像的频率,同步我们的数据,
rdbcompression在进行镜像备份的时候,是否进行压缩,
Slaveof作我们主从的,在从服务器上面来配置的,
设置数据库为其余数据库的从数据库,等等一些内容,
Appendfsync 这是对我们的数据进行备份的第二种方式,设置对appendonly.aof文件同步的频率,
vm打头的全是设置虚拟内存的,
#vi redis.conf
看下配置文件里面都有什么内容,
大家这个时候我们的redis就启动成功了,那么redis启动成功之后,我们怎么创建,客户端与服务器端的链接
用redis-cli
# ./redis-cli
这个时候是否是进入成功啊,看这里有一个,提示,ip和端口,
退出是exit,或者是quit同样的,
咱们关闭redis服务,能够用
#pkill redis-server
#!net 回车输出:
netstat -tunpl | grep 6379
#netstat -tunpl | grep 6379 按向上的箭头便可出现,
这个时候咱们发现6379的端口没有人占用了,也就是说我们的redis服务器已经被关闭了
这个时候再
#./redis-cli 还能进去吗
这里有一个提示,
Could not connect to Redis at 127.0.0.1:6379:Connection refused