Redis系列一

一、初识Redis

1,什么是redis

使用C语言编写,遵守BSD协议的一个高性能key-value分布式内存数据库并提供持久化的NoSQL数据库

2,redis特性:速度快

Redis官方给出的数据是10W QPS(每秒可以操作数据10W次),这个数据会根据电脑性能和Redis的使用方式不同而略微不同,但是在万级数据中操作没有压力。

 redis为什么那么快呢?

(1)纯内存操作

数据存放在内存中,内存的响应时间大约是 100纳秒 ,这是Redis每秒万亿级别访问的重要基础。

(2)编程语言

纯ANSI C编写,不依赖第三方类库。

(3)线程模型

Redis使用单线程操作,避免了频繁的上下文切换,也不存在多进程或者多线程导致的切换而消耗 CPU。

3,redis支持5种数据类型
3.1 String类型

一个 key 对应一个 value。value可以是简单字符串,也可以是复杂的字符串比如JSON,XML等,也可以是数字(小数、整数)

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

String类型的使用场景:用来做缓存、计数器、分布式锁等。

3.2 List类型

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

List应用场景:好友列表,粉丝列表,消息队列,最新消息排行等。

3.3 Set类型

set是string类型的无序集合,set中的元素是没有顺序并且不可重复。

Set应用场景:共同关注、共同喜好、二度好友、分类标签等。

3.4 hash类型

一个key对应一个HashMap。

Hash应用场景:用一个对象来存储用户信息,商品信息,订单信息等。

3.5  sorted set

sorted set 是有序集合, 它在 set 的基础上增加了一个顺序属性(score),这一属性在添加,修改元素的时候可以指定, 每次指定后, 会自动重新按新的值调整顺序。 可以理解了有两列的mysql 表,一列存 value,一列存score。

Redis系列一

4,redis具体使用场景

4.1 缓存系统

我们要获取数据先从cache(缓存)中获取,如没有在从数据库中获取,以减轻数据库的压力。

4.2 计数器和计时器

我们可以使用redis的incr来记录转发数,评论数,视频播放数等,而不会发生错误,这个功能对公司项目的决策是很重要的, 计时,比如验证码一分钟内有效。可以使用 Redis 的 setex 命令设置验证码只保存一分钟,一分钟后失效

4,3 消息队列系统

成熟的消息队列有ActiveMQ,RabbitMQ、Kafka等。Redis 的 List 类型能够很轻松的实现一个消息队列。

4,4 排行榜

Redis提供的有序集合(Zset),可以实现排行榜

4.5 实时系统

比如垃圾邮件过滤,电商秒杀等系统就可以使用Redis实现。

5,redis的持久化

5.1 redis默认持久化RDB

RDB其实就是把数据以快照的形式保存在磁盘上。什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb

1.当redis节点因为断电或者关机.这是内存释放,数据丢失.

2.当redis再次启动时首先会根据配置文件查找当前节点的rdb文件,自动的读取rdb文件中的内容.自动的实现数据恢复.

5.1.1 三种触发方式

 save触发方式(已被弃用)

该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。具体流程如下:

Redis系列一

执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。

 bgsave触发方式

执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体流程如下:

Redis系列一

具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。

 自动触发

自动触发是由我们的配置文件来完成的。在redis.conf配置文件中,里面有如下配置,我们可以去设置

save:这里是用来配置触发 Redis的 RDB 持久化条件,也就是什么时候将内存中的数据保存到硬盘。比如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。

默认如下配置:

#表示900 秒内如果至少有 1 个 key 的值变化,则保存save 900 1#表示300 秒内如果至少有 10 个 key 的值变化,则保存save 300 10#表示60 秒内如果至少有 10000 个 key 的值变化,则保存save 60 10000

不需要持久化,那么你可以注释掉所有的 save 行来停用保存功能。

一般采用 bgsave触发方式持久化

RDB 的优势和劣势

优势:

(1) RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复

(2) 生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。

(3) RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

劣势:

当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。

5.2 redis持久化AOF

全量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。

持久化原理:

Redis系列一

文件重写原理:

AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。

Redis系列一

重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

5.2.1 三种触发方式

redis的默认持久化策略采用RDB形式,如果想使用AOF形式,需要进行额外的配置。

appendonly no(默认)改成 yes

Everysec方式:  

每秒数据备份一次 效率相对于RDB接近效率。

Always方式:     

只要执行set操作,则redis就会备份,该操作的效率很低。

No方式:(弃用)         

将备份的策略交个操作系统完成(30分钟备份一次) 一般很少使用。

appendfsync everysec 默认采用每秒备份一次.

对比这三种方式

Redis系列一

总结:RDB方式可能造成数据的丢失,但效率高于AOF。如果对数据的完整性要求非常高,则使用AOF方式。