首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
澳柯玛鼠鼠
无 Java
关注
已关注
取消关注
Redis 面试题
@敲代码的帅哥:
redis面试题总结(附答案)
一、Redis是什么?Redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string、list、set、zset(sorted set --有序集合)和hash。这些数据结构都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中,Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。二、Redis都有哪些使用场景?Redis是基于内存的nosql数据库,可以通过新建线程的形式进行持久化,不影响Redis单线程的读写操作通过list取最新的N条数据模拟类似于token这种需要设置过期时间的场景发布订阅消息系统定时器、计数器三、Redis有哪些功能?1、基于本机内存的缓存当调用api访问数据库时,假如此过程需要2秒,如果每次请求都要访问数据库,那将对服务器造成巨大的压力,如果将此sql的查询结果存到Redis中,再次请求时,直接从Redis中取得,而不是访问数据库,效率将得到巨大的提升,Redis可以定时去更新数据(比如1分钟)。2、如果电脑重启,写入内存的数据是不是就失效了呢,这时Redis还提供了持久化的功能。3、哨兵(Sentinel)和复制Sentinel可以管理多个Redis服务器,它提供了监控、提醒以及自动的故障转移功能;复制则是让Redis服务器可以配备备份的服务器;Redis也是通过这两个功能保证Redis的高可用;4、集群(Cluster)单台服务器资源总是有上限的,CPU和IO资源可以通过主从复制,进行读写分离,把一部分CPU和IO的压力转移到从服务器上,但是内存资源怎么办,主从模式只是数据的备份,并不能扩充内存;现在我们可以横向扩展,让每台服务器只负责一部分任务,然后将这些服务器构成一个整体,对外界来说,这一组服务器就像是集群一样。四、Redis支持的数据类型有哪些?字符串hashlistsetzset五、Redis取值存值问题1、先把Redis的连接池拿出来JedisPool pool = new JedisPool(new JedisPoolConfig(),"127.0.0.1"); Jedis jedis = pool.getResource();2、存取值jedis.set("key","value");jedis.get("key");jedis.del("key");//给一个key叠加valuejedis.append("key","value2");//此时key的值就是value + value2;//同时给多个key进行赋值:jedis.mset("key1","value1","key2","value2");3、对map进行操作Map<String,String> user = new HashMap();user.put("key1","value1");user.put("key2","value2");user.put("key3","value3");//存入jedis.hmset("user",user);//取出user中key1 List<String> nameMap = jedis.hmget("user","key1");//删除其中一个键值jedis.hdel("user","key2");//是否存在一个键jedis.exists("user");//取出所有的Map中的值:Iterator<String> iter = jedis.hkeys("user").iterator();while(iter.next()){ jedis.hmget("user",iter.next());}六、Redis为什么是单线程的?代码更清晰,处理逻辑更简单;不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题;不存在多线程切换而消耗CPU;无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善;七、Redis真的是单线程的吗?Redis6.0之前是单线程的,Redis6.0之后开始支持多线程;redis内部使用了基于epoll的多路服用,也可以多部署几个redis服务器解决单线程的问题;redis主要的性能瓶颈是内存和网络;内存好说,加内存条就行了,而网络才是大麻烦,所以redis6内存好说,加内存条就行了;而网络才是大麻烦,所以redis6.0引入了多线程的概念,redis6.0在网络IO处理方面引入了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的。八、Redis持久化有几种方式?redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。九、Redis和 memecache 有什么区别?1、Redis相比memecache,拥有更多的数据结构和支持更丰富的数据操作。(1)Redis支持key-value,常用的数据类型主要有String、Hash、List、Set、Sorted Set。(2)memecache只支持key-value。2、内存使用率对比,Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于memecache。3、性能对比:Redis只使用单核,memecache使用多核。4、Redis支持磁盘持久化,memecache不支持。Redis可以将一些很久没用到的value通过swap方法交换到磁盘。5、Redis支持分布式集群,memecache不支持。十、Redis支持的 java 客户端都有哪些?Redisson、Jedis、lettuce 等等,官方推荐使用 Redisson。十一、jedis 和 redisson 有哪些区别?Jedis 和 Redisson 都是Java中对Redis操作的封装。Jedis 只是简单的封装了 Redis 的API库,可以看作是Redis客户端,它的方法和Redis 的命令很类似。Redisson 不仅封装了 redis ,还封装了对更多数据结构的支持,以及锁等功能,相比于Jedis 更加大。但Jedis相比于Redisson 更原生一些,更灵活。十二、什么是缓存穿透?怎么解决?1、缓存穿透一般的缓存系统,都是按照key去缓存查询,如果不存在对用的value,就应该去后端系统查找(比如DB数据库)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。2、怎么解决?对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert之后清理缓存。对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该Bitmap过滤。3、缓存雪崩当缓存服务器重启或者大量缓存集中在某一时间段失效,这样在失效的时候,会给后端系统带来很大的压力,导致系统崩溃。4、如何解决?在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其它线程等待;做二级缓存;不同的key,设置不同的过期时间,让缓存失效的时间尽量均匀;十三、怎么保证缓存和数据库数据的一致性?1、淘汰缓存数据如果为较为复杂的数据时,进行缓存的更新操作就会变得异常复杂,因此一般推荐选择淘汰缓存,而不是更新缓存。2、选择先淘汰缓存,再更新数据库假如先更新数据库,再淘汰缓存,如果淘汰缓存失败,那么后面的请求都会得到脏数据,直至缓存过期。假如先淘汰缓存再更新数据库,如果更新数据库失败,只会产生一次缓存穿透,相比较而言,后者对业务则没有本质上的影响。3、延时双删策略如下场景:同时有一个请求A进行更新操作,另一个请求B进行查询操作。请求A进行写操作,删除缓存请求B查询发现缓存不存在请求B去数据库查询得到旧值请求B将旧值写入缓存请求A将新值写入数据库次数便出现了数据不一致问题。采用延时双删策略得以解决。public void write(String key,Object data){ redisUtils.del(key); db.update(data); Thread.Sleep(100); redisUtils.del(key);}这么做,可以将1秒内所造成的缓存脏数据,再次删除。这个时间设定可根据俄业务场景进行一个调节。4、数据库读写分离的场景两个请求,一个请求A进行更新操作,另一个请求B进行查询操作。请求A进行写操作,删除缓存请求A将数据写入数据库了,请求B查询缓存发现,缓存没有值请求B去从库查询,这时,还没有完成主从同步,因此查询到的是旧值请求B将旧值写入缓存数据库完成主从同步,从库变为新值依旧采用延时双删策略解决此问题。十四、Redis,什么是缓存穿透?怎么解决?1、缓存穿透一般的缓存系统,都是按照key去缓存查询,如果不存在对用的value,就应该去后端系统查找(比如DB数据库)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。2、怎么解决?对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert之后清理缓存。对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该Bitmap过滤。3、缓存雪崩当缓存服务器重启或者大量缓存集中在某一时间段失效,这样在失效的时候,会给后端系统带来很大的压力,导致系统崩溃。4、如何解决?在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其它线程等待;做二级缓存;不同的key,设置不同的过期时间,让缓存失效的时间尽量均匀;十五、Redis怎么实现分布式锁?使用Redis实现分布式锁redis命令:set users 10 nx ex 12 原子性命令//使用uuid,解决锁释放的问题@GetMappingpublic void testLock() throws InterruptedException { String uuid = UUID.randomUUID().toString(); Boolean b_lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 10, TimeUnit.SECONDS); if(b_lock){ Object value = redisTemplate.opsForValue().get("num"); if(StringUtils.isEmpty(value)){ return; } int num = Integer.parseInt(value + ""); redisTemplate.opsForValue().set("num",++num); Object lockUUID = redisTemplate.opsForValue().get("lock"); if(uuid.equals(lockUUID.toString())){ redisTemplate.delete("lock"); } }else{ Thread.sleep(100); testLock(); }}备注:可以通过lua脚本,保证分布式锁的原子性。十六、Redis分布式锁有什么缺陷?Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。Redis容易产生的几个问题:锁未被释放B锁被A锁释放了数据库事务超时锁过期了,业务还没执行完Redis主从复制的问题十七、Redis如何做内存优化?1、缩短键值的长度缩短值的长度才是关键,如果值是一个大的业务对象,可以将对象序列化成二进制数组;首先应该在业务上进行精简,去掉不必要的属性,避免存储一些没用的数据;其次是序列化的工具选择上,应该选择更高效的序列化工具来降低字节数组大小;以JAVA为例,内置的序列化方式无论从速度还是压缩比都不尽如人意,这时可以选择更高效的序列化工具,如: protostuff,kryo等2、共享对象池对象共享池指Redis内部维护[0-9999]的整数对象池。创建大量的整数类型redisObject存在内存开销,每个redisObject内部结构至少占16字节,甚至超过了整数自身空间消耗。所以Redis内存维护一个[0-9999]的整数对象池,用于节约内存。 除了整数值对象,其他类型如list,hash,set,zset内部元素也可以使用整数对象池。因此开发中在满足需求的前提下,尽量使用整数对象以节省内存。3、字符串优化4、编码优化5、控制key的数量
点赞 13
评论 2
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
不愿透露姓名的神秘牛友
09-04 16:18
面试完就被表白了?
网上投了某不知名公司,电联之后加了hr微信,面试官让我自我介绍,又问了我一些简历项目、实习之类的,我也一一回答了,后面询问了一下公司的基础情况、加班不加班以及薪资情况。hr也介绍了一下他们公司的福利待遇信息,我感觉还比较适合我就去面试了面试过程才是最抓马的,我问面试官岗位具体的工作内容,总觉得他说的模模糊糊的,一直说这么多公司,我会来到他们公司面试,和他多么多么有缘之类的,还说原本以我的简历进他们公司有点勉强,但是如果进入他的部门的话会积极帮我沟通(他是一个部门小组长)期间还一直问我住哪,还问我是不是单身,对未来另一半的想法是什么?我以为是出于对我稳定性的考虑我就说了后面感觉不对劲,面试面了1...
职场水母:
友友应该是个女孩子吧
,在外一定要保护好自己,面试也是(不过还是太离谱了,有这么不专业的面试官),这家公司还是不要再考虑了,风气不正,换下家吧,不然上班还要面对添购的视🗡,会很不自在的
我的秋招日记
点赞
评论
收藏
分享
09-03 15:00
江苏科技大学 汽车设计
小米三面
二面面完了,不知道有没有三面。说让我等通知,是要泡池子了还是要给我拒了
点赞
评论
收藏
分享
08-16 18:34
成都理工大学 机械设计/制造
求大佬帮忙看看简历,投了的都挂了
26双非本科,机械设计╱制造,结构设计
点赞
评论
收藏
分享
07-23 03:19
已编辑
黄冈师范学院 后端工程师
现在Java实习这么难找吗,想过难,没想到这么难
各位大牛帮忙拷打拷打简历[流泪][流泪][流泪][流泪]唉,破二本巨尴尬,高不成,低不就,项目经历有,实习经历有,获奖也有,专业课有名列前茅有奖学金和评优,boss投快一千了,几乎都石沉大海,啥也没有[捂脸][捂脸][捂脸]
想中彩票的垂耳兔上岸...:
30个小时硬座来回西藏你是想表达啥😅
点赞
评论
收藏
分享
09-04 15:13
已编辑
门头沟学院 后端工程师
小红书秋招一面
1. 自我介绍2. 拷打项目3. Redis使用场景、Redis数据结构、部署方式、Redis哨兵模式原理4. MySQL与ES的核心差异、搜索索引优化内容、压测工具、项目核心难点5. MQ使用场景、原理6. JVM运行时数据区域有哪些?7. 常见垃圾回收算法及各自区别与优点8. Java线程池核心参数9. 线程池拒绝策略有哪些?10. 手撕 全排列,时间复杂度
瞒着老板找实习:
商业技术戴眼镜的面试官吧 大部分题都是一样的
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
秋招邪修秘籍
3.3W
2
...
面试问题--介绍一下你的项目吧--邪修框架
3.0W
3
...
美团秋招java后端面经,已意向
8410
4
...
找工作,不要死脑筋
7127
5
...
美团二面oc面经
6307
6
...
美团笔试
6256
7
...
小米20250906后端笔试
4852
8
...
虾皮shopee意向
4126
9
...
总结一下踩坑过的面试忌讳
4032
10
...
美团一面凉经-冷门八股狂轰滥炸 1h
3634
创作者周榜
更多
正在热议
更多
#
一起聊字节
#
27548次浏览
201人参与
#
邪修秋招思路
#
22069次浏览
639人参与
#
开立医疗秋招
#
36209次浏览
190人参与
#
发面经攒人品
#
153458次浏览
2979人参与
#
周六调休日,你打算几点下班?
#
14322次浏览
71人参与
#
工作后,谈恋爱还和学生时代一样吗?
#
18506次浏览
209人参与
#
我的秋招日记
#
375164次浏览
5618人参与
#
秋招有哪些公司要求提前实习
#
12733次浏览
73人参与
#
运营面经
#
127993次浏览
1297人参与
#
考研可以缓解求职焦虑吗
#
56986次浏览
487人参与
#
产品每日一题
#
55415次浏览
597人参与
#
正在实习的你,几点下班
#
212050次浏览
1475人参与
#
速腾聚创求职进展汇总
#
37304次浏览
244人参与
#
那些我实习了才知道的事
#
227692次浏览
1765人参与
#
你遇到过哪些神仙同事
#
110804次浏览
742人参与
#
工作一周年分享
#
37187次浏览
206人参与
#
深信服求职进展汇总
#
215453次浏览
1734人参与
#
牛友们的论文几号送审
#
53120次浏览
805人参与
#
你觉得第一学历对求职有影响吗?
#
126367次浏览
813人参与
#
机械人值得去的半导体企业
#
25683次浏览
172人参与
#
听到哪句话代表面试稳了OR挂了?
#
46616次浏览
290人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务