• 第一章· Redis入门部署及持久化介绍


    Redis简介

    Redis安装部署

    Redis持久化

    Redis简介

    软件说明:

    Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品。
    Redis采用内存(In-Memory)数据集(DataSet) 。
    支持多种数据类型。
    运行于大多数POSIX系统,如Linux、*BSD、OS X等。
    作者: Salvatore Sanfilippo

    软件特性:

    • 1)透明性:分布式系统对用户来说是透明的,一个分布式系统在用户面前的表现就像一个传统的单处理机分时系统,可让用户不必了解内部结构就可以使用。
    • 2)扩展性:分布式系统的最大特点就是可扩展性,他可以根据需求的增加而扩展,可以通过横向扩展使集群的整体性能得到线性提升,也可以通过纵向扩展单台服务器的性能使服务器集群的性能得到提升。
    • 3)可靠性:分布式系统不允许单点失效的问题存在,它的基本思想是:如果一台服务器坏了,其他服务器接替它的工作,具有持续服务的特性。
    • 4)高性能:高性能是人们设计分布式系统的一个初衷,如果建立了一个透明,灵活,可靠的分布式系统,但他运行起来像蜗牛一样慢,那这个系统就是失败的。

    软件获取和帮助:

    软件功能:

    1)高速读写
    2)数据类型丰富           ---》字符串、哈希表、列表、集合、有序集合
    3)支持持久化              ---》简单说就是写磁盘。它都是放在内存,做消息队列的时候不需要开启持久化。
    4)多种内存分配及回收策略
    5)支持事物                 ---》它把事物放在队列里,回滚就是不执行队列直接取消这个队列。如果是提交呢,它就把这个队列里全都执行一遍。
    6)消息队列、消息订阅
    7)支持高可用
    8)支持分布式分片集群 ----》也就是rediis cluster

    企业缓存数据库解决方案对比:

    Memcached:
    1)优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash多核结构、多线程读写性能高。
    2)缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高

    Redis:
    1)优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高
    2)缺点:多线程读写较Memcached慢

    Tair:
    1)优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集群、支撑了几乎所有淘宝业务的缓存。
    2)缺点:单机情况下,读写性能较其他两种产品较慢

    对比结论:

    1.Memcached:多核的缓存服务,更加适合于多用户并发访问次数(访问次数较少的应用场景)。

    2.Redis:单核缓存服务,在单节点情况下,更加适合少量用户,多次访问的应用场景。

    3.redis一般在企业中,是单机多实例架构

    Redis安装部署 (源码安装)

    步骤:1.下载-->2.解压-->3.移动到指定目录-->4.做软链接-->5.进入到redis目录-->6.编译-->7.添加环境变量+加载环境变量-->8.启动redis-->9.连接redis-->10.退出redis-->11.关闭redis连接

    下载命令:wget http://download.redis.io/releases/redis-3.2.12.tar.gz

    下载过程:

    下载成功:

    解压命令:tar xf redis-3.2.12.tar.gz        这是在当前目录解压

    移动到指定目录:mv redis-3.2.12 /usr/local/

    做软链接:ln -s /usr/local/redis-3.2.12 /usr/local/redis

    进入redis目录:cd /usr/local/redis

    编译:make

    添加环境变量:

    vim /etc/profile.d/redis.sh

    export PATH="/usr/local/redis/src:$PATH"

    加载环境变量:

    source /etc/profile

    启动redis:redis-server &

    它的启动文件在 /usr/local/redis 里面的redis.cong

    连接redis:redis.cli 

    退出redis:quit

    关闭redis连接:redis-cli shutdown 

    redis基本配置

    步骤 

    #创建redis工作目录   为什么要创建/data/6379呢?redis的端口是6379

    mkdir -p /data/6379

    进入配置文件 vim /data/6379/redis.conf  进行编辑。

    daemonize yes   
    port 6379       
    logfile /data/6379/redis.log
    dir /data/6379
    dbfilename dump.rdb 
    最简单的配置文件

    daemonize yes        守护进程模式启动 刚才启动的时候redis-server & 咱们平时起一些服务的时候,如果没有启动脚本的话,启动的时候启动代码就要在后面加个&,让它在后台运行,它就在当前终端,一关掉他这个服务就中断了。它默认的配置文件加上这个终端了。 咱们把它关闭,用自己的配置文件启动。

    port 6379                                 端口

    logfile /data/6379/redis.log         日志文件路径(位置)

    dir /data/6379                           数据目录(持久化数据文件存储位置)

    dbfilename dump.rdb                   RDB持久化数据文件名称     名字可以随便起。  持久化文件会放在 数据目录里面也就是dir就是放这个的地方

    用我们自己配置文件启动后进行连接 redis-cli  进行一些基本操作。

    redis基本操作

    连接redis         redis-cli

    看redis里面都有哪些key   KEY *         这一步数据量大的话不建议操作

    设置键值对      set key value    比如set name zhangrenguo      set age 25  

    取出值      get key   比如 get name  -->zhangrenguo

    看一下redis起的端口: 0.0.0.0:6379    如果有redis客户端的话可以连过来,但是不可以查

    安全配置:

     protected-mode: 禁止protected-mode yes/no (保护模式,是否只允许本地访问)  它默认是yes,只允许本地访问。我们把它改成no,redis是单独装一台,代码想要从外面连,肯定要把保护模式写成no,要不然代码不能走任何操作。

    进入配置文件进行配置,配置好后重新启动。 从新启动后发现,别的redis客户端可以访问也能操作,但是查不到结果。这是因为没有开启持久化,redis一旦重启数据就没了,它数据放在内存,一重启内存清空了。

    bind:指定IP进行监听     不指定的话谁都可以连。可以指定多个,本地也可以连,还可以让绑定的连,绑定哪个ip,就可以同个哪个ip连,或者代码在哪台机器就把它加上。  一般情况下是0.0.0.0   

    #添加到配置文件
    vim /data/6379/redis.conf
    bind 127.0.0.1 10.0.0.8

    绑定ip还不安全给他添加密码

    requirepass: 增加密码     密码是铭文,所以所有的后端都是没有公网ip的。  添加好后输入密码是 AUTH 自己增加的密码    ---?AUTH zrg    但是这样好麻烦,可以在外面输入密码 ---》 redis-cli -a zrg

    #添加到配置文件
    vim /data/6379/redis.conf
    requirepass  zrg

    我这篇博客没有在配置呢设置密码。

    redis在线查看和修改配置

    ONFIG GET *       查看redis配置文件所有配置  可以写具体的某个配置,都是key value 形式展现的。

    CONFIG SET requirepass 123    修改密码配置。  修改配置,即时生效。查看配置文件中是没有改变的,只要redis不重启,密码就是新改的。

    写程序是写一个配置文件,把所有的需要连库的信息都拿出来写成一个配置文件,就成变量了。

    Redis持久化

    什么是持久化?

    持久化:就是将内存中的数据,写入到磁盘上,并且永久存在的。 持久化分两种RDB 和AOF。

    RDB 持久化介绍

    可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。

    RDB持久化优点:

    • 1)RDB是一种表示某个即时点的Redis数据的紧凑文件。RDB文件适合用于备份。例如,你可能想要每小时归档最近24小时的RDB文件,每天保存近30天的RDB快照。这允许你很容易的恢复不同版本的数据集以容灾。
    • 2)RDB非常适合于灾难恢复,作为一个紧凑的单一文件,可以被传输到远程的数据中心。
    • 3)RDB最大化了Redis的性能,因为Redis父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像磁盘IO这样的操作。
    • 4)RDB在重启保存了大数据集的实例时比AOF要快。

    RDB持久化缺点

    • 1)当你需要在Redis停止工作(例如停电)时最小化数据丢失,RDB可能不太好。你可以配置不同的保存点(save point)来保存RDB文件(例如,至少5分钟和对数据集100次写之后,但是你可以有多个保存点)。然而,你通常每隔5分钟或更久创建一个RDB快照,所以一旦Redis因为任何原因没有正确关闭而停止工作,你就得做好最近几分钟数据丢失的准备了。
    • 2)RDB需要经常调用fork()子进程来持久化到磁盘。如果数据集很大的话,fork()比较耗时,结果就是,当数据集非常大并且CPU性能不够强大的话,Redis会停止服务客户端几毫秒甚至一秒。AOF也需要fork(),但是你可以调整多久频率重写日志而不会有损(trade-off)持久性(durability)。

    RDB持久化优缺点总结

    • 优点:速度快,适合于用作备份,主从复制也是基于RDB持久化功能实现的。
    • 缺点:会有数据丢失、导致服务停止几秒

    RDB持久化核心配置参数

    #编辑到配置文件
    vim /data/6379/redis.conf
    #持久化数据文件存储位置
    dir /data/6379
    #rdb持久化数据文件名
    dbfilename dump.rdb
    #900秒(15分钟)内有1个更改
    save 900 1
    #300秒(5分钟)内有10个更改
    save 300 10
    #60秒(1分钟)内有10000个更改
    save 60 10000

    AOF持久化介绍

    AOF(append only file)只追加文件,记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。

    AOF持久化优点:

    • 1)使用AOF Redis会更具有可持久性(durable):你可以有很多不同的fsync策略:没有fsync,每秒fsync,每次请求时fsync。使用默认的每秒fsync策略,写性能也仍然很不错(fsync是由后台线程完成的,主线程继续努力地执行写请求),即便你也就仅仅只损失一秒钟的写数据。
    • 2)AOF日志是一个追加文件,所以不需要定位,在断电时也没有损坏问题。即使由于某种原因文件末尾是一个写到一半的命令(磁盘满或者其他原因),redis-check-aof工具也可以很轻易的修复。
    • 3)当AOF文件变得很大时,Redis会自动在后台进行重写。重写是绝对安全的,因为Redis继续往旧的文件中追加,使用创建当前数据集所需的最小操作集合来创建一个全新的文件,一旦第二个文件创建完毕,Redis就会切换这两个文件,并开始往新文件追加。
    • 4)AOF文件里面包含一个接一个的操作,以易于理解和解析的格式存储。你也可以轻易的导出一个AOF文件。例如,即使你不小心错误地使用FLUSHALL命令清空一切,如果此时并没有执行重写,你仍然可以保存你的数据集,你只要停止服务器,删除最后一条命令,然后重启Redis就可以。

    AOF持久化缺点:

    • 1)对同样的数据集,AOF文件通常要大于等价的RDB文件。
    • 2)AOF可能比RDB慢,这取决于准确的fsync策略。通常fsync设置为每秒一次的话性能仍然很高,如果关闭fsync,即使在很高的负载下也和RDB一样的快。不过,即使在很大的写负载情况下,RDB还是能提供能好的最大延迟保证。
    • 3)在过去,我们经历了一些针对特殊命令(例如,像BRPOPLPUSH这样的阻塞命令)的罕见bug,导致在数据加载时无法恢复到保存时的样子。这些bug很罕见,我们也在测试套件中进行了测试,自动随机创造复杂的数据集,然后加载它们以检查一切是否正常,但是,这类bug几乎不可能出现在RDB持久化中。为了说得更清楚一点:Redis AOF是通过递增地更新一个已经存在的状态,像MySQL或者MongoDB一样,而RDB快照是一次又一次地从头开始创造一切,概念上更健壮。但是,1)要注意Redis每次重写AOF时都是以当前数据集中的真实数据从头开始,相对于一直追加的AOF文件(或者一次重写读取老的AOF文件而不是读内存中的数据)对bug的免疫力更强。2)我们还没有收到一份用户在真实世界中检测到崩溃的报告。

    AOF持久化优缺点总结

    • 优点:可以最大程度保证数据不丢失
    • 缺点:日志记录量级比较大

    AOF持久化核心配置参数

    #修改配置文件
    vim /data/6379/redis.conf
    #是否打开AOF日志功能
    appendonly yes/no
    
    #每一条命令都立即同步到AOF
    appendfsync always
    #每秒写一次
    appendfsync everysec
    #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到AOF
    appendfsync no

    RDB 和 AOF  我们应该选择哪一种?

    1)一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。

    2)如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。

    3)有很多用户单独使用AOF,但是我们并不鼓励这样,因为时常进行RDB快照非常方便于数据库备份,启动速度也较之快,还避免了AOF引擎的bug。

    4)个人感触:在企业中,通常都使用RDB来做持久化,因为一般redis是在做MySQL的缓存,就算缓存数据丢失,真实的数据还是在MySQL中,之所以用缓存是为了速度,性能而考虑,所以还是建议使用RDB持久化,相对来说会好一些,除非专门用redis来做一个key:value的数据库,而且数据很重要,那么可以考虑使用AOF

    注意:基于这些原因,将来我们可能会统一AOF和RDB为一种单一的持久化模型(长远计划)。

    RDB快照的工作方式

    1)默认情况下,Redis保存数据集快照到磁盘,名为dump.rdb的二进制文件。你可以设置让Redis在N秒内至少有M次数据集改动时保存数据集,或者你也可以手动调用SAVE或者BGSAVE命令。

    2)在上文中我们已经在配置文件中做过对应的配置:
    例如,这个配置会让Redis在每个60秒内至少有10000次键改动时自动转储数据集到磁盘:
    save 60 10000

    3)当 Redis 需要保存 dump.rdb 文件时,服务器执行以下操作:

    • Redis 调用 fork() ,同时拥有父进程和子进程。
    • 子进程将数据集写入到一个临时的 RDB 文件中。当子进程完成对新 RDB 文件的写入时, Redis 用新RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

    4)这种方式使得 Redis 可以从写时复制机制中获益。

    Redis备份数据

    1)Redis 对于数据备份是非常友好的,因为你可以在服务器运行的时候对 RDB 文件进行复制: RDB 文件一旦被创建,就不会进行任何修改。

    2)当服务器要创建一个新的 RDB 文件时,它先将文件的内容保存在一个临时文件里面,当临时文件写入完毕时,程序才使用临时文件替换原来的 RDB 文件。

    3)这也就是说,无论何时, 复制 RDB 文件都是绝对安全的。

    以下是我们的建议:
    1)创建一个定期任务(cron job), 每小时将一个 RDB 文件备份到一个文件夹, 并且每天将一个 RDB 文件备份到另一个文件夹。

    2)确保快照的备份都带有相应的日期和时间信息, 每次执行定期任务脚本时, 使用 find 命令来删除过期的快照: 比如说, 你可以保留最近 48 小时内的每小时快照, 还可以保留最近一两个月的每日快照。

    3)至少每天一次, 将 RDB 备份到你的数据中心之外, 或者至少是备份到你运行 Redis 服务器的物理机器之外。

    AOF重写功能介绍

    1)因为 AOF 的运作方式是不断地将命令追加到文件的末尾,所以随着写入命令的不断增加, AOF 文件的体积也变得越来越大。举个例子,如果你对一个计数器调用了 100 次 INCR ,那么仅仅是为了保存这个计数器的当前值, AOF 文件就需要使用 100 条记录。然而在实际上,只使用一条 SET 命令已经足以保存计数器的当前值了,其余 99 条记录实际上都是多余的。

    2)为了处理这种情况, Redis 支持一种有趣的特性:可以在不断服务客户端的情况下,对 AOF 文件进行重建。执行 BGREWRITEAOF 命令, Redis 将生产一个新的 AOF 文件,这个文件包含重建当前数据集所需的最少命令。

    AOF有多持久?

    你可以配置 Redis 多久才将数据 fsync 到磁盘一次。
    有三个选项:

    • 每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全。
    • 每秒 fsync 一次:足够快(和使用 RDB 持久化差不多,)并且在故障时只会丢失1秒钟的数据。
    • 从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择。

    推荐(并且也是默认)的措施为每秒 fsync 一次,这种 fsync 策略可以兼顾速度和安全性。

    总是 fsync 的策略在实际使用中非常慢,即使在 Redis2.0 对相关的程序进行了改进之后仍是如此。频繁调用 fsync 注定了这种策略不可能快得起来。

    如果 AOF 文件出错了,怎么办?

    服务器可能在程序正在对AOF文件进行写入时停机,如果停机造成了AOF文件出错,那么 Redis 在重启时会拒绝载入这个 AOF 文件,从而确保数据的一致性不会被破坏。

    当发生 AOF 文件出错时,可以用以下方法来修复出错的 AOF 文件:

    • 1、为现有的 AOF 文件创建一个备份。
    • 2、使用 Redis 附带的 redis-check-aof 程序,对原来的AOF 文件进行修复。redis-check-aof --fix
    • 3、使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不同之处。
    • 4、重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复。
  • 相关阅读:
    MySQL 5.7 Invalid default value for 'CREATE_TIME'报错的解决方法
    浅析mysql中exists 与 in 的使用
    mysql 索引原理
    内存溢出与内存泄漏
    java 内部类详解
    JAVA中重写equals()方法的同时要重写hashcode()方法
    Java中volatile关键字解析
    JDK1.8 HashMap源码分析
    mysql 行转列 列转行
    Java多线程(十)——线程优先级和守护线程
  • 原文地址:https://www.cnblogs.com/zhangrenguo/p/10735602.html
走看看 - 开发者的网上家园