Redis初识(二)

原创 2016年08月29日 12:56:18

Redis原理

转自:http://m.blog.csdn.net/article/details?id=51518928

redis是一种高性能的key-value数据库。

一、  redis目前使用有两种场景,一种是作为缓存,一种是作为数据库使用。

当作为缓冲使用时,如图,视图已经被某大神画好,感激。。。


图解,访问时,如果key存在时,直接获取key的值,返回给客户端;如果key不存在时,则去持久化数据库中获取数据,返回给用户,并缓存redis。

适用场合:数据量大而且不经常变更。


当作为数据库时,如图


优点:用redis做数据库,更新速度快,适合频繁变化的数据。

缺点:对redis的依赖大,做好故障时的数据的保存。

难点:前期时key的格式设计,更好的保存到db中。

二、 redis的启动流程。

再次感谢大神提供的视图。。。


三、redis 数据库的持久化方案

1、RDB持久化方案

在redis运行时,reb程序会将当前内存中的数据的快照保存到磁盘中,redis需要重启时,rdb程序会通过重载rdb文件来还原数据。

看出rdb有两个功能:

保存(rdbsave):rdbsave负责将数据库中的数据转换成RDB的格式保存到磁盘,如果rdb文件存在则替换,在保存的时候进程会发生阻塞,影响其他客户端请求:

为了避免阻塞,redis提出了rdbsavebackgroup函数,在新建的子进程中调用rdbsave,完成保存后发送型号通知主进程,主进程继续处理客户端请求。

读取(rdbload):当Redis启动时,会根据配置的持久化模式,决定是否读取RDB文件,并将其中的对象保存到内存中。

载入RDB过程中,每载入1000个键就处理一次已经等待处理的客户端请求,但是目前仅处理订阅功能的命令(PUBLISH 、 SUBSCRIBE 、 PSUBSCRIBE 、 UNSUBSCRIBE 、 PUNSUBSCRIBE),其他一律返回错误信息。因为发布订阅功能是不写入数据库的,也就是不保存在Redis数据库的。
RDB的缺点:
再说RDB缺点时,需要提到的是RDB有保存点的概念。在默认的redis.conf中可以看到这样的默认配置:
  

意思是当满足上面任意一个条件时,将会进行快照保存。为了保证IO读写性能不会成为Redis的瓶颈,一般都会创建一个比较大的值来作为保存点。
1.此时如果保存点设置过大,就会导致宕机丢失的数据过多。保存点设置过小,又会造成IO瓶颈
2.当对数据进行保存时,可能会由于数据集过大导致操作耗时,这会导致Redis可能在短时间内无法处理客户端请求。

2、AOF持久化方案

以协议文本的方式,将所有对数据库写入的命令保存到AOF文件中,达到记录数据库状态的目的。

a保存)

1、将客户端请求命令转化为网络协议格式。

2、将协议内容追加到server.aof_buf中。

3、当达到aof系统设定的条件时,会调用aof_fsync(文件描述符)写入到磁盘

其中第三步才是aof的性能关键,目前redis支持三种状态:

1、AOF_FSYNC_NO:不保存

此模式,每执行一条客户端的命令,都将会把协议字符串追加到serveraof_buf中,但不会写入磁盘。

    写入只发生在:1、redis被正常关闭。2、Aof被关系。3、系统写缓存已满,或后台定时保存操作被执行。

上面三种情况都会阻塞主进程,导致客户端请求失败。

2、.AOF_FSYNC_EVERYSECS:每一秒保存一次

由后台子进程调用写入保存,不会阻塞主进程。如果发生宕机,那么最大丢失数据会在2s以内的数据。这也是默认的设置选项。

3、AOF_FSYNC_ALWAYS:每执行一个命令都保存一次

这种模式下,可以保证每一条客户端指令都被保存,保证数据不会丢失。但缺点就是性能大大下降,因为每一次操作都是独占性的,需要阻塞主进程。

b读取)

AOF保存的是数据协议格式的数据,所以只要将AOF中的数据转换为命令,模拟客户端重新执行一遍,就可以还原所有数据库状态。
读取的过程是:
1.创建模拟的客户端
2.读取AOF保存的文本,还原数据为原命令和原参数。然后使用模拟的客户端发出这个命令请求。
3.继续执行第二步,直到读取完AOF文件。

