Redis学习---大数据技术之Redis(NoSQL简介、Redis简介、Redis安装、五大数据类型、相关配置、持久化)

星光下的赶路人star的个人主页

毅力是永久的享受

文章目录

  • 1、NoSQL
    • [1.1 NoSQL数据库](#1.1 NoSQL数据库)
      • [1.1.1 NoSQL是什么](#1.1.1 NoSQL是什么)
      • [1.1.2 NoSQL的特点](#1.1.2 NoSQL的特点)
      • [1.1.3 NoSQL的适用场景](#1.1.3 NoSQL的适用场景)
      • [1.1.4 NoSQL的不适场景](#1.1.4 NoSQL的不适场景)
    • [1.2 NoSQL家族](#1.2 NoSQL家族)
  • 2、Redis简介
    • [2.1 Redis官网](#2.1 Redis官网)
    • [2.2 Redis是什么](#2.2 Redis是什么)
    • [2.3 Redis的应用场景](#2.3 Redis的应用场景)
      • [2.3.1 配合关系型数据库做高速缓存](#2.3.1 配合关系型数据库做高速缓存)
      • [2.3.2 大数据场景](#2.3.2 大数据场景)
      • [2.3.3 利用其多样的数据结构储存特定的数据](#2.3.3 利用其多样的数据结构储存特定的数据)
  • 3、Redis安装
    • [3.1 关于Redis版本](#3.1 关于Redis版本)
    • [3.2 安装](#3.2 安装)
    • [3.3 查看安装目录/home/zhm/bin](#3.3 查看安装目录/home/zhm/bin)
    • [3.4 Redis的启动](#3.4 Redis的启动)
    • [3.5 客户端访问](#3.5 客户端访问)
    • [3.6 关闭Redis服务](#3.6 关闭Redis服务)
      • [3.7 Redis默认16个库](#3.7 Redis默认16个库)
  • 4、Redis的五大数据类型
    • [4.1 帮助手册](#4.1 帮助手册)
    • [4.2 Redis键(key)](#4.2 Redis键(key))
    • [4.3 String](#4.3 String)
      • [4.3.1 特点](#4.3.1 特点)
      • [4.3.2 常用操作](#4.3.2 常用操作)
    • [4.4 List](#4.4 List)
      • [4.4.1 特点](#4.4.1 特点)
      • [4.4.2 常用操作](#4.4.2 常用操作)
    • [4.5 set](#4.5 set)
      • [4.5 1 特点](#4.5 1 特点)
      • [4.5.2 常用操作](#4.5.2 常用操作)
    • [4.6 Hash](#4.6 Hash)
      • [4.6.1 特点](#4.6.1 特点)
      • [4.6.2 分析一个问题: 现有一个User 对象,在Redis中如何存?](#4.6.2 分析一个问题: 现有一个User 对象,在Redis中如何存?)
      • [4.6.3 常用操作](#4.6.3 常用操作)
    • [4.7 zset](#4.7 zset)
      • [4.7.1 特点](#4.7.1 特点)
      • [4.7.2 常用操作](#4.7.2 常用操作)
  • 5、Redis的相关配置
  • 6、Jedis
    • [6.1 环境准备](#6.1 环境准备)
    • [6.2 基本测试](#6.2 基本测试)
  • 7、Redis持久化
    • [7.1 两种方式](#7.1 两种方式)
    • [7.2 RDB(Redis DataBase)](#7.2 RDB(Redis DataBase))
      • [7.2.1 RDB是什么](#7.2.1 RDB是什么)
      • [7.2.2 如何执行持久化](#7.2.2 如何执行持久化)
      • [7.2.3 RDB文件](#7.2.3 RDB文件)
      • [7.2.4 RDB保存策略](#7.2.4 RDB保存策略)
      • [7.2.5 手动保存](#7.2.5 手动保存)
      • [7.2.6 RDB备份恢复](#7.2.6 RDB备份恢复)
      • [7.2.7 RDB其他配置](#7.2.7 RDB其他配置)
      • [7.2.8 RDB优缺点](#7.2.8 RDB优缺点)
    • [7.3 AOF(Append Only File)](#7.3 AOF(Append Only File))
      • [7.3.1 AOF是什么](#7.3.1 AOF是什么)
      • [7.3.2 开启AOF](#7.3.2 开启AOF)
      • [7.3.3 AOF同步频率](#7.3.3 AOF同步频率)
      • [7.3.4 AOF文件损坏恢复](#7.3.4 AOF文件损坏恢复)
      • [7.3.5 AOF备份](#7.3.5 AOF备份)
      • [7.3.6 Rewrite](#7.3.6 Rewrite)
      • [7.3.7 AOF的优缺点](#7.3.7 AOF的优缺点)
    • [7.4 持久化的优先级](#7.4 持久化的优先级)
    • [7.5 RDB和AOF用哪个号](#7.5 RDB和AOF用哪个号)

1、NoSQL

1.1 NoSQL数据库

1.1.1 NoSQL是什么

1、NoSQL(Not Only SQL),意思是"不仅仅是SQL",泛指非关系型的数据库。

2、NoSQL不拘泥于关系型数据库的设计范式,放弃了通用的技术标准,为某一领域特定场景而设计,从而使性能、容量、扩展性达到了一定程度的突破。

1.1.2 NoSQL的特点

1、不遵循SQL标准

2、不支持ACID

3、远超于SQL的性能

1.1.3 NoSQL的适用场景

1、对数据高并发的读写

2、海量数据的读写

3、对数据高可扩展的

1.1.4 NoSQL的不适场景

1、需要事务支持

2、基于sql的结构化查询储存,处理复杂的关系,需要即时查询

3、用不着sql的和·用了sql也不行的情况,清考虑用NoSQL。

1.2 NoSQL家族

1、Memcached

(1)很早出现的NoSQL数据库

(2)数据都在内存中,一般不持久化

(3)支持简单的key-value模式,数据类型支持单一

(4)一般是作为缓存数据库辅助持久化的数据库

2、Redis

(1)几乎覆盖了Memcached的绝大部分功能

(2)数据都在内存中,支持持久化,主要用作备份恢复

(3)支持丰富的数据类型(value,因为所有key都是String类型),例如string,list,set,zset,hash等

3、mongoDB

(1)高性能、开源、模式自由的文档型数据库

(2)数据都在内存中,如果内存不足,把不常用的数据保存到硬盘

(3)虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能

(4)支持二进制数据及大型对象

(5)可以根据数据的特点替代RDBMS(关系数据库管理系统),成为独立的数据库。或者配合RDBMS,存储特定的数据

4、HBase

(1)HBase是Haddop项目的数据库,主要用于对大量数据进行随机、实时的读写操作。

(2)HBase能支持到数十亿行×百万列的数据表

5、Cassandra

(1)Cassandra用于管理由大量商用服务器构建起来的庞大集群上的海量数据集(PB级)

6、Neo4j

(1)Neo4j是基于图结构的数据库,一般用于构建社交网络、交通网络、地图等

2、Redis简介

2.1 Redis官网

1、Redis官方网站 http://Redis.io

2、Redis中文官方网站 http://www.Redis.net.cn

2.2 Redis是什么

1、Redis是一个开源的key-value储存系统。

2、它支持储存的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set)和hash(哈希类型)

3、Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件

4、支持高可用和集群模式

2.3 Redis的应用场景

2.3.1 配合关系型数据库做高速缓存

1、高频次,热门访问的数据,降低数据库IO

2、经典的Cache Aside Pattern(旁路缓存模式)

2.3.2 大数据场景

1、缓存数据

(1)需要高频次访问

(2)持久化数据访问较慢

2、临时数据

(1)高频次

(2)读写时效高

(3)总数据量不大

(4)临时性

(5)用key查询

3、计算结果

(1)高频次写入

(2)高频次查询

(3)总数据量不大

2.3.3 利用其多样的数据结构储存特定的数据

(1)最新N个数据--->通过List实现按自然事件排序的数据

(2)排行榜,TopN--->利用zset(有序集合)

(3)时效性的数据,比如手机验证码--->Expire过期

(4)计数器,秒杀--->原子性,自增方法INCR、DECR

(5)去除大量数据中的重复数据--->利用set集合

(6)构建队列--->利用list集合

(7)发布订阅消息系统--->pub/sub模式

3、Redis安装

3.1 关于Redis版本

不用考虑在Windows环境下对Redis的支持,Redis官方没有提供对Windows环境的支持,是微软的开源小组开发了对Redis对Windows的支持。

3.2 安装

1、安装新版gcc编译器

bash 复制代码
 sudo yum -y install gcc-c++ 

2、上传redis-6.2.1.tar.gz安装包到/opt/software目录下

3、解压redis-6.2.1.tar.gz到/opt/module目录下

4、之后进入安装包的src目录,编辑Makefile文件,修改软件安装路径如下:

bash 复制代码
#修改如下
PREFIX?=/home/zhm

#然后执行如下命令
 make && make install

3.3 查看安装目录/home/zhm/bin

(1)Redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何(服务启动起来后执行)

(2)Redis-check-aof:修复有问题的AOF文件

(3)Redis-check-dump:修复有问题的RDB文件

(4)Redis-sentinel:启动Redis哨兵服务

(5)redis-server:Redis服务器启动命令

(6)redis-cli:客户端,操作入口

3.4 Redis的启动

1、拷贝一份redis.conf配置文件到工作目录

bash 复制代码
 mkdir myredis
 cd myredis
 cp /opt/module/redis-6.2.1/redis.conf .

2、绑定主机IP,修改bind属性

bash 复制代码
 vim redis.conf

 bind 0.0.0.0

3、指定配置文件进行启动

bash 复制代码
redis-server redis.conf

3.5 客户端访问

1、使用redis-cli 命令访问启动好的Redis,默认端口为6379

bash 复制代码
redis-cli 

2、如果有多个Redis客户端同时启动,或者端口做了修改,则需要指定端口号访问

bash 复制代码
redis-cli -p 6379

3、如果访问非本机的Redis,需要指定host来访问

bash 复制代码
redis-cli -h 127.0.0.1 -p 6379

4、通过ping命令测试验证

bash 复制代码
127.0.0.1:6379> ping
PONG

3.6 关闭Redis服务

如果还未通过客户端访问,可直接redis-cli shutdown

bash 复制代码
redis-cli shutdown

如果已经进入客户端,直接shutdown即可

bash 复制代码
127.0.0.1:6379> shutdown

3.7 Redis默认16个库

1、Redis默认创建16个库,每个库对应一个下标,从0开始。

通过客户端连接默认进入到0号库,推荐只使用0号库

2、使用命令select库的下标来切换数据库

bash 复制代码
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>

4、Redis的五大数据类型

4.1 帮助手册

http://redisdoc.com/

4.2 Redis键(key)

1、查看当前库的所有键

bash 复制代码
127.0.0.1:6379> keys *

2、判断某个键是否存在

bash 复制代码
127.0.0.1:6379> exists <key>

3、查看键对应的value的类型

bash 复制代码
127.0.0.1:6379> type <key>

4、删除某个键

bash 复制代码
127.0.0.1:6379> del <key>

5、设置过期时间

bash 复制代码
expire <key> <second>

6、查看过期时间,-1表示永不过期,-2表示已过期

bash 复制代码
ttl <key>

7、查看当前库中key的数量

bash 复制代码
dbsize

8、清空当前库

bash 复制代码
flushdb

9、清空所以库

bash 复制代码
flushall

4.3 String

4.3.1 特点

1、String是Redis最基本的类型,适合保存单值类型,即一个key对应一个value。

2、String类型是二进制安全的,意味着Redis的String可以包含任何数据。比如jpg图片或者序列化得对象。

3、一个Redis中字符串value最多可以是512M。

4.3.2 常用操作

1、添加键值对

bash 复制代码
set <key> <value>

2、获取键的值

bash 复制代码
get <key>

3、将给定的追加到原值的末尾

bash 复制代码
append <key> <value>

4、获取值的长度

bash 复制代码
strlen <key>

5、当key不存在时设置key的值

bash 复制代码
setnx <key> <value>

6、将key中储存的数据值增1

bash 复制代码
incr <key>

7、将key中储存的数字值减一

bash 复制代码
decr <key>

8、将key中储存的数字值安装指定步长增长

bash 复制代码
incrby <key> <步长>

9、将key中储存的数字值按照指定步长减

bash 复制代码
decrby <key> <步长>

10、同时添加一个或者多个key

bash 复制代码
mset <k1> <v1> <k2> <v2>

11、同时获取一个或者多个key的值

bash 复制代码
mget <k1> <k2> <k3>

12、同时添加一个或者多个key,当且仅当所有给定的key都不存在

bash 复制代码
msetnx <k1> <v1> <k2> <v2>

13、获取值的子串

bash 复制代码
getrange <key>  <start> <end>

14、从指定的开始位置覆盖旧值

bash 复制代码
setrange <key> <start> <value>

15、同时设置值和过期时间

bash 复制代码
setex <key> <seconds> <value>

16、设置新值的同时获取旧值

bash 复制代码
getset <key> <value>

4.4 List

4.4.1 特点

1、单键多值

2、Redis List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

3、它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

4.4.2 常用操作

1、从左边插入一个或多值

bash 复制代码
lpush <key> <element...>

2、从右边插入一个或多个值

bash 复制代码
rpush <key> <element...>

3、从左边删除一个值(值在健在,值光键亡)

bash 复制代码
lpop <key>

4、从右边删除一个值

bash 复制代码
rpop <key>

5、从key1列表右边删除一个值,插入到key2列表左边

bash 复制代码
rpoplpush <key1> <key2>

6、按照索引下标范围获取元素(从左到右)

bash 复制代码
lrange <key> <start> <stop>

7、按照索引下标获取元素(从左到右)

bash 复制代码
lindex <key> <index>

8、获取列表长度

bash 复制代码
llen <key>

9、在指定 的前面或者后面插入

bash 复制代码
llinsert <key> before|after <pivot> <element>

10、从左边删除count个指定的value

bash 复制代码
lrem <key> <count> <element>

4.5 set

4.5 1 特点

1、set中的元素是无序不重复的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口。

2、Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。

4.5.2 常用操作

1、将一个或者多个member元素加入到集合中,已经存在的member将被忽略

bash 复制代码
sadd <key> <member...>

2、取出集合的所有值

bash 复制代码
smemebers  <key>

3、判断集合是否包含指定的member,包含返回1,不包含返回0

bash 复制代码
sismember <key> <member>

4、返回集合的元素个数

bash 复制代码
scard <key>

5、从集合中删除指定的元素

bash 复制代码
srem <key> <member...>

6、随机从集合中删除一个值,会从集合中删除值

bash 复制代码
spop <key>

7、随机从集合中取出n个值,不会从集合中删除

bash 复制代码
srandmember <key> <count>

8、返回多个集合的交集元素

bash 复制代码
sinter <key...>

9、返回多个集合的并集元素

bash 复制代码
sunion <key...> 

10、返回多个集合的差集元素

bash 复制代码
sdiff <key...> 

4.6 Hash

4.6.1 特点

1、Redis hash是一个键值对集合

2、Redis hash的值是由多个field和value组成的映射表

3、类似Java里面的Map<String,String>

4.6.2 分析一个问题: 现有一个User 对象,在Redis中如何存?

1、第一种方案: 用户ID为key ,VALUE为JavaBean序列化后的字符串

2、第二种方案: 用户ID+属性名作为key, 属性值作为Value.

3、第三种方案: 通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题

4.6.3 常用操作

1、给集合中添加指定的 -

bash 复制代码
hset <key>  [<field> <value> ...]

2、给集合中添加指定的 - ,当指定的field不存在时

bash 复制代码
 hsetnx <key> <field> <value>

3、取出集合中指定field的value

bash 复制代码
hget <key> <field> 

4、判断集合中是否存在指定的field

bash 复制代码
hexists <key> <field> 

5、列出集合中所有的field

bash 复制代码
hkeys <key> 

6、列出集合中所有的value

bash 复制代码
hvals <key> 

7、给集合中指定filed的value值增加increment

bash 复制代码
 hincrby  <key> <field> <increment> 

4.7 zset

4.7.1 特点

1、Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。

2、因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

4.7.2 常用操作

1、往集合中添加指定的 member 及score

bash 复制代码
zadd <key> [<score> <member> ... ]

2、从集合中取出指定下标范围的数据,正序取

bash 复制代码
zrange <key> <start> <stop> [WITHSCORES] 

3、从集合中取出指定下标范围的数据,倒序取

bash 复制代码
 zrevrange <key> <start> <stop> [WITHSCORES] 

4、从集合中取出指定score范围的数据,默认从小到大

bash 复制代码
 zrangebyscore <key> <min> <max> [WITHSCORES]

5、从集合中取出指定score范围的数据,从大到小

bash 复制代码
zrevrangebyscore  <key>  <max> <min> [WITHSCORES]

6、给集合中指定member的score增加increment

bash 复制代码
zincrby <key> <increment> <member>

7、删除集合中指定的member

bash 复制代码
zrem <key> <member...>

8、统计指定score范围的元素个数

bash 复制代码
 zcount <key> <min> <max>

9、返回集合中指定member的排名,排名从0开始

bash 复制代码
zrank   <key>  <member>

5、Redis的相关配置

1、计量单位说明,大小写不敏感

bash 复制代码
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.

2、bind

默认情况bind=127.0.0.1只能接受本机的访问请求

不写的情况下,无限制接受任何ip地址的访问,产环境肯定要写你应用服务器的地址

如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的请求

bash 复制代码
#bind 127.0.0.1
protected-mode no

3、port服务端口号

bash 复制代码
port 6379

4、damonize

是否为后台进程

bash 复制代码
port 6379

5、pidfile

存放pid文件的位置,每个实例会产生一个不同的pid文件

bash 复制代码
pidfile /var/run/redis_6379.pid

6、log file

日志文件存储位置

bash 复制代码
logfile ""

7、Database

设定库的数量默认16

bash 复制代码
databases 16

8、requirepass

设置密码

bash 复制代码
requirepass 123456

127.0.0.1:6379> set k1 v1
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth "123456"
OK
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1 
"v1"

9、maxmemory

设置Redis可以使用的内存量。一 旦到达内存使用上限,Redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。如果Redis无法根据移除规则来移除内存中的数据,或者设置了"不允许移除",

那么Redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。

bash 复制代码
# maxmemory <bytes>

10、maxmemory-policy

移除策略

bash 复制代码
# maxmemory-policy noeviction 

#volatile-lru:使用LRU算法移除key,只对设置了过期时间的键
#allkeys-lru:使用LRU算法移除key
#volatile-lfu :使用LFU策略移除key,只对设置了过期时间的键.
#allkeys-lfu  :使用LFU策略移除key
#volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
#allkeys-random:移除随机的key
#volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
#noeviction:不进行移除。针对写操作,只是返回错误信息

11、Maxmemory-samples

设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小。一般设置3到7的数字,数值越小样本越不准确,但是性能消耗也越小。

bash 复制代码
# maxmemory-samples 5

6、Jedis

Jedis是Redis的Java客户端,可以通过Java代码的方式操作Redis

6.1 环境准备

1、添加依赖

xml 复制代码
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
</dependency>

6.2 基本测试

1、测试连通

java 复制代码
public class JedisTest {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("hadoop102",6379);
        String ping = jedis.ping();
        System.out.println(ping);
    }
}

2、连接池

连接池主要用来节省每次连接redis服务带来的连接消耗,将连接好的实例反复利用

java 复制代码
public static JedisPool pool =  null ;

public static Jedis getJedis(){
    if(pool == null ){
        //主要配置
        JedisPoolConfig jedisPoolConfig =new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(10); //最大可用连接数
        jedisPoolConfig.setMaxIdle(5); //最大闲置连接数
        jedisPoolConfig.setMinIdle(5); //最小闲置连接数
        jedisPoolConfig.setBlockWhenExhausted(true); //连接耗尽是否等待
        jedisPoolConfig.setMaxWaitMillis(2000); //等待时间
        jedisPoolConfig.setTestOnBorrow(true); //取连接的时候进行一下测试 ping pong
        pool = new JedisPool(jedisPoolConfig,"hadoop102",6379) ;
    }

    return pool.getResource();
}   
 public static void main(String[] args) {
        //Jedis jedis = new Jedis("hadoop202",6379);
        Jedis jedis = getJedis();
        String ping = jedis.ping();
        System.out.println(ping);
 }

7、Redis持久化

7.1 两种方式

Redis提供了两个不同形式的持久化方式RDB和AOF。

RDB为快照备份,会在备份时将内容中的所有数据持久化到磁盘的一个文件中。

AOF为日志备份,会将所有写操作命令记录在一个日志文件中。

7.2 RDB(Redis DataBase)

7.2.1 RDB是什么

在指定的时间间隔将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,

它恢复时是将快照文件直接读到内存里。

7.2.2 如何执行持久化

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行然后IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化的数据可能丢失。

7.2.3 RDB文件

1、RDB保存的文件

在redis.conf中配置文件名称,默认为dump.rdb

2、RDB文件的保存路径

默认为Redis启动时命令行所在的目录下,也可以修改

7.2.4 RDB保存策略

bash 复制代码
#   save <seconds> <changes>

#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
#   Note: you can disable saving completely by commenting out all "save" lines.
save 900 1
save 300 10
save 60 10000

7.2.5 手动保存

1、save: 只管保存,其它不管,全部阻塞

2、bgsave:按照保存策略自动保存

3、shutdown时服务会立刻执行备份后再关闭

4、flushall时会将清空后的数据备份

7.2.6 RDB备份恢复

1、备份

将dump.rdb文件拷贝到要备份的位置

2、恢复

关闭Redis,把备份的文件拷贝到工作目录下,启动redis,备份数据会直接加载。

7.2.7 RDB其他配置

1、进行rdb保存时,将文件压缩

bash 复制代码
rdbcompression yes

2、文件校验

在存储快照后,还可以让Redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能

bash 复制代码
rdbchecksum yes

7.2.8 RDB优缺点

1、优点

节省磁盘空间,恢复速度快.

2、缺点

虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改

7.3 AOF(Append Only File)

7.3.1 AOF是什么

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis启动之初会读取该文件重新构建数据,换言之,Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

7.3.2 开启AOF

1、AOF默认不开启,需要手动在配置文件中配置

bash 复制代码
appendonly no

2、AOF文件

bash 复制代码
appendfilename "appendonly.aof"

3、AOF文件保存的位置与RDB的路径一致

bash 复制代码
dir ./

7.3.3 AOF同步频率

bash 复制代码
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# always: fsync after every write to the append only log. Slow, Safest.
# everysec: fsync only one time every second. Compromise.

7.3.4 AOF文件损坏恢复

bash 复制代码
redis-check-aof  --fix  appendonly.aof  

7.3.5 AOF备份

AOF的备份机制和性能虽然和RDB不同, 但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载

7.3.6 Rewrite

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的重写,只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof手动开始重写。

重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定Redis要满足一定条件才会进行重写。

系统载入时或者上次重写完毕时,Redis会记录此时AOF大小,设为base_size,如果Redis的AOF当前大小>= base_size +base_size*100% (默认)且当前大小>=64mb(默认)的情况下,Redis会对AOF进行重写。

bash 复制代码
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

7.3.7 AOF的优缺点

1、优点:

(1)备份机制更稳健,丢失数据概率更低。

(2)可读的日志文本,通过操作AOF文件,可以处理误操作。

2、缺点:

(1)比起RDB占用更多的磁盘空间

(2)恢复备份速度要慢

(3)每次写都同步的话,有一定的性能压力

(4)存在个别bug,造成恢复不能

7.4 持久化的优先级

AOF的优先级大于RDB,如果同时开启了AOF和RDB,Redis服务启动时恢复数据以AOF为准.

7.5 RDB和AOF用哪个号

1、官方推荐两个都启用。

2、如果对数据不敏感,可以选单独用RDB

3、不建议单独用 AOF,因为可能会出现Bug。

4、如果只是做纯内存缓存,可以都不用

您的支持是我创作的无限动力

希望我能为您的未来尽绵薄之力

如有错误,谢谢指正;若有收获,谢谢赞美

相关推荐
Json_181790144801 小时前
An In-depth Look into the 1688 Product Details Data API Interface
大数据·json
@小博的博客2 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生3 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步3 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
水月梦镜花3 小时前
redis:list列表命令和内部编码
数据库·redis·list
Qspace丨轻空间4 小时前
气膜场馆:推动体育文化旅游创新发展的关键力量—轻空间
大数据·人工智能·安全·生活·娱乐
love_and_hope4 小时前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen4 小时前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
芊寻(嵌入式)4 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
hong1616884 小时前
跨模态对齐与跨领域学习
学习