Redis—校招、实习常见面试题汇总

1.redis  缓存穿透,缓存雪崩,缓存击穿
(1)缓存穿透
缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。
(2)缓存雪崩
缓存雪崩,是指在某一个时间段,缓存集中过期失效。
产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。
(3)缓存击穿
缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

2.Redis 和 MemeCache 有什么区别?
1)、存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性。 2)、数据支持类型 Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。 3)、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

3.Redis 为什么是单线程的?
因为redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

4.什么是缓存穿透?怎么解决?

5.Redis 支持的数据类型有哪些?
1.redis的5种数据类型: string 字符串(可以为整形、浮点型和字符串,统称为元素) list 列表(实现队列,元素不唯一,先入先出原则) set 集合(各不相同的元素)
hash hash散列值(hash的key必须是唯一的) sort set 有序集合

6.Redis 支持的 Java 客户端都有哪些?
Redis Desktop Manager 、Redis Client、Redis Studio、jedis

7.Jedis 和 Redisson 有哪些区别?
Jedis是Redis的java实现客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务‘管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

8.怎么保证缓存和数据库数据的一致性?
由于数据库层面的读写并发,引发的数据库与缓存数据不一致的问题(本质是后发生的读请求先返回了),可能通过两个小的改动解决:(1)修改服务Service连接池,id取模选取服务连接,能够保证同一个数据的读写都落在同一个后端服务上(2)修改数据库DB连接池,id取模选取DB连接,能够保证同一个数据的读写在数据库层面是串行的

9.Redis 持久化有几种方式?
Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。

10.Redis 怎么实现分布式锁?
Redis的实现主要基于setnx 和给予一个超时时间(防止释放锁失败)。 多个尝试获取锁的客户端使用同一个key做为目标数据的唯一键,value为锁的期望超时时间点; 首先进行一次setnx命令,尝试获取锁,如果获取成功,则设置锁的最终超时时间(以防在当前进程获取锁后奔溃导致锁无法释放)这里利用 Redis set key 时的一个 NX 参数可以保证在这个 key 不存在的情况下写入成功。并且再加上 EX 参数可以让该 key 在超时之后自动删除。一定不要把两个命令(NX EX)分开执行,如果在 NX 之后程序出现问题就有可能产生死锁。非阻塞锁、阻塞锁、解锁、为了更好的健壮性,将该操作封装为一个lua脚本,这样即可保证其原子性 redis分布式的实现原理:
1、通过setNX操作,如果存在key,不操作;不存在,才会set值,保证锁的互斥性2、value设置锁的到期时间,当锁超时时,进行getAndSet操作,先get旧值,再set新值,避免发生死锁。这里也可以通过设置key的有效期来避免死锁,但是setNx和exprise(设置有效期)操作非原子性,可能发生锁没有设置有效时间的问题,从而发生死锁。实现:spring boot 通过jdeis连接redsi集群。
加锁过程:
1、获得当前系统时间,计算锁的到期时间
2、setNx操作,加锁
3、如果,加锁成功,设置锁的到期时间,返回true;取锁失败,取出当前锁的value(到期时间)
4、如果value不为空而且小于当前系统时间,进行getAndSet操作,重新设置value,并取出旧value;否则,等待间隔时间后,重复步骤2;
5、如果步骤3和4取出的value一样,加锁成功,设置锁的到期时间,返回true;否则,别人加锁成功,恢复锁的value,等待间隔时间后,重复步骤2。

11.Redis 分布式锁有什么缺陷?
在工作和网络上看到过各个版本的Redis分布式锁实现,每种实现都有一些不严谨的地方,甚至有可能是错误的实现,包括在代码中,如果不能正确的使用分布式锁,可能造成严重的生产环境故障。
redis分布式锁的缺陷

12.Redis 如何做内存优化?
1,使用对象共享池优化小整数对象。
2,数据优先使用整数,比字符串更节省空间。3,操作优化。尽量避免字符串的追加操作,因为字符串存在预分配机制。追加操作后字符串对象会分配一倍的容量作为于预留空间。4,编码优化。list,hash,set,zset尽可能使用ziplist编码。好处是内存下降,坏处是操作变慢。一般大小不超过1000。

13.Redis 淘汰策略有哪些?
redis 提供 6种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据

14.Redis 常见的性能问题有哪些?
该如何解决?1.master写内存快照,seve命令调度rdbsave函数,会阻塞主线程的工程,当快照比较大的时候对性能的影响是非常大的,会间断性暂停服务 。所以master最好不要写内存快照。2.master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响master重启时的恢复速度。master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个slave开启AOF备份数据,策略每秒为同步一次。3.master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂的服务暂停现象。4.redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,slave和master最好在同一个局域网内。

备注:感兴趣的可以关注我的公众号!可以查看更多2019年的面经和技术文章哦!

公众号:偷影子的Tronhon

CSDN:https://blog.csdn.net/qq_39213969



#春招##面试题目#
全部评论
补一个:Redis的过期策略是如何实现的
1
送花
回复
分享
发布于 2020-04-20 08:22
关于Redis的数据淘汰策略,可以从两个大的方向上去讲,一是时效性数据的删除算法,二是针对时效性数据和长期数据的八种数据逐出策略
点赞
送花
回复
分享
发布于 2020-04-19 21:50
网易互娱
校招火热招聘中
官网直投
.怎么保证缓存和数据库数据的一致性,一直无法理解,楼主能不能给点学习资料
点赞
送花
回复
分享
发布于 2020-04-19 22:57

相关推荐

5 140 评论
分享
牛客网
牛客企业服务