redis的使用大家都很熟悉,可能除了watch 锁,pipeline,订阅发布用的少点,不过网上也有大量的教材和例子,这里想聊聊redis中的一些原理。
 
1.redis 提供了两种持久化方式,一种是RDB,一种是AOF;
RDB 是指在制定的时间间隔生成数据集的快照,
AOF持久化记录服务器执行的所有写命令,并在服务器重启时,重新执行这些命令来恢复数据
 
2.redis 启动过程
-(1)初始化服务器变量,设置服务器默认配置
-(2)读取配置文件的配置,覆盖默认配置
-(3)初始化服务器功能模块
-(4)从RDB或者AOF中重载数据
-(5)网络监听前的准备工作
-(6)开启事件监听,循环接受客户端请求
 

3.redis持久化方案分析
(1)RDB持久化
将内存中的数据快照保持到磁盘中,redis重启的时候重新载入RDB文件来还原数据库。
a)RDB 保存
 如果已经存在RDB文件,会用新文件替换旧文件, 在保存RDB的过程中,redis主进程阻塞,无法响应客户端请求。
为了避免阻塞主线程,redis提供了rdbSaveBackground函数,新建子进程调用RDB save,完成RDB保存后再发生消息通知主进程。在此期间主进程可以继续处理新的客户端请求。
b)RDB读取
redis启动的时候会根据配置的持久化模式,决定是否读取RDB文件,并将其保存到内存中。
在此过程中,每载入1000个key,就处理一次已经等待处理的客户端请求,不过目前只能处理订阅功能的命令, 其他一律返回错误信息。因为发布订阅功能不需要写入数据,不需要保存在redis数据库中
 
缺点:
1.保存频率过低,宕机时会导致数据丢失
2.保存频率过高,可能由于数据集过大导致操作耗时,短时间无法处理客户端请求
 
(2)AOF持久化
将所有的写命令记录下来,达到记录数据库状态的目的
a)保存
(1)将客户端请求的命令转化为网络协议格式
(2)将协议内容字符串追加到变量server.aof_buf 中
(3)当AOF系统达到设定的条件时,会调用aof_fsync将数据写入磁盘
           这里的设定的条件,就是AOF性能的关键,其主要有3种类型
          1.AOF_FSYNC_NO:不保存
               该过程中命令只会追加到server.aof_buf中,但是不会执行写入磁盘,当redis被正常关闭,AOF功能关闭,或者buf 缓存写满了,或者定时保存操作执行,这3种情况下都会阻塞主进程,导致客户端请求失败。
          2.AOF_FSYNC_EVERYSECS 每秒保存一次
               后台子进程调用写入保存,不会阻塞主进程,发送宕机最大丢失数据2s内
          3.AOF_FSYNC_ALWAYS 没执行一个命令保存一次
               保证每条命令都保存,数据不丢失,但是会影响性能,因为每一次操作都会阻塞主进程
 
 
AOF提供了重写机制,可以减少命令
 
4.redis rehash
redis 的rehash机制和php的rehash机制不相同;
php使用阻塞型rehash,在此期间不能对hash 表做任何操作,而redis不能,redis操作频繁,对性能要求高。
 
redis 采用渐进式rehash方式
redis中会保存两个hash数组,正常的操作只会针对h[0],h[1]做rehash之用;
在rehash过程中,所有的写都切换到h[1],读操作先针对h[0],都去不到再去都去h[1],
 

