45.Redis面试怎么面?(redis面试常见问题)
mhr18 2024-10-30 02:41 17 浏览 0 评论
文章目录
- 前言
- 1.第一问:redis支持哪些数据类型:
- 2 第二问:redis持久化方式和说明:
- 2.1 RDB(默认)持久化存储:
- 2.2 AOF:
- 2.3 持久化比较:
- 3.第三问:redis架构模式介绍:
- 4.第四问:redis常用命令和过期策略介绍:
- 5.第五问:redis分布式锁和队列:
- 6.第六问:redis针对缓存穿透、击穿、雪崩的解决方案:
- 总结
前言
java后端现在去外面面试,redis也是必须面试的问题点,因为在实际的开发当中,我们很多场景下秒杀、缓存、加锁会使用到redis。redis其实是数据库的一种,与传统的sqlserver和mysql的关系型数据库比较,属于非关系数据库,key-value形式存储。传统数据库遵循的是ACID规则。而redis遵循的是CAP理论。
1.第一问:redis支持哪些数据类型:
类型 | 命令 | 说明 |
String字符串 | set key value | String 是二进制安全的,也是基本数据类型,最大键值存储为512M,用于字符串缓存,加锁等场景 |
Hash类型 | hmset name key1 value1 key2 value2 | 是一个键值对的集合,非常适合存储字段比较多的对象 |
List类型 | 注意存储的是字符串列表,当然可以支持json字符串支持头部和尾部进行插入,同样支持头部和尾部读取,也支持索引获取元素,长度等方法 | 我之前用list做过队列,就是一个服务往里面写,另一个进行读取,进行了服务之间的解耦,当然这个数据量小的时候可以,数据量大的时候还是使用mq等中间件比较靠谱 |
Set集合 | sadd name value,set的是String 类型的无序集合 | 集合通过hash表实现,添加、删除、查找的复杂度都是O(1) |
zset类型 | 有序集合, zadd name score value,跟set一样,是String类型元素集合,不允许重复成员,因为元素都会关联一个分数,所以通过分数的排序使其具有排序的特性,成员唯一,但是分数可以重复 | 使用与需要排序的集合的使用场景 |
2 第二问:redis持久化方式和说明:
持久化的目的是防止服务宕机内存中的数据丢失。
2.1 RDB(默认)持久化存储:
RDB快照存储,隔一段时间fork一个子进程进行快照形式的保存数据,缺点是容易丢失数据。RDB是Redis DataBase缩写,rdbsSave和rdbLoad两个函数进行和磁盘文件交互。
2.2 AOF:
追加模式,aof是Append-only file缩写,就是定期往磁盘文件进行追加持久化的内容,缺点是导致后面的追加文件很大,但是优点是不容易丢失数据。
2.3 持久化比较:
- aof的更新频率比rdb高,优先使用aof进行数据还原
- aof比rdb安全,但是文件会更大
- rdb的性能比aof好
- 如果配置的两种持久化策略,优先使用的aof
这里提一下redis客户端和服务端的通讯协议是:RESP。
特点是:
实现简答、快速解析、可读性好
3.第三问:redis架构模式介绍:
单机版: 一个服务提供给多个客户端使用:
特点是:简单
缺点:内容存储有限、处理能力有限、无法高可用
主从复制:
一个master 多个slave,主服务器发生在自己身上的数据更新给从服务器,来保证主从相同。
特点:降低了度压力
缺点:无法保证高可用,主挂了就挂了,也没有解决写的压力
哨兵:
Redis sentinel 是一个分布式系统中监控redis主从服务器,在主服务器下线时自动进行故障迁移。
监控:监控主从服务器之间是否正常
提醒:当监控的redis服务器出现问题,会向管理员和其他应用发出通知
自动故障迁移:当主服务器不能正常工作时,开始自动故障迁移。
特点:
保证高可用、监控各个节点、自动故障迁移
缺点:主从模式,切换时间可能都是数据,缺点是没有解决master写的压力
集群(proxy 型)用的不多:
Twemproxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器; Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII 协议和 redis 协议。
特点:1、多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins
2、支持失败节点自动删除
3、后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致
缺点:增加了新的 proxy,需要维护其高可用。
集群(直连型):
redis 3.0之后支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
特点:
1、无中心架构(不存在哪个节点影响性能瓶颈),少了 proxy 层。
2、数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。
3、可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除。
4、高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本
5、实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave到 Master 的角色提升。
缺点:
1、资源隔离性较差,容易出现相互影响的情况。
2、因为数据通过异步复制,不保证数据的强一致性
补充:目前来说最好的一个架构
4.第四问:redis常用命令和过期策略介绍:
命令 | 说明 |
Keys pattern/keys aa* keys * | 查看key相关 |
Exists key | 查询key是否存在存在返回1不存在返回0 |
set | set key value进行存储键值对 |
setnx | 设置key对应的值为String类型的value,如果key已经存在,返回0,nx是not exist的意思 |
del key | 删除key |
Incr | 对key进行加1的操作并且返回新的值 |
incrby | 指定Key加的值并且返回最新值 |
Decr | 在原来的值的基础上减1并返回结果 |
Decrby | 指定减的值 |
Rename | 重命名 |
Type | 返回数据类型 |
这里要说明的是如果使用的是SpringBoot,RedisTemplate 里面直接点点操作会有对应的api操作。
这里还要说的是如果你面试的能够回答出来,SpringBoot1x中使用的是jedis连接池 ,SpringBoot2x中使用的是lettuce 连接池,性能有很大提升,会是加分项。
Redis过期策略:
我们知道设置过期时间命令:
expire key time
字符串独有的过期设置:
setx(String key ,int seconds,String value)
除了字符串其他的类型都是依靠expire设置过期时间。如果不设置过期时间就是永不过期。
三种过期策略:
策略 | 说明 | 优点 | 缺点 |
定时删除 | 在设置key的时候设置一个定时器为key,当到期时删除key | 保证尽快释放内存 | key多cpu占用多,影响性能 |
惰性删除 | key过期的时候不删除,获取的时候检查key是否过期,若过期则删除,返回null | 占用cpu少 | 大量key过期不删除,内存泄露会发生 |
定期删除 | 每隔一段时间删除过期key的操作 | 能有效降低cpu的占用和惰性删除的缺点 | 内存不如定时删除,cpu不如惰性删除 |
redis采用的惰性删除和定期删除的组合策略。
RDB和AOF对过期key都会有个判断的操作,所以过期key对持久化无影响。
5.第五问:redis分布式锁和队列:
redis的分布式锁之前setnx,先加锁再加过期时间,但是新版本中增加了原子锁:commands.set(Constant.前缀+ “:” + key, “1”, “NX”, “EX”, expireSecond);NX/EX实现分布式原子锁,防止两死锁的发生。
异步队列:就像我上面提到的就是使用list类型实现,lpush进行生产消息,lpop进行消费消息。当然这种队列只适合简单的队列场景,涉及到过期队列并发高等还是应该使用mq。
6.第六问:redis针对缓存穿透、击穿、雪崩的解决方案:
名词 | 说明 | 解决 |
穿透 | 存在则缓存返回,不存在则查询db,恶意查询不存在的key对后端压力增大就叫穿透 | 查询为空的时候缓存下,查询以后更新缓存,过滤key |
击穿 | 缓存中没有数据库中有,穿透是数据库中也可能没有 | 设置热点key永不过期,加互斥锁,保证第一个访问去数据库查询数据,其他的都是走缓存空 |
雪崩 | 缓存服务器重启或者大量缓存失效,都去访问数据库,引起压力过大 | key的过期时间分布均匀 ,避免短时间大量key过期,加锁避免并发并发量大访问控制流量 |
总结
上面总的来说把redis整个的面试涉及到的点进行了一个总结,一些地方可能说的不是很细,如果需要了解的更细,可以有针对性的去查阅资料,如果有问题交流的话,也可以关注我的公众号:Java时间屋 交流。
相关推荐
- Redis合集-使用benchmark性能测试
-
采用开源Redis的redis-benchmark工具进行压测,它是Redis官方的性能测试工具,可以有效地测试Redis服务的性能。本次测试使用Redis官方最新的代码进行编译,详情请参见Redis...
- Java简历总被已读不回?面试挂到怀疑人生?这几点你可能真没做好
-
最近看了几十份简历,发现大部分人不是技术差,而是不会“卖自己”——一、简历死穴:你写的不是经验,是岗位说明书!反面教材:ד使用SpringBoot开发项目”ד负责用户模块功能实现”救命写法:...
- redission YYDS(redission官网)
-
每天分享一个架构知识Redission是一个基于Redis的分布式Java锁框架,它提供了各种锁实现,包括可重入锁、公平锁、读写锁等。使用Redission可以方便地实现分布式锁。red...
- 从数据库行锁到分布式事务:电商库存防超卖的九重劫难与破局之道
-
2023年6月18日我们维护的电商平台在零点刚过3秒就遭遇了严重事故。监控大屏显示某爆款手机SKU_IPHONE13_PRO_MAX在库存仅剩500台时,订单系统却产生了1200笔有效订单。事故复盘发...
- SpringBoot系列——实战11:接口幂等性的形而上思...
-
欢迎关注、点赞、收藏。幂等性不仅是一种技术需求,更是数字文明对确定性追求的体现。在充满不确定性的网络世界中,它为我们建立起可依赖的存在秩序,这或许正是技术哲学最深刻的价值所在。幂等性的本质困境在支付系...
- 如何优化系统架构设计缓解流量压力提升并发性能?Java实战分享
-
如何优化系统架构设计缓解流量压力提升并发性能?Java实战分享在高流量场景下。首先,我需要回忆一下常见的优化策略,比如负载均衡、缓存、数据库优化、微服务拆分这些。不过,可能还需要考虑用户的具体情况,比...
- Java面试题: 项目开发中的有哪些成长?该如何回答
-
在Java面试中,当被问到“项目中的成长点”时,面试官不仅想了解你的技术能力,更希望看到你的问题解决能力、学习迭代意识以及对项目的深度思考。以下是回答的策略和示例,帮助你清晰、有说服力地展示成长点:一...
- 互联网大厂后端必看!Spring Boot 如何实现高并发抢券逻辑?
-
你有没有遇到过这样的情况?在电商大促时,系统上线了抢券活动,结果活动刚一开始,服务器就不堪重负,出现超卖、系统崩溃等问题。又或者用户疯狂点击抢券按钮,最后却被告知无券可抢,体验极差。作为互联网大厂的后...
- 每日一题 |10W QPS高并发限流方案设计(含真实代码)
-
面试场景还原面试官:“如果系统要承载10WQPS的高并发流量,你会如何设计限流方案?”你:“(稳住,我要从限流算法到分布式架构全盘分析)…”一、为什么需要限流?核心矛盾:系统资源(CPU/内存/数据...
- Java面试题:服务雪崩如何解决?90%人栽了
-
服务雪崩是指微服务架构中,由于某个服务出现故障,导致故障在服务之间不断传递和扩散,最终造成整个系统崩溃的现象。以下是一些解决服务雪崩问题的常见方法:限流限制请求速率:通过限流算法(如令牌桶算法、漏桶算...
- 面试题官:高并发经验有吗,并发量多少,如何回复?
-
一、有实际高并发经验(建议结构)直接量化"在XX项目中,系统日活用户约XX万,核心接口峰值QPS达到XX,TPS处理能力为XX/秒。通过压力测试验证过XX并发线程下的稳定性。"技术方案...
- 瞬时流量高并发“保命指南”:这样做系统稳如泰山,老板跪求加薪
-
“系统崩了,用户骂了,年终奖飞了!”——这是多少程序员在瞬时大流量下的真实噩梦?双11秒杀、春运抢票、直播带货……每秒百万请求的冲击,你的代码扛得住吗?2025年了,为什么你的系统一遇高并发就“躺平”...
- 其实很多Java工程师不是能力不够,是没找到展示自己的正确姿势。
-
其实很多Java工程师不是能力不够,是没找到展示自己的正确姿势。比如上周有个小伙伴找我,五年经验但简历全是'参与系统设计''优化接口性能'这种空话。我就问他:你做的秒杀...
- PHP技能评测(php等级考试)
-
公司出了一些自我评测的PHP题目,现将题目和答案记录于此,以方便记忆。1.魔术函数有哪些,分别在什么时候调用?__construct(),类的构造函数__destruct(),类的析构函数__cal...
- 你的简历在HR眼里是青铜还是王者?
-
你的简历在HR眼里是青铜还是王者?兄弟,简历投了100份没反应?面试总在第三轮被刷?别急着怀疑人生,你可能只是踩了这些"隐形求职雷"。帮3630+程序员改简历+面试指导和处理空窗期时间...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)