Redis

Redis

一、概述

Redis是一个基于内存的高性能key_value数据库

二、优点

2.1、速度快

数据存储在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)(常量级,时间最短)

Redis本质是一个key_value类型的内存数据库

2.2、支持丰富数据类型

五种基本数据类型:String、List、Set、ZSet、Hash

而且单个Value的最大限制是1GB。

2.3、丰富的特性

Key过期策略、事务、支持多个DB、计数等

2.4、持久化存储

AOF和RDB两种数据的持久化存出方案。

2.5、高可用

Redis Sentinel提供高可用方案,实现主从故障自动转移

Redsi Cluster,提供集群方案,实现基于槽的分片方案,从而支持更大的Redis规模

三、Redis的线程模型

Redis是非阻塞IO,多路复用的模型

Redis的文件时间处理器是单线程,同时使用IO多路复用机制同时监听多个Socket。Socket并发产生不同操作时,会将Socket产生的时间放入队列中排队。

四、为什么Redis单线程模型也能效率这么高?

4.1、C语言实现

  C语言的执行速度非常快

4.2、存内存操作

  Redis将数据读到内存中,并通过异步的方式将数据写入磁盘。

4.3、基于非阻塞的IO多路复用机制。

4.4、单线程,避免了多线程的频繁上下文切换问题。

  Redis利用队列技术,将并发访问变为串行访问,消除了传统数据库串行控制的开销。

4.5、丰富的数据结构

  丰富的数据结构,可以对数据进行优化。

五、RDB和AOF详解

1、全量RDB持久化,是指在指定的时间间隔内将内存中的数据集快照写入磁盘。实际操作是,fork一个子进程,先将数据写入临时文件,写入成功后,再替换之前的文件。用二进制压缩存储。

2、增量AOF持久化,以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录,也就是数据发生改变,我就持久化。

5.1、RDB优缺点

  优点:

    灵活设置备份频率和周期,一旦系统出现灾难性故障,可以非常容易的进行恢复

    适合冷备份,可以将完整数据备份到远程的安全存储上,可以应对灾难性恢复

    性能最大化。可以避免服务进行执行IO操作。

    恢复更快

  缺点:

    无法保证数据的高可用性,即最大限度的避免数据丢失。

    如果数据较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟

5.2、AOF优缺点

  优点:

    更高的数据安全性,有三种同步策略

    每秒同步(可能丢失一秒数据)、每修改同步(效率最低)、不同步

    该机制对日志文件的写入操作采用的是append,所以写入过程中即使出现宕机,也不会破会日志文件已经存在的内容

    写入性能高,不怕写一半崩溃,因为redis有解决的方案。

    AOF日志过大,Redis对其有优化,即使后台出现重写操作,也不会影响客户端的读写。  

    AOF有一个清晰的日志文件,我们甚至可以通过该文件完成数据的重建。

  缺点:

    相同数量的数据集而言,AOF文件通常大于RDB文件,恢复速度比RDB的恢复速度要慢

我们应当如何选择:

  不要仅仅使用RDB,因为那样会丢失很多数据

  也不要仅仅使用AOF,这样会有两个问题。

  RDB冷备恢复起来更快,AOF出过bug。

Redis支持同时开启两种持久化方式。用AOF保证数据不会丢失,用RDB来做冷备,当AOF文件丢失或损坏用RDB来进行快速的数据恢复

  如果同时使用两种持久化机制,那么redis重启的时候,会使用AOF来重新构建数据

  如果突然停电会怎样?一般来说使用每秒一次保存比较好,大概率会丢失1-2秒的数据。

redis有几种数据过期策略

  有六种

  从已设置过期时间的数据集中挑选数据少使用淘汰

  从已设置过期时间的数据集中挑选数据快过期淘汰

  从已设置过期时间的数据集中任意挑选

  从数据集中挑选最近最少使用的数据淘汰

  从数据集中任意选择数据淘汰

  不淘汰任何数据,不可写入任何数据集

Redis LRU 算法最近最少使用算法**Redis 没有使用真正实现严格的 LRU 算是的原因是,因为消耗更多的内存。然而对于使用 Redis 的应用来说,使用近似的 LRU 算法,事实上是等价的。**

如何保证热点数据不要被淘汰

访问符合幂律分布,也就是存在相对热点数据

Redis 回收进程如何工作的?

  • 一个客户端运行了新的写命令,添加了新的数据。

  • Redis 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。

  • Redis 执行新命令

如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

Redis可能会出现短暂的卡顿现象,一般添加一个随机值,使得过期时间分散一些。

还需要防备出现缓存雪崩的问题。

原文地址:https://www.cnblogs.com/gushiye/p/13986369.html