单元目标:
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 asa data structure server since keys can contain strings, hashes, lists, sets andsorted 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要轻松多,
把大象装进冰箱的过程:
1、打开冰箱门2、把大象装进去3、把冰箱门关上
首先连接数据库,然后把数据写入到数据库里面,最后关闭数据库吧,
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的安装和部署,
Redis的官方下载站是http://redis.io/dounload
下载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