Java面试八股-Redis
mhr18 2024-12-12 11:46 20 浏览 0 评论
问:Redis为啥这么快?
答:之所以这么快是因为以下3点:
1.Redis基于内存,内存的访问速度是磁盘的上千倍;
2.Redis是单线程事件循环和IO多路复用;
3.Redis 内置了多种优化过后的数据结构实现,性能非常高;
问:分布式缓存框架有技术选型?
答:我知道的有Mencached,Redis和Tendis。我参与过的项目中都没有用到过Mencached框架。主要还是使用Redis。腾讯也开源了一款分布式缓存框架Tendis框架。Tendis完全兼容Redis协议和Redis4.0所有数据类型,通过github提交记录来看很少更新,加上关注度并不高。所以不建议使用Tendis来作为分布式缓存框架。
问:Memcached和Redis区别和共同点?
答:
共同点:
1.都是基于内存的数据库,一般都被作为分布式缓存使用;
2.都有过期策略;
3.两者性能都非常高。
不同点:
1.Redis支持更多的数据类型(list,set,zset,hash等),Memcached只支持K/V数据类型;
2.Redis可以数据持久化到磁盘,重启时重新加载到内存中从而很好的避免数据丢失。Memcached都存储在内存中;
3.Redis在内存使用完成时候后可以将不用的数据存放到磁盘上。Memcached内存使用完了就只能抛出异常;
4.Redis支持原生集群模式,而Memcached不支持原生集群,只能依靠客户端在写入数据时候确定往哪台服务写入数据;
5.Redis使用单线程多路复用IO模型(Redis6.0引入多线程IO),而Memcached使用的是多线程非阻塞IO复用模型;
问:为啥需要使用redis缓存?
答:提高性能:将一些高频使用且不常更新的数据放入缓存中,避免查询数据提高相应速度;提高并发:Redis的QPS远高于数据,所以使用redis可以提供系统的并发。
问:Redis除了做分布式缓存外还可以做啥?
答:分布式锁,限流,消息队列
问:购物车信息使用Redis的String数据类型还是Hash?
答:购物车信息频繁变动所以建议使用hash。用户ID作为key,商品ID作为field商品数量作为value。
添加商品:往hash中添加新的field和value;
查询购物车:遍历hash;
更改商品数量:修改hash中对应的商品idfield的value;
删除商品:删除hash中对应的field;
清空购物车:直接删除对应key。
问:Redis6.0之前为啥不使用多线程?
答:
1.单线程编程容易且更容易维护;
2.Redis性能瓶颈不在CPU,主要在内存和网络;
3.多线程就会出现死锁,上下文切换等问题,性能很可能会更差。
问:Redis给缓存设置过期时间有啥用?
答:1.有效的减少内存消耗;2.有些数据需要过期。比如短信验证码,token等
问:Redis是如何判断数据是否过期?
答:Redis通过过期字典来判断数据是否过期。过期字典就是一个hash表。
问:Redis过期数据的删除策略?
答:惰性删除+定期删除
惰性删除只会在去除key数据时候才会进行过期检查。这样多cpu友好,但是会导致很多过期数据浪费内存空间;定期删除:每个一段时间会取出一批过期的key删除,这样会暂用cpu时间影响Redis服务性能。惰性删除+定期删除还是会有很多过期key没有被删除掉,这样就会有很多过期key堆积在内存中,最后内存溢出。
问:Redis内存淘汰机制?
答:Redis 提供 6 种数据淘汰策略:
1.volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
2.volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
3.volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
4.allkeys-lru(least recently used):当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)
5.allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
6.no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!
4.0 版本后增加以下两种:
7.volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰
8.allkeys-lfu(least frequently used):当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key
问:怎么保证Redis宕机后重启数据不丢失?
答:Redis可以将数据持久化到磁盘,即使服务宕机后重启后也可以恢复数据。Redis支持RDB和AOF两种持久化方式。
问:什么是RDB持久化?
答:Redis 可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。
问:创建RDB快照时候会阻塞主线程吗?
答:redis提供了两个命令来创建快照,如果使用主线程创建会阻塞主线程;如果使用子线程创建快照不会阻塞主线程(默认)。
问:什么是AOF持久化?
答:与快照持久化相比,AOF 持久化的实时性更好,因此已成为主流的持久化方案。默认情况下 Redis 没有开启 AOF方式的持久化,可以通过 appendonly 参数开启。开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到内存缓存 server.aof_buf 中,然后再根据 appendfsync 配置来决定何时将其同步到硬盘中的 AOF 文件。
appendfsync 三种不同的 AOF 持久化方式:
alway:每次数据修改是写入AOF
everysec:每秒同步一次,显示地将多个写命令同步到磁盘
no:让操作系统决定何时进行同步
问:AOF日志是如何实现的?
答:关系型数据库(如 MySQL)通常都是执行命令之前记录日志(方便故障恢复),而 Redis AOF 持久化机制是在执行完命令之后再记录日志。为啥要命令执行完后记录日志呢?避免额外的检查开销,AOF日志不会对命令语法进行检查;在命令执行完后再记录日志不会阻塞当前命令。但是也有风险:如果执行完命令服务就宕机了会导致修改丢失;可能会阻塞后续命令的执行。
问:AOF重写了解吗?
答:当 AOF 变得太大时,Redis 能够在后台自动重写 AOF 产生一个新的 AOF 文件,这个新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。
问:如何选中RDB还是AOF?
答:RDB保存的是某个时间点的数据集,文件很小,适合做数据备份和灾难恢复。RDB恢复大数据集的时候比AOF更快。但是RDB的数据安全性不如AOF,RDB没有办法秒级持久化。老版本的Redis没有办法兼容新版本的RDB文件。
问:Redis 4.0对于持久化机制做了什么优化?
答:Redis 4.0开始支持RDB和AOF混合持久化(通过aof-use-rdb-preamble开启)。如果开启了混合持久化,在AOF重写的时候会将RDB内容写到AOF开头。
问:什么是缓存穿透?
答:缓存穿透就是大量请求的key在redis和数据库都不存在,每次都都会直接请求到数据,给数据库造成巨大压力。那么有啥解决方案呢?1.缓存无效的key,但是过期时间设置得短一些。如果有人恶意攻击,每次构建不同的无效key会导致缓存大量无用key,浪费内存空间。2.布隆过滤器:判断请求的key是否在布隆过滤器中不存在,不存在直接返回。如果存在再进行后续处理。值得注意的是,布隆过滤判断存在时候会存在误判,但是判断不存在就一定不存在。
问:什么是缓存击穿?
答:热点数据在缓存中不存在或过期了,导致大量请求直接打到了数据库中。那么有啥解决方案呢?热点数据提前预热,并且设置合理的过期时间。请求数据库写入到缓存时候获取互斥锁,保证只有一个请求落到数据库上。
问:缓存穿透和缓存击穿有啥区别?
答:缓存穿透是key在缓存中不存在,在数据库也不存在;缓存击穿是指数据库存的在热点数据在缓存中过期。
问:什么是缓存雪崩?
答:缓存数据同时大面积失效,导致大量请求达到数据库导致雪崩。有啥解决方案?使用redis集群保证服务的高可用;设置不同的过期时间,避免同时过期;
问:缓存雪崩和缓存击穿的区别?
答:缓存雪崩是大面积缓存同时失效,而缓存击穿是指热点数据不存在缓存中。
- 上一篇:系统设计面试面试指北
- 下一篇:5. 用Go打造现代IM之百万消息QPS的数据库
相关推荐
- C++开发必知的内存问题及常用的解决方法-经典文章
-
1.内存管理功能问题由于C++语言对内存有主动控制权,内存使用灵活和效率高,但代价是不小心使用就会导致以下内存错误:omemoryoverrun:写内存越界odoublefree:同一块内...
- 缓存用不好,系统崩得早!10条军规让你成为缓存高手
-
凌晨三点,我被电话惊醒:“苏工!首页崩了!”监控显示:缓存命中率0%,数据库QPS10万+,线程阻塞2000+。根本原因竟是同事没加缓存!不会用缓存的程序员,就像不会刹车的赛车手——...
- 彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏
-
作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...
- Java中间件-Memcached(Java中间件大全)
-
一、知识结构及面试题目分析缓存技术的大规模使用是互联网架构区别于传统IT技术最大的地方,是整体高并发高性能架构设计中是重中之重的关键一笔,也是互联网公司比较偏好的面试题目。按照在软件系统中所处位置...
- linux内存碎片防治技术(linux内存碎片整理)
-
推荐视频:90分钟了解Linux内存架构,numa的优势,slab的实现,vmalloc原理剖析Linux内核内存分配与回收Linuxkernel组织管理物理内存的方式是buddysystem(伙...
- Redis主从架构详解(redis主从配置详细过程)
-
Redis主从架构搭建Redis主节点配置创建主节点目录(/opt/redis-master),复制redis.conf到该目录下,redis.conf配置项修改#后台启动daemonizeyes...
- 揭开CXL内存的神秘面纱(内存c1)
-
摘要:现代数据中心对内存容量的高需求促进了内存扩展和分解方面的多条创新线,其中一项获得极大关注的工作是基于ComputeeXpressLink(CXL)的内存扩展。为了更好地利用CXL,研究人员建...
- 一文彻底弄懂 TPS RPS QPS(tps cps)
-
以下是关于RPS、QPS、TPS的核心区别与关联的总结,结合实际场景和优化建议:一、核心定义与区别RPS:RequestsPerSecond每秒请求数客户端到服务器的完整请求数量Web服务...
- 用Redis的“集合”找出你和朋友的“共同关注”
-
你是不是在刷抖音、微博、小红书的时候,常常会看到这样的提示:“你和XXX有共同关注的博主/朋友”?或者当你关注了一个新的明星,系统会推荐“你的朋友YYY也关注了这位明星”?这个看似简单的功能背后,其实...
- WOT2016彭哲夫:科班出身开发者对运维人员的期许
-
“运维与开发”是老生常谈的话题,前几天和一个运维人聊天,TA说一些公司运维岗位都不公开招聘了,这让众多运维人员情何以堪?是运维的岗位真的饱和了?是找到合适的运维人才难?还是有这样那样的因素?带着这些疑...
- Java程序员最常用的20%技术总结(java程序员要掌握什么)
-
我听说编程语言,经常使用的是其中20%的技术。在Java这门语言中,这20%包括哪些内容?找到一份Java初级程序员的工作,有哪些是必须掌握的,有哪些是可以现学现卖的?一个完整的Javaweb项目,有...
- 秒杀系统实战(四)| 缓存与数据库双写一致性实战
-
前言微笑挖坑,努力填坑。————已经拥有黑眼圈,但还没学会小猪老师时间管理学的蛮三刀同学本文是秒杀系统的第四篇,我们来讨论秒杀系统中「缓存热点数据」的问题,进一步延伸到数据库和缓存的...
- 头条评论精灵翻牌子(头条评论精灵翻牌子怎么弄)
-
关于“头条评论精灵翻牌子”功能,这通常是指平台通过算法或运营手段,将用户的优质评论随机或定向推送到更显眼的位置(如信息流顶部、独立曝光位等),以提升互动率和用户参与感。以下是详细解析和建议:一、功能理...
- 15个程序员们都应该知道的大模型高级提示词指令模板和示例
-
作为程序员你如何写大模型指令?你写的指令是不是更专业呢?下面是15个程序员使用的专业的大模型指令,如果早知道可以能节省你很多时间。这些指令可以用在chatgpt,deepseek等大模型。1.一键...
- MyBatis-Plus内置的主键生成策略有大坑,要注意!
-
昨天小伙伴使用Mybaits-Plus开发的项目线上(集群、K8S)出现了主键重复问题,其报错如下:Mybatis-Plus启动时会通过com.baomidou.mybatisplus.core.to...
你 发表评论:
欢迎- 一周热门
-
-
Redis客户端 Jedis 与 Lettuce
-
高并发架构系列:Redis并发竞争key的解决方案详解
-
redis如何防止并发(redis如何防止高并发)
-
开源推荐:如何实现的一个高性能 Redis 服务器
-
redis安装与调优部署文档(WinServer)
-
Redis 入门 - 安装最全讲解(Windows、Linux、Docker)
-
一文带你了解 Redis 的发布与订阅的底层原理
-
Redis如何应对并发访问(redis控制并发量)
-
oracle数据库查询Sql语句是否使用索引及常见的索引失效的情况
-
Java SE Development Kit 8u441下载地址【windows版本】
-
- 最近发表
- 标签列表
-
- 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)