45.Redis面试怎么面?(redis面试常见问题)
mhr18 2024-10-30 02:41 22 浏览 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时间屋 交流。
相关推荐
- 一文带您了解数据库的行列之争:行式与列式存储的异同
-
数据库存储格式是数据库管理系统中一个至关重要的方面,它直接影响到数据的组织和检索效率。在数据库中,有两种主要的存储格式,即行式存储和列式存储。这两者采用截然不同的方法来组织和存储数据,各自具有一系列优...
- NL2SQL(三)开源项目怎么选:talk is cheap, show me the code!
-
老规矩,先看效果下面的demo来自试用的SuperSonic,将会在下面详细介绍:大模型时代Text-to-SQL特点随着基于LLM技术的发展,RAG/AIAgent/Fine...
- JDK25长期支持版九月降临:18项王炸功能全解析
-
Java要放大招啦!9月份推出的JDK25长期支持版已经锁定18个超能力,从稳定值到结构化并发,还有Linux系统下的"预知未来"性能分析!下面我用打游戏的术语给你们掰扯明白:1、飞...
- OceanBase 推出单机版 高度兼容MySQL和Oracle
-
【环球网科技综合报道】3月27日,独立数据库厂商OceanBase正式发布单机版产品。据悉,这一产品基于自主研发的单机分布式一体化架构设计,具备极简数据库架构和高度兼容性,为中小规模业务提供兼具性能与...
- 黄远邦:应对7月1日闰秒对Oracle数据库影响
-
由于今年7月1日全世界会多出一秒,这可能对时间敏感的IT系统造成较大影响。中亦科技数据库团队对此问题做了深入的研究,并对用户系统提出了相应的解决方法及建议。中亦科技数据库产品总监黄远邦认为,闰秒调整会...
- MySQL数据库密码忘记了,怎么办?(mysql 数据库密码)
-
#头条创作挑战赛#MySQL数据库密码忘记了且没有其他可以修改账号密码的账户时怎么办呢?登录MySQL,密码输入错误/*密码错误,报如下错误*/[root@TESTDB~]#mysql-u...
- Chinese AI Talent in Spotlight as Nvidia and Meta Escalate Talent War
-
OntherightisBanghuaZhu,ChiefResearchScientistatNVIDIATMTPOST--SiliconValley’stoptech...
- 用Cursor开启JAVA+AI生涯(javascirpt怎么开启)
-
Cursor是基于VSCode开发的一款编辑器,支持多种语言的开发编辑。与传统的开发工具相比,它有多种优势:与AI无缝集成,响应速度快,占用内存小。但很多同学在"起步"过程中遇到了...
- 毕业十年了,自从做了开发用了很多软件,但距离写开发工具还很远
-
办公系统类:办公软件Word、Excel、PowerPoint三大必备技能+腾讯/金山在线文档解压缩操作:7-zip/winrar文件文本处理:Notepad++(文本编辑器正则表达式超级好...
- 盘点Java中最没用的知识⑤:这3个老古董你还在代码里“考古”?
-
一、Stack类:“继承Vector”的历史bug,为何成了性能拖油瓶?你是不是在学Java集合时,老师说过“栈结构用Stack类”?是不是在老代码里见过"newStack<>(...
- Gemini 2.5 Pro 0506发布,编程最强大模型, 碾压 Claude3.7 sonnent
-
一、Gemini2.5Pro(I/Oedition)发布1、为何叫I/Oedition?谷歌史上最强编程模型Gemini2.5Pro(I/Oedition)发布,具体型号是Gemin...
- 如何让无聊变得有趣(附本人大量美图)
-
文/图:金冬成在这条长300公里的公路上,我已经来回往返了无数次。3小时车程,一个人,想想都是多么无聊的一件事。其实,人生道路上,类似这种无聊的事情有很多很多。无聊的事情、枯燥的工作,往往让我们容易失...
- Oracle 推出 Java 24,增强 AI 支持和后量子加密
-
导读:Oracle宣布正式发布Java24,该语言增加了几个新功能,例如StreamGatherersAPI和Class-FileAPI的可用性,以及专门为AI推理和量子安全设计...
- 公司ERP突然变慢?“索引重建”这颗“药”可不能随便吃!
-
各位老板、IT小哥、财务小姐姐,有没有遇到过公司ERP系统突然卡顿得像“老爷车”,点个按钮半天没反应,急得直跺脚?这时候,可能有人会跳出来说:“我知道,重建一下数据库索引就好了!”听起来像个“神操作”...
- 基于Java实现,支持在线发布API接口读取数据库,有哪些工具?
-
基于java实现,不需要编辑就能发布api接口的,有哪些工具、平台?还能一键发布、快速授权和开放提供给第三方请求调用接口的解决方案。架构方案设计:以下是一些基于Java实现的无需编辑或只需少量编辑...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 一文带您了解数据库的行列之争:行式与列式存储的异同
- NL2SQL(三)开源项目怎么选:talk is cheap, show me the code!
- JDK25长期支持版九月降临:18项王炸功能全解析
- OceanBase 推出单机版 高度兼容MySQL和Oracle
- 黄远邦:应对7月1日闰秒对Oracle数据库影响
- MySQL数据库密码忘记了,怎么办?(mysql 数据库密码)
- Chinese AI Talent in Spotlight as Nvidia and Meta Escalate Talent War
- 用Cursor开启JAVA+AI生涯(javascirpt怎么开启)
- 毕业十年了,自从做了开发用了很多软件,但距离写开发工具还很远
- 盘点Java中最没用的知识⑤:这3个老古董你还在代码里“考古”?
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- 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)