【大厂面试】Redis八股文

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 自己整理的Redis八股文内容,可用思维导图和markdown 2种方式查看

redis

查看这篇文章的思维导图格式请移步:https://www.processon.com/view/link/656ee6bc7fb4bc54ff0f5749

概念

为什么用redis

  • 1.读写性能优异,数据类型丰富,所有操作都是原子性的,支持持久化,分布式

使用场景?

  • 1.热点数据的缓存,redis内部支持事务,保证数据一致性
  • 2.计数器相关问题:高并发的秒杀,限制一个接口请求的次数QPS
  • 3.分布式锁:用到setnx命令,如果不存在则成功设置并返回1,用于加锁

数据类型

String字符串

  • 可以是数字、字符串、或序列化的对象,
  • 应用场景:缓存、计数器、session
  • 命令:get、set、del、incr,decr

List列表

  • 双向链表实现List,
  • 应用场景:可实现栈、队列; 比如微博的timeline
  • 命令

    • rpush:将值放到右端,相反为lpush
    • rpop:从列表右端弹出值,返回;lpop
    • lindex:通过索引获取列表中的元素

Set集合

  • String类型的无需集合,元素唯一,集合是通过哈希表实现的
  • 命令:sadd:添加,smember:返回集合中所有成员

Hash散列

  • String类型的field和value映射表,用于存储对象,
  • 命令:hset添加键值对,hget:获取键值对
  • 场景:比string更省空间的缓存

Zset有序集合

  • 和set一样,不同的是每个元素都会关联double类型的分数,redis通过分数进行从小到大排序
  • 命令:zadd、zrange
  • 场景:排行榜,按用户关注数、播放量、评分等进行排序

持久化

为什么需要持久化?

  • redis是基于内存的数据库,如果服务器宕机,从数据库恢复的话,如果是大数据:1.数据库压力大,2.数据库性能不如redis,响应变慢

RDB持久化

  • 快照方式,将当前进程数据生成快照保存到磁盘上,是某一时刻的快照
  • 手动触发:

    • save和bgsave命令,save会阻塞进程,线上不建议用;bgsave会fork出子进程完成写入rdb文件操作,阻塞时间短
  • 自动触发

  • 优缺点

    • 优点:RDB文件体积小,适用于全量复制;redis加载RDB文件速度也快
    • 缺点:实时性不够,不能做到秒级持久化

AOF持久化

  • AOF使用写后日志

事务

什么是redis事务?

  • 本质是一组命令的集合,一个事务里所有命令会被序列化,按顺序串行化执行队列中的命令,
  • redis事务是一次性、顺序性、排他性第执行一个队列中的一系列命令

主从复制

为什么要用主从复制

  • 1.数据冗余实现热备份;2.故障恢复,主节点故障,从结点继续提供服务;3.负载均衡,应对读多写少的情况,提供并发量;4.读写分离

原理

  • 全量复制

    • 1.主从库建立连接,协商同步过程,
    • 2.主库将所有数据同步给从库,发RDB文件
    • 3.主库将新收到的写命令,再发给从库
  • 增量复制

缓存问题

缓存穿透

  • 缓存没有,数据库也没有
  • 原因: 因为缓存里查不到,每次去从层层查不存在的数据,致使数据库压力过大
  • 解决方式:加校验,参数校验

缓存击穿

  • 缓存中没有,数据库有
  • 原因:一般是缓存时间到期,因为缓存没有,去数据库中查,引起数据库压力过大
  • 解决:热点参数永不过期;接口限流与熔断;

缓存雪崩

  • 缓存数据大批量到期,而查询数据量很大引起宕机
  • 缓存击穿是指并发查一条数据,雪崩是大量不同数据过期,引起查询走数据库
  • 解决:过期时间随机,热点参数不过期

缓存污染

  • 很少被访问的数据留在缓存中,浪费空间

缓存淘汰策略

不淘汰

  • noeviction

    • 默认策略,一旦缓存写满,有新写请求时,redis不处理,直接返回错误

对设置了过期时间的数据进行淘汰

  • volatile-random

    • 设置了过期时间的键值对中,进行随机删除
  • volatile-ttl

    • 进行过期时间的排序,越早过期的数据优先被删除
  • volatile-lru

    • 按最近最少使用原则删除数据,随机取数删除时间戳最小的
  • vola-lfu

    • 按LFU算法筛选过期数据

