【第十二天】Redis相关知识

什么是 redis

redis 是一种基于键值对的 NoSQL 非关系型数据库。

redis 的 value 支持 string,hash,list,set,zset,Bitmaps,GEO 等多种数据结构,因此可以满足很多使用场景

redis 会将所有数据存放在内存中,所以读写性能非常出色。

redis 还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生断电或机器故障的时候,内存中的数据不会丢失。

redis 可以用来干什么

1.缓存

基本所有的 Web 应用都会使用 Redis 作为缓存,来降低数据源压力,提高响应速度。

2.计数器

redis 天然支持计数功能,且技术性能良好,可以用来记录浏览量,点赞量等数据。

3.排行榜

redis 提供了列表和有序集合数据结构,合理使用这些数据结构就可以构建出各种排行榜系统

4.社交网络

赞/踩,粉丝,共同爱好,推送,下拉刷新。

5.消息队列

redis 提供了发布订阅功能和阻塞队列的功能,可以满足一般消息队列功能

6.分布式锁

分布式环境下,可以利用 redis 实现分布式锁

redis 有哪些数据结构

1. string

字符串是 redis 中最基础的数据结构,字符串类型的值实际可以是字符串,数字,甚至是二进制(图片,视频),但是值最大不能超过 512MB

字符串主要有以下几种典型使用场景:

  • 缓存功能
  • 计数
  • 共享 Session
  • 限速

2.hash

哈希类型是指键值对的值又是一个键值对结构。

哈希主要有以下几种经典应用场景:

  • 缓存用户信息
  • 缓存对象

3.list

列表类型是用来存储多个有序的字符串。列表可以充当栈和队列的角色。

列表有以下使用场景:

  • 消息队列
  • 文章列表

4.set

集合类型也是用来保存多个字符串元素,但和列表不同的是,集合中不允许出现重复元素,且里面的元素是无序的。

集合有以下使用场景:

  • 标签
  • 共同关注

5.sorted set

有序集合中的元素可以排序。但是它和列表的排序依据不同。列表是按索引下标排序,有序集合则是给每一个元素都设置一个权重值,作为排序依据。

有序集合的主要使用场景:

  • 用户点赞统计
  • 用户排序

redis 为什么快?

  1. 完全基于内存操作:redis 将数据存储在内存中,而不是磁盘上。内存访问速度更快。
  2. 单线程操作:redis 采用单线程的方式处理客户端请求。这样可以避免多线程上下文切换和竞争条件的开销,提高了处理请求的效率。
  3. 非阻塞的 IO 多路复用机制:redis 使用了 IO 多路复用模型,通过一个线程来监听多个客户端连接,当有事件发生时才会进行处理。这种机制避免了阻塞和线程切换,提高了并发能力。
  4. 优化的数据结构:redis 在底层使用了优化过的数据结构,如哈希表、跳跃表和压缩列表等。这些数据结构能够快速地存储和检索数据,使得 redis 在各种操作上都能达到很高的性能。

redis 持久化机制有哪些

redis 持久化方案分为 RDB 和 AOF 两种。

简单来说:RDB 就是把数据保存到硬盘,AOF 就是记录写命令,每次重启直接执行保存了的命令就是了。

RDB:

RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发。

RDB 文件是一个压缩的二进制文件,通过它可以还原某个时刻数据库的状态。由于 RDB 文件是保存在硬盘上的,所以即使 Redis 崩溃或者退出,只要 RDB 文件存在,就可以用它来恢复还原数据库的状态。

手动触发分别对应着 save 命令和 bgsave 命令

  • save:阻塞当前 redis 服务器,直到 RDB 过程完成为止,对与内存较大的实例会造成长时间的阻塞,线上环境不建议使用。
  • bgsave:redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。

以下场景会自动触发 RDB 持久化:

  • 使用save相关配置,如"save m n"。表示 m 秒内数据集存在 n 次修改时,自动触发 bgsave

  • 如果从节点执行全量复制操作,主节点自动执行 bgsave 生成 RDB 文件并发送给从节点。

  • 执行 debug reload 命令重新加载 redis 时,自动触发 save 操作

  • 默认情况下执行 shutdown 命令时,如果没有开启 AOF 持久化功能则自动执行 bgsave.

AOF:

以独立日志的方式记录每次写命令,重启时再重新执行 AOF 文件中的命令以达到恢复数据的目的。AOF 的主要作用是解决了数据持久化的实时性,目前是 redis 持久化的主流方式。