AOF需要将所有的命令都保存到磁盘,那么这个文件会随着时间变得越来越大。读取也会变得很慢。
Redis提供了AOF的重写机制,帮助减少文件的大小。实现的思路是:

c AOF重写流程:
1.AOF重写完成会向主进程发送一个完成的信号
2.会将AOF重写缓存中的数据全部写入到文件中 
3.用新的AOF文件,覆盖原有的AOF文件。

d AOF优缺点:
1.AOF文件通常会大于相同数据集的RDB文件
2.AOF模式下性能与RDB模式下性能高低,主要取决于AOF选用的fsync模式


之后还会细说redis数据库的实现。。。。。


版权声明:本文为博主原创文章,未经博主允许不得转载。

【redis 基础篇一】redis初识

在JDB来了差不多一个月的时间了,在了解公司业务和框架的过程中,看到了在通过上游调用接口的过程中,使用到了redis来调用值,上游将一个参数传过来,我们通过这个参数去redis中读取部分参数,然后将所...
  • huo065000
  • huo065000
  • 2016年02月28日 18:57
  • 597

java的初识及入门

java的基本特点 最重要的还是 跨平台性 JDK:开发者使用的工具包 JRE:程序运行的环境 JVM:java的虚拟机 三者关系是包含关系(JDK(JRE(JVM)))注意:你编写的代...
  • qq_34936541
  • qq_34936541
  • 2017年11月27日 20:09
  • 183

Redis源码解析(二):redis之服务器-redis.c

我们一次来看这份代码,揭开redis服务器的神秘面纱。     首先是命令映射表: /*命令映射表,参数1:命令,参数2:指向实现此命令的函数,参数3:参数个数,参数4:标志位(具体信息看注释), ...
  • flashflight
  • flashflight
  • 2015年03月24日 00:51
  • 1924

Redis一主两从模式客户端封装

1,redis采用的是1主2从模式,读写分离,服务端版本为3.0。 2,Java客户端使用的是jedis2.5.2 上代码----------------------- 1,封装的配置文...
  • z3pc_ooxx
  • z3pc_ooxx
  • 2016年10月25日 14:01
  • 552

redis源码分析(2)——事件循环

redis源码分析,介绍事件循环的实现
  • chosen0ne
  • chosen0ne
  • 2015年01月14日 21:51
  • 3492

JAVA学习第一课(初识JAVA)

PS:退ACM集训队了,自己也疯玩了两天,后天就开学了,就正式大二了,该收收心好好学习啦                                                        ...
  • u013497151
  • u013497151
  • 2014年08月30日 14:51
  • 2207

初识神经网络(1)

神经网络是由简单处理单元构成的大规模并行分布式处理器,天然的具有存储经验知识和使之可用的特性。神经网络在两个方面与大脑相似: 神经网络是通过学习过程从外界环境中获取知识的;互连神经元的连接强度,即突...
  • universe_ant
  • universe_ant
  • 2016年10月02日 12:33
  • 1427

第一章 初识Java

什么是Java语言 Java是于 1995年 由Sun公司推出的 极富创造力的 面向对象程序设计语言 它由Java之父——Sun研究院院士 詹姆斯·高斯林(James Gosling)博士...
  • zsg6221827
  • zsg6221827
  • 2017年03月07日 12:11
  • 191

Redis初识(一)

首先,学习redis之前要给自己提出几个问题。 1、什么是redis? 2,、redis的使用? 3、redis的原理? 4、redis适合的应用场景? 那么,接下来,先解决第一个问题,什么...
  • u012669062
  • u012669062
  • 2016年08月28日 16:41
  • 669

Redis实现主从复制(Master&Slave)

由于前段时间公司项目比较赶,一直抽不出时间写博客,今天偷空写一篇吧。前面给大家讲解了单机版redis的基本操作,现在继续给大家讲解一下Redis的进阶部分,主从复制和读写分离。 一、Master&S...
  • zhangguanghui002
  • zhangguanghui002
  • 2017年11月13日 21:06
  • 149
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis初识(二)
举报原因:
原因补充:

(最多只允许输入30个字)