NoSql for Redis

1、什么是Redis:

     Redis是一种基于内存中以key-value形式存放的数据结构服务器,主要用于高并发,高效率读写操作,Redis还支持以磁盘方式进行存储保证数据的完整性,同时Redis对服务器的要求降低很多只要提供足够的内存,Redis就可以存放大量的数据块。Redis支持五种数据String(字符型)、List(链表)、Set(集合)、Zset(有顺集合)和Hash(哈希),不同的数据类型满足不同的业务需求。五种数据结构都支持push/pop,add/remove操作并支持原子性。

2、非关系型与关系型数据库比较:

     关系型数据库指的就是:Mysql, SQL Server,Oracle都是基于二维表数据存放在磁盘数据文件中,提供视图对象展示

     优点:

       1、提供丰富的SQL查询机制,支持高级查询。

       2、支持事务,索引、存储过程,游标等。

       3、一致性较高,在高并下一般采取锁的形式来保证数据的安全性。

       4、提供二维视图易于理解。

    缺点:

       1、不适用高并发下读写操作,分库分表只缓解服务器资源。

       2、在进行高级联表查询时,效率慢。

       3、对服务器要求较高,内存消耗较大。

       4、维护成本较高,不利于转移和转型。

非关系型数据库:Redis 和MongoDB。

      非关系型数据库都是基于key-value的形式进行存放,数据之间没有关联性,基于内存储存。

     优点:

     1、基于内存存储读写效率较高,支持海量的数据访问。

     2、提供高效率下的高并发操作。

     3、数据结构丰富,支持多种的存储方式。

     4、每个数据都是具有原子性,读写较快。

     缺点:

     1、因为是基于内存存储,内存消耗较大。

     2、不支持视图展示。

     3、Redis只支持部分的事务处理机制,而MongoDB是基于内存不能同步磁盘上风险较大。

    主要比较Mongodb和Redis:

     Mongodb:支持大量的事务处理,包括游标,索引,查询功能强大,支持Json数据格式,能存储海量的数据,但不是支持事务,mongodb比redis更加的消耗内存。mongodb数据类型比较单一,而redis支持5种数据结构。redis只支持较小的量的数据运算,对于海量数据mongodb要比redis强大的多。

3、Redis的应用场景:

   在传统的企业开发项目中一般都是使用比较常用的mysql数据库,这种对于业务量较小的系统基本可以满足,但对于业务的需求越来越多,数据量越大越大则mysql数据库就有点对以支撑了,虽然提供分库分表的解决方法,也只是解决燃眉之急,对于以后的数据库维护将花费大量的成本和时间。在数据量大的情况下服务器就会要求越来越高,成本也就增加了。如何解决大量数据下的访问并降低服务器的消耗性能,就出现了非关系数据库Redis和Mongodb减轻服务器的消耗。mysql基于磁盘,redis基于内存让两种方式进行同时运用,对于较小操作的用于mysql数据库,对于高并发读写操作用redis。查看下图:

web端用户发送请求,先请求redis数据库,如何找到则将数据结果交给dataset返回客户端,如果查找redis数据库没有找到再将请求交给mysql查询,然后将结果集保存到redis中,再返回数据到dataset中返回,其中redis1,redis2,redis3是redis的集群配置,数据都保持同步性和原子性。这样就减少了直接对数据库的访问,极大的提高读写速度。

4、Redis的安装

    参考:https://www.cnblogs.com/KunGe-13/p/8340309.html

5、Redis监听主从配置

设置一个master 两个salve节点 端口7000的为master 7001 7002为salve节点。

    进入redis目录中复制文件

[root@localhost redis]# cp redis.conf   /usr/local/redis_cluster/(自定义目录)

[root@localhost redis]# cd  /usr/local/redis_cluster/

[root@localhost redis_cluster]# cp redis.conf redis_7000.conf

[root@localhost redis_cluster]# cp redis.conf redis_7001.conf

[root@localhost redis_cluster]# cp redis.conf redis_7002.conf

[root@localhost redis_cluster]#vim redis_7000.conf  

修改以下几点 将6379修改为7000  ,其它两个一样:

port 6379

pidfile /var/run/redis_6379.pid

logfile "/data/logs/redis.master_6379.log"

daemonize yes

logfile "cluster-6379.log"

dbfilename dump-cluster-6379.rdb

appendfilename "appendonly-cluster-6379.aof"

增加监听文件

[root@localhost redis_cluster]# touch sentinel.conf

[root@localhost redis_cluster]# vim sentinel.conf

增加内容:

sentinel monitor host7000 127.0.0.1 7001 1

[root@localhost redis]# sentinel /usr/local/redis_cluster/sentinel.conf 

运行各个服务
[root@localhost redis]# ./redis-server /usr/local/redis_cluster/redis_7000.conf

[root@localhost redis]# ./redis-server /usr/local/redis_cluster/redis_7001.conf

[root@localhost redis]# ./redis-server /usr/local/redis_cluster/redis_7002.conf

[root@localhost redis]# redis-cli -p 7000

[root@localhost redis]# redis-cli -p 7001

[root@localhost redis]# redis-cli -p 7002

可以使用ps -ef | grep 查看redis服务

运行后sentinel为自动的将7000设置为master,7001和7002为slave节点,当7000死机时,会自动的将7001升级为master。

redis集群中数据是保持同步的每个主机之间数据保持一致当一个主机死时,sentinel 会监听哪个服务器死掉,然后从机升为主机,当死掉的主机再次运行时就变成了从机,数据会同时复制的机器上,达到一致性。

6、持久化之RDB和AOF

RDB持久化配置

Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件之后,我们搜索save,可以看到下面的配置信息:

save 900 1              #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

save 300 10            #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。

AOF持久化配置

在Redis的配置文件中存在三种同步方式,它们分别是:

appendfsync always     #每次有数据修改发生时都会写入AOF文件。

appendfsync everysec  #每秒钟同步一次,该策略为AOF的缺省策略。

appendfsync no          #从不同步。高效但是数据不会被持久化。

RDB与AOF存在哪些优势?

1). 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

2). 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。

3). 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

4). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

RDB又存在哪些劣势呢?

1). 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

2). 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

AOF的优势有哪些呢?

1). 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。

2). 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。

3). 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

4). AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。

AOF的劣势有哪些呢?

1). 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

简单的说AOF是为了保证RDB数据不会丢失而采用的方案。RDB存储时存在一的时间戳或者主机当场死掉,数据还没有存入dump.rdb文件就死机了,为了保证数据的完整采用AOF方案,达到秒级保存能提高数据的安全性,但是会增加内存消耗。两者之间要根据实际需要来制定方案。

猜你喜欢

转载自blog.csdn.net/looplook21/article/details/87541520