Redis 你该懂的点

785 阅读6分钟

前言

头一次用这种标题哈哈哈感觉有点。。反正这是一篇关于Redis相关知识点的Blog,面试中会问到的(比重会比较大哈),持续收集更新中

什么是Redis?

一般很少会问这个啦,一般都是问你在真实开发中,在哪儿用到了Redis,不过还是该知道的;
Redis是主流的键值对存储数据库(NoSQL),通常全部数据都存在内存中(为什么这么快的主要原因之一!),但也支持持久化策略,支持事务(资源允许的话,可以当作DB了),并且Redis支持丰富的数据类型(能够应对大部分场景),Redis是单线程的(没有线程安全问题,没有锁的烦恼)

Redis支持的数据类型

在了解Redis能做什么之前,我们先了解下Redis支持的数据类型

六个常用数据类型

  • 二进制 Redis Key
    二进制安全的 Key
    任何二进制序列都可以作为Key,从字符到JPEG文件的内容,可以存空字符
    允许的最大值为 512 M
  • String 字符串
  • List 列表
  • Zest / Sorted Sets 有序集合
  • Set 集合
  • Hash 字典

进阶

  • Bitmap / 位图
  • HyperLogLogs / 计算唯一事物的概率数据结构

Redis 能做什么?

这是最实际的问题,也是面试中Redis的高频问题

  • 缓存 / cache :
    加快查询速度,存储热点数据
    会话缓存,用户是否在线,通过时效性
    记录在线人数,通过incr

  • 数据库存储 / Database
    没有像 MySQL 等的I/O操作限制,支持事务,支持丰富的数据结构,不做DB存储就太可惜了吧
    火热排行榜: Zset
    社交列表: Set
    全局唯一ID / 计数器(每个IP请求限制等等): String 的 incr

  • 信息队列 / message broker

    Redis也是 Pub - Sub 服务器(小声bb,一般不会用到,有用到的,请用力喷我,让我清醒)
    通过三个命令 SUBSCRIBE(订阅),UNSUBSCRIBE(取消订阅) 和 PUBLISH(发布信息) 实现了信息订阅发布服务
    官方有个实践案例多用户高性能的Web聊天,使用EventMachine和Redis:链接

相比 memcached 有哪些优势?

面试中总会问同类型技术的比较,Spring和Spring Boot 的区别,MyBatis 和 Hibernate 的区别啦,Redis 一般都是和 NoSQL 比较

  • memcached只支持字符,Redis 支持丰富的数据类型
  • Redis 支持持久化数据,而memcached没有,只能存在内存中
  • memcached能缓存的内容没有 Redis 那么灵活
    默认 Key 最大是250字节,Value 是1MB,不过官方有说明 memcached 本身就是用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。

Redis 持久化策略

Redis 的持久化策略是面试中比较高频的问题,Redis 中提供了两种持久化策略,可以根据业务需求选择其中一种,也支持两个策略都开,当然也可以都禁用

  • RDB持久化( Reids 在内存中的数据库记录定时 dump 到磁盘上的 RDB 持久化)
  • AOF 持久化( Reids 的操作日志以追加的方式写入文件)

AOF

AOF 持久化以日志的形式记录 Redis 服务所处理的每一个写,删操作,以文本方式保存;Redis重启时,会优先选择 AOF 文件恢复数据,在服务器启动时逐条执行 AOF 日志里的命令

RDB

以指定的时间间隔执行数据集的时间点快照。
Redis将数据集的快照保存在磁盘上,名为dump.rdb的文件。如果数据集中至少有M个更改,则可以将Redis配置为生成一次快照,或者可以手动调用 SAVEBGSAVE 命令。
下面是RDB持久化配置例子:

# 在redis配置文件中配置下面两行,满足其中一项就生成快照
save 60 1000  # 每分钟,如果有1000条写入命令,就生成快照
save 3600 10000 # 每小时,有1w条写入命令,就生成快照
  • SAVE 和 BGSAVE 两个备份(持久化)命令
    备份 redis 可以手动使用 SAVE 命令,执行 SAVE 命令会使用主进程执行快照操作,这意味着在 SAVE 的过程中,会阻塞主进程。
    使用 BGSAVE 的话,redis 会 fork 出一个子进程来执行快照操作,而不影响主进程。

  • 为什么用 RDB 持久化策略
    RDB 是 Redis 数据的一个非常紧凑的单文件时间点表示。RDB 文件非常适合备份。例如,我们希望在最近24小时内每小时归档RDB文件。可以在发生灾难时轻松恢复数据集的不同时间段的数据
    RDB非常适合灾难恢复,可以将单个压缩文件传输到远端数据中心
    与AOF相比,RDB更适合 Redis 数据量大时,更快地重启 Redis(AOF 一条条写命令重新执行,数据量一大,能不慢吗)

缓存失效的相关点

先声明下,下面数据库压力问题是以高并发作为背景,相对而言,这种场景和业务很多铁汁是没遇见过的,所以不用担心你们服务器会挂的问题

缓存雪崩

先声明下,下面数据库压力问题是以高并发作为背景,相对而言,这种场景和业务很多铁汁是没遇见过的,所以不用担心直接走数据库,服务不可用的问题

如何解决缓存雪崩问题?

首先我们要知道,我们该如何去处理雪崩问题

  • 预防:
    1. Redis服务宕机,我们可以通过搭建高可用的缓存架构,比如使用 哨兵+主从 架构或者使用集群,避免单个Redis出现故障导致缓存服务不可用
    2. 既然怕数据库压力大而宕机,那就做 DB 的集群,分担压力
    3. 系统接入除 Redis 外的缓存中间件(memcached等),Redis 不可用后,还能通过其他中间件使用缓存服务
    4. 监控 Redis 服务运行情况,相关的报警机制
  • 预防了也还是出现了雪崩怎么办?
    服务进行降级和限流,防止 MySQL 宕机
  • 雪崩过后如何该如何减少损失?
    运维工程师重启 Redis,通过持久化策略恢复缓存数据

缓存击穿

缓存穿透和缓存雪崩的区别就是缓存雪崩是大量的 Key 失效,而穿透则是一个热点 Key 失效,大量请求访问到 DB,导致的服务不可用

缓存穿透

查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义
在并发大时,DB可能压力过大挂掉,要是有人通过这个漏洞频繁攻击我们的系统服务,后果是不堪设想的

参考文献

Redis官网
Redis:WiKi
memcached:GitHub