AOF 工作流程:命令写入(append)、文件同步(sync)、文件重写(rewrite)、重启加载(load)

  1. 所有的写入命令会追加到 aof_buf(缓冲区)中。
  2. AOF 缓冲区会根据对应的策略向硬盘做同步操作。
  3. 随着 AOF 文件越来越大,需要定时对 AOF 文件进行重写,达到压缩的目的。
  4. 当 redis 服务器重启时,可以加载 AOF 文件进行数据恢复。

RDB 与 AOF 的优缺点比较。

RDB 优点:

  1. 只有一个紧凑的二进制文件 dump.rdb,非常适合备份,全量复制的场景。
  2. 容灾性好,可以把 RDB 文件拷贝到远程机器或者文件系统上,用于容灾恢复。
  3. 恢复速度快,RDB 恢复数据的速度远远快于 AOF 的方式。

RDB 缺点:

  1. 实时性低,RDB 是每间隔一段时间进行持久化,没法做到实时持久化/秒级持久化。如果在这一段时间出现故障,数据会丢失。
  2. 存在兼容问题,老版本的 redis 无法兼容新版本的 RDB

AOF 优点:

  1. 实时性好,AOF 持久化可以配置 appendsync 属性,有 always,每进程一次命令操作就记录到 AOF 文件中一次。
  2. 通过 append 模式写文件,即使途中服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。

AOF 缺点:

  1. AOF 文件比 RDB 文件大,且恢复速度慢。
  2. 数据集大的适合,启动效率低。

什么是缓存击穿、缓存穿透、缓存雪崩?

缓存击穿:

一个并发量比较大的 key 在某个时间段过期,导致所有请求直接打在了数据库上。

解决方案:

  • 加锁更新,比如请求查询 A,发现缓存中没有,那就对 A 这个 key 加锁,同时去数据库查询数据,写入缓存,再返回给用户,这样后面的请求就可以从缓存中拿到数据了。
  • 将过期时间组合写在 value 中,通过异步的方式不断刷新过期时间,防止此类现象。

缓存穿透:

缓存穿透指的是查询缓存和数据库中第一不存在的数据,这样每次请求都直接打到数据库,就好像缓存不存在一样。

缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。

缓存穿透可能会使后端存储负载加大,如果发现大量存储层空命中,可能就是出现了缓存穿透问题。

缓存穿透可能有两种原因:

  • 自身业务代码问题
  • 恶意攻击,爬虫造成空命中

有两种解决方案:

  • 缓存空值/默认值

    在数据库空命中后,把一个空对象或者默认值存到缓存,以后再访问这个数据,就会从缓存中获取,这样就保护了数据库。
    这样做也有问题:

    • 空值做了缓存,意味着在缓存层中存了更多的键,需要更多的内存空间,如果是恶意攻击的话问题就更严重了。比较有效的方法是针对这一类数据设置一个较短的过期时间,让其自动剔除。
    • 缓存层和存储层会出现一段时间的时间窗口不一致,可能会对业务有一定的影响。例如过期时间设置为 5 分钟,如果此时存储层添加了这个数据,那么此段时间就会出现缓存层和存储层数据的不一致。这个时候就要用消息队列或者其他异步方式清理缓存中的空对象
  • 布隆过滤器

    我们可以在存储和缓存之前,加一个布隆过滤器。布隆过滤器里会保存数据是否存在,如果判断数据不存在,就不会访问存储。

缓存雪崩:

某一时刻发生大规模的缓存失效的情况,例如缓存服务宕机,大量 key 在同一时间过期,这样的后果就是大量请求直接打到数据库上,可能导致整个系统崩溃,称为雪崩。

怎么预防和处理:

  • 提高缓存可用性:

    1. 集群部署:通过基础来提升缓存的可用性,可以利用 redis 本身的 redisCluster 或者第三方集群方案如 Codis 等。
    2. 多级缓存:设置多级缓存,第一级缓存实现的基础上,访问二级缓存,每一级缓存的失效时间都不同。
  • 过期时间:

    1. 均匀过期:为了避免大量的缓存在同一时间过期,可以把不同的 key 过期时间随机生成,避免过期时间太过集中。
    2. 热点数据永不过期。
  • 熔断降级:

    1. 服务熔断:当缓存服务器宕机或者超时响应时,为了防止整个系统出现雪崩,暂时停止业务服务访问缓存系统。
    2. 服务降级:当出现大量缓存失效,而且处在高并发高负荷的情况下,在业务系统内部暂时舍弃一些非核心的接口和数据的请求,而直接返回一个提前准备好多 fallback(退路)错误处理信息。
  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泉绮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值