全部数据淘汰

  • allkeys-lru

    • 筛选数据是全部key
  • allkeys-random

    • 从所有数据中随机删除
  • allkeys-lfu

    • 全部key使用LFU筛选删除

数据库和缓存一致性

为什么有库和缓存一致性问题?

  • 在并发环境下,涉及数据更新,先写库,再删缓存;还是先删缓存,再写库;都会有数据不一致的情况

解决方式

  • Cache aside模式

    • 读的时候,缓存没有就读数据库,然后成功取出数据后,放入缓存
    • 更新的时候,先更新数据库,成功后,再删除缓存
  • 延迟双删

    • 原因:cache aside模式,仍然可能存在不一致的问题
    • 先删除缓存,再写数据库,休眠1s后再删缓存
    • 问题:增加了写请求的耗时
  • 异步更新缓存

    • 基于订阅binlog的同步机制
    • 整体思路:

      • 读redis:热点数据都在redis;写MySQL:增删改都是操作MySQL;更新redis数据:binlog+消息队列+增量数据更新到redis
    • 更新过程

      • 全量更新

        • 将全部数据一次写入redis
      • 增量更新

        • 读取binlog后分析,利用消息队列,推送更新到各平台的redis缓存数据。需要结合canal(阿里的开源框架)对MySQL的binlog进行订阅,然后MQ中间件选择kafka实现推送更新

面试问题

redis为什么这么快

redis有哪些数据类型

  • 5种,对应的命令也说说

字符串类型存储的最大容量是?

  • 512M

内存淘汰策略?

  • 用于内存不足时,怎么处理新写入且申请额外空间的数据
  • 8种内存淘汰策略:1.默认报错;2.全局键空间选择性删除;3.设置了过期时间的key选择性删除

过期键的淘汰策略?

  • 定时过期、定期过期、惰性过期

redis怎么做分布式锁?

  • 因为redis单进程、性能高的特点,故可以作为分布式锁
  • 分布式锁与Java的Lock对比?

    • Java的锁只能保证单机有效,所以分布式需要分布式锁
  • 分布式锁的特点

      1. 互斥性:任何时刻,同一数据,只有一台应用可以获得锁;
      1. 高可用性:一部分服务器宕机不影响使用,分布式锁以集群方式部署;
      1. 防止锁超时:客户端没有释放锁,服务端一段时间后自动释放
      1. 独占性:加锁解锁必须由同一台服务器进行,即加解锁只能自己完成,不能让别人解锁了
  • 实现

      1. setnx+expire命令(错误做法)

        • setnx命令在key不存在时才能成功,key存在,返回0。用expire命令设置过期时间。问题:这是分开的两步,不是原子操作,第一步成功,第二步可能失败
        • 问题:第一个加锁成功,但是应用挂了,锁就得不到释放,其他线程永远得不到锁
      1. 使用lua脚本将两个命令合成一个原子操作
      1. setex命令(setex key seconds value)

        • 正确做法,将值value关联到key,并将key的生存时间设为seconds(以秒为单位),setex命令会覆盖旧值
        • 就算线程挂了,也会在失效时间到了自动释放
    • 解锁

      • 为了防止自己加的锁被其他人释放了。需要在删除之前验证key对应的value是否是当前线程持有,再del key就可以了,因此需要lua脚本封装2步
  • 问题

    • 上面实现的分布式锁,存在问题:不支持可重入。如果要支持可重入,需要使用redisson

XMind - Trial Version

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
1月前
|
存储 NoSQL Java
可能是最漂亮的Redis面试基础详解
我是南哥,相信对你通关面试、拿下Offer有所帮助。敲黑板:本文总结了Redis基础最常见的面试题!包含了Redis五大基本数据类型、Redis内存回收策略、Redis持久化等。相信大部分Redis初学者都会忽略掉一个重要的知识点,Redis其实是单线程模型。我们按直觉来看应该是多线程比单线程更快、处理能力更强才对,比如单线程一次只可以做一件事情,而多线程却可以同时做十件事情。但Redis却可以做到每秒万级别的处理能力,主要是基于以下原因:(1)Redis是基于内存操作的,Redis所有的数据库状态都保存在
可能是最漂亮的Redis面试基础详解
|
27天前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
1月前
|
NoSQL 算法 Redis
Redis面试篇
Redis面试篇
35 5
|
1月前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
33 1
|
14天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
1月前
|
缓存 NoSQL 算法
面试题:Redis如何实现分布式锁!
面试题:Redis如何实现分布式锁!
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
4天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
5天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
22 4