redis原理分析的更多相关文章

  1. redis(3)--redis原理分析

    过期时间设置 在Redis中提供了Expire命令设置一个键的过期时间,到期以后Redis会自动删除它.这个在我们实际使用过程中用得非常多.EXPIRE命令的使用方法为EXPIRE key secon ...

  2. Redis事务原理分析

    Redis事务原理分析 基本应用 在Redis的事务里面,采用的是乐观锁,主要是为了提高性能,减少客户端的等待.由几个命令构成:WATCH, UNWATCH, MULTI, EXEC, DISCARD ...

  3. 一、Redis事务原理分析

    一.Redis事务原理分析 在Redis的事务里面,采用的是乐观锁,主要是为了提高性能,减少客户端的等待.由几个命令构成:WATCH, UNWATCH, MULTI, EXEC, DISCARD.通过 ...

  4. Redis有序集内部实现原理分析(二)

    Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read 本篇博文紧随上篇Redis有序集内部实现原理分析,在这篇博文 ...

  5. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

  6. MyBatis:二级缓存原理分析

    MyBatis从入门到放弃七:二级缓存原理分析 前言 说起mybatis的一级缓存和二级缓存我特意问了几个身边的朋友他们平时会不会用,结果没有一个人平时业务场景中用. 好吧,那我暂且用来学习源码吧.一 ...

  7. HashMap 与 ConcrrentHashMap 使用以及源码原理分析

    前奏一:HashMap面试中常见问题汇总 HashMap的工作原理是近年来常见的Java面试题,几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和Has ...

  8. Shiro框架 (原理分析与简单实现)

    Shiro框架(原理分析与简单实现) 有兴趣的同学也可以阅读我之前分享的:Java权限管理(授权与认证)CRM权限管理   (PS : 这篇博客里面的实现方式没有使用框架,完全是手写的授权与认证,可以 ...

  9. Redis原理详解

    Redis原理详解 数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redi ...

随机推荐

  1. log4cplus 在配置文件中设置文件路径,程序自动创建目录,且在日志文件前按日期创建相应的目录

    #include <string> #include <cstdio> #include <log4cplus/logger.h> #include <log ...

  2. java byte&0xFF

    做串口端口通讯时,数据都是以byte类型发送的 普通的byte范围是-128-127,而java的byte范围是0-255 因此将数据的byte转成java的byte时,需要与0xff(1111111 ...

  3. 第二周:Java For循环方法简介

    1.for循环的作用 Java当中循环的意思就是让Java程序重复地执行某些语句.在程序设计时,常常需要处理大量的重复动作, 采用循环结构可以降低程序书写的长度和复杂度可使复杂问题简单化,提高程序的可 ...

  4. NPOI Excel 单元格背景颜色对照表

    NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...

  5. Eclipse点击工程结构里任意文件或文件夹变拖动(或复制)的bug

    本文为原创文章,欢迎转载,但请注明出处http://www.cnblogs.com/yexiubiao/p/5204601.html,未在文章页面明显位置给出原文连接的,将保留追究法律责任的权利. 在 ...

  6. selenium2 Webdriver + Java 自动化测试实战和完全教程

    selenium2 Webdriver + Java 自动化测试实战和完全教程一.快速开始 博客分类: Selenium-webdriverselenium webdriver 学习selenium ...

  7. C语言获得文件一行

    C语言获得一行的数据还是比较麻烦的,这里讲一下几种曾经用过的方法. 第一种,是最笨的方法,就是一个一个字符的读取,也是最容易想到的方法.具体实现如下:void   read_line(char   l ...

  8. 可分组的选择框控件(MVVM下)(Toggle样式 仿造单选框RadioButton,复选框CheckBox功能)

    原地址: http://www.cnblogs.com/yk250/p/5660340.html 效果图如下:支持分组的单选框,复选框样式和MVVM下功能的实现.这是项目中一个快捷键功能的扩展. 1, ...

  9. javascript的地基

    有了良好的基础,才能在其上创造有价值的东西. 回顾一下以往自己javascript应用的开发经历,似乎很少去思考和总结js的运行机制.现在我就来整理整理 1. 以<编译原理>的一段话开头: ...

  10. qt之mapx组件编程c2248和c2512错误

    mapx组件利用qt工具dumpcpp到处头文件和.cpp文件后将其加入到新建的qt项目中即可. 不过本人遇到问题知道今天偶然的解决了.记下来,以免忘记. demo的项目结构如下: 然后在.pro文件 ...