【大厂面试】Redis八股文

本文涉及的产品
云数据库 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 Sentinel
【怒怼大厂面试官】听说你精通Redis?说说Redis哨兵
面试官:Redis哨兵知道吧?知道的,Sentinel哨兵本质是一个运行在特殊模式下的Redis服务器。面试官:嗯然后呢?它的主要作用是通过检测Redis主从服务器的下线状态,选举出新Redis主服务器,也就是故障转移,来保证Redis的高可用性。
79 4
【怒怼大厂面试官】听说你精通Redis?说说Redis哨兵
|
21天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
311 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
1月前
|
缓存 NoSQL Java
面试官:Redis如何实现延迟任务?
延迟任务是计划任务,用于在未来特定时间执行。常见应用场景包括定时通知、异步处理、缓存管理、计划任务、订单处理、重试机制、提醒和数据采集。Redis虽无内置延迟任务功能,但可通过过期键通知、ZSet或Redisson实现。然而,这种方法精度有限,稳定性较差,适合轻量级需求。Redisson的RDelayedQueue提供更简单的延迟队列实现。
361 9
|
1月前
|
缓存 NoSQL 定位技术
深入探索Redis:面试中必须掌握的关键知识点
深入探索Redis:面试中必须掌握的关键知识点
|
1月前
|
NoSQL Java 测试技术
面试官:如何搭建Redis集群?
**Redis Cluster** 是从 Redis 3.0 开始引入的集群解决方案,它分散数据以减少对单个主节点的依赖,提升读写性能。16384 个槽位分配给节点,客户端通过槽位信息直接路由请求。集群是无代理、去中心化的,多数命令直接由节点处理,保持高性能。通过 `create-cluster` 工具快速搭建集群,但适用于测试环境。在生产环境,需手动配置文件,启动节点,然后使用 `redis-cli --cluster create` 分配槽位和从节点。集群动态添加删除节点、数据重新分片及故障转移涉及复杂操作,包括主从切换和槽位迁移。
35 0
面试官:如何搭建Redis集群?
|
2月前
|
运维 负载均衡 NoSQL
【大厂面试官】知道Redis集群和Redis主从有什么区别吗
集群节点之间的故障检测和Redis主从中的哨兵检测很类似,都是通过PING消息来检测的。。。面试官抓抓脑袋,继续看你的简历…得想想考点你不懂的😰。
69 1
|
2月前
|
消息中间件 Dubbo Java
24年国内头条最牛的Java面试八股文1000集,不接受反驳!
年后这个时间段, 找工作面试不要停!! 很多朋友据我了解,技术水平和工作经验都很不错,但是面试频频败北。 大家复盘下来发现问题不严重,但是很普遍,10个人里面8个都存在,那就是面试前不做准备。 技巧和避坑先不论,面试题型就不熟悉,没有系统过下大厂真题和必问项目,真正对线上面试官时被打的措手不及。 想要从容应对,就要提前建立把握和自信,这不但来自自身的技术能力水平,更来源于对面试时将要发生的各种情况有预判,做到心中有数。 这里整理了一套跳槽涨薪大厂Java知识点解析及面试题解析,涵盖20个技术栈的大厂面试题及详解文档,各大厂技术重点、面试难点、进阶要点,帮助大家“临阵磨枪”,如有需要的
|
2月前
|
NoSQL Redis
【怒怼大厂面试官】听说你精通Redis?Redis数据同步懂吗
面试官:不用慌尽管说,错了也没关系。。。来说说Redis数据同步。是这样的,Redis有一个叫命令传播的概念,如果像面试官说的这种场景,再使用上面我提到的AOF缓冲区就有点浪费内存空间了。所以Redis会将主服务器的这条Del删除命令
63 2
【怒怼大厂面试官】听说你精通Redis?Redis数据同步懂吗
|
1月前
|
存储 安全 Java
大厂面试题详解:java中有哪些类型的锁
字节跳动大厂面试题详解:java中有哪些类型的锁
58 0
|
2天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
10 0