Redis面试题必知必会

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis面试题必知必会

 

 

什么是redis?

redis是一款内存数据库,在内存中进行数据存储,使用的场景可以有数据库,缓存,消息代理。

redis可以做什么?

缓存,众所周知的事情,提升服务器性能方面很有成效,比如把耗时长且执行结果不经常变更的sql的结果就可以做缓存处理;计数器,点赞等功能的开发,利用redis的原子性自增操作,实现用户的点赞等功能简单的消息队列,类似mq的消息发布订阅功能session共享,其实个人感觉也是缓存的一种,分布式系统中redis保存session(现在一般使用token),同一个用户在不同的机器访问不需要重新登录,只能拿到session(token)即可登录

redis不可以做什么

不能用redis当作关系数据库使用,比如保存用户信息进行持久化保存,持久化对redis服务器的压力非常大,总结就是数据量大,访问频率低的数据不适合使用redis,相反数据量小,访问频繁,或者不经常变更的数据非常适合

redis为什么这么快?

单线程模型,避免上下文切换和竞态条件基于内存纯内存操作网络层默认使用epoll解决高并发问题(非阻塞I/O多路复用机制)简单介绍下epollwiki中是这样说的,epoll是Linux内核的可扩展I/O事件通知机制,功能与poll类似,都是监听多个文件描述符上的事件,时间复杂度是O(log n),epoll 与FreeBSD的kqueue类似,底层由可配置的操作系统内核对象构建而成,并以文件描述符的形式呈现于用户空间,epoll通过使用红黑树(RB-tree)搜索被监视的文件描述符,在epoll实例上注册事件时,epoll会将该事件添加到epoll实例的红黑树上并注册一个回调函数,当事件发生时会将事件添加到就绪链表中。有关epoll的介绍就到此,更详细的深入可以自己深入学习一下

redis使用了哪些数据结构

String Hash List Set SortSetBitmaps HyperLogLogs GEO(地理信息定位)SortSet使用的数据结构?跳表的原理?
跳表基于有序链表的扩展,个人理解大白话就是,数据分层级,查找时从上往下依次查找,也就是层级越高的越优先比较,这种比较的优点就是在数据量大时可以省略很多无用的比较,快速定位。增删数据时会对数据进行抛硬币的形式进行是否往上一级节点增加变动,当大量的数据插入链表之后,上层的索引层级就会不够用,此时使用的抛硬币的方式,如果是正面就继续上移增加一个层级,假设增加一个数字,它的层级为一,此时才去抛硬币的形式,如果正面,层级+1,继续抛硬币循环,直到反面,停止抛硬币,如果是反面,直接停止增加层架,到此结束。此处redis的跳表最大层级是32,即如果一直抛硬币为正面,最大不超过32。具体的跳表原理大概理解就是这个简单的一句话。详细了解可以参考我下面的链接跳表原理参考链接https://zhuanlan.zhihu.com/p/53975333https://courses.csail.mit.edu/6.046/spring04/handouts/skiplists.pdfhttp://zhangtielei.com/posts/blog-redis-skiplist.htmlhttps://www.youtube.com/watch?v=2g9OSRKJuzM

红黑树的原理?

红黑树,是一种自平衡的二叉查找树,什么是自平衡的,我们在学习二叉树时知道,二叉树都是左子树节点值小于等于跟节点,右节点值大于等于跟节点值,左右子树也都是二叉树,下面举个例子 54 6上面这个是典型的二叉树,如果此时在这个树上面增加3,2,1,此时数就会变成这样    5   4 6  3 21    此时如果查找节点1,性能就会急剧下降,变成线性的查找,所以此时红黑树就上场了,自平衡的意思就是红黑树会自动把上面的树转换成一个平衡的二叉树红黑树的性质根节点是黑色节点是红色和黑色所有叶子是黑色(非nil节点)每个红色节点必须有两个黑色的字节点(从每个叶子到根的路径上不能有两个连续的红色节点)从任一节点到其每个叶子的简单路径都包含相同的黑色节点红黑树的旋转,自旋鉴于画图麻烦就引用一下,个人感觉写的非常不错的https://zhuanlan.zhihu.com/p/31805309

定期删除与内存淘汰策略?

定期删除与惰性删除,redis每100ms检查一次,是否存在过期key,有过期的key则删除,(redis并不是每100ms检查所有的key,而是随机进行检查)因此采用定期删除策略,会导致很多key到事件之后没有删除,于是就要使用惰性删除,即在你获取某个key的时候,redis会检查一下这个key是否设置了过期时间,如果设置了过期时间并过期了此时就会删除采用了定期删除与惰性删除还会有个问题,就是定期删除一直存在删除不到的key,然后也一直没有请求获取key,也就是惰性删除没有触发,此时就要使用到redis的内存淘汰机制# maxmemory-policy volatile-lru支持策略,当内存不足容纳新数据时,采用下列策略noeviction: 写入数据请求报错(del请求和部分请求除外)allkeys-lru: 在键空间中移除最近最少使用的keyallkeys-random: 在键空间中随机移除某个keyvolatile-lru: 在设置了过期时间的键空间中移除最近最少使用的keyvolatile-random: 在设置了过期时间的键空间中随机移除某个keyvolatile-ttl: 在设置了过期时间的键空间中移除更早过期时间的key当使用了volatile-lru,volatile-random,volatile-ttl三种策略时,如果没有key可以被淘汰,则和noeviction一样返回错误

缓存雪崩、缓存穿透如何解决?

缓存穿透:大量请求缓存中不存在的数据,导致所有的请求都怼到数据库,从而数据库异常解决:利用互斥锁,缓存失效的时候先去获取锁,得到锁了再去请求数据库,没得到锁,休息一段时间重试。另一个采用异步更新策略,无论key是否取到值都直接更新,value值维护一个过期时间,缓存如果过期,异步一个线程就去获取数据并更新缓存,(系统启动前需要做缓存预热)。最后一个采用布隆过滤器,内部维护一系列合法的key,能够迅速判断出请求是否合法,如果不合法直接返回。缓存雪崩:同一时间大面积的缓存失效,此时又来一波请求直接打到数据库上,导致数据库连接异常解决:给缓存失效时间加一个随机值,避免集体失效。使用双缓存,缓存a和缓存b,缓存a设置失效时间20分钟,b不设置过期时间,自己做缓存预热功能。从缓存a直接读取数据,有就直接返回,没有就去缓存b读取,并异步一个线程,同时更新缓存a和缓存b



 

 

 

 

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
存储 NoSQL Java
可能是最漂亮的Redis面试基础详解
我是南哥,相信对你通关面试、拿下Offer有所帮助。敲黑板:本文总结了Redis基础最常见的面试题!包含了Redis五大基本数据类型、Redis内存回收策略、Redis持久化等。相信大部分Redis初学者都会忽略掉一个重要的知识点,Redis其实是单线程模型。我们按直觉来看应该是多线程比单线程更快、处理能力更强才对,比如单线程一次只可以做一件事情,而多线程却可以同时做十件事情。但Redis却可以做到每秒万级别的处理能力,主要是基于以下原因:(1)Redis是基于内存操作的,Redis所有的数据库状态都保存在
可能是最漂亮的Redis面试基础详解
|
25天前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
1月前
|
NoSQL 算法 Redis
Redis面试篇
Redis面试篇
34 5
|
1月前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
33 1
|
12天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
2月前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
1月前
|
NoSQL Redis
redis 的 key 过期策略是怎么实现的(经典面试题)超级通俗易懂的解释!
本文解释了Redis实现key过期策略的方式,包括定期删除和惰性删除两种机制,并提到了Redis的内存淘汰策略作为补充,以确保过期的key能够被及时删除。
50 1
|
2月前
|
缓存 监控 NoSQL
阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略
大家好,我是 V 哥。粉丝小 A 面试阿里时被问到 Redis 的内存淘汰策略问题,特此整理了一份详细笔记供参考。Redis 的内存淘汰策略决定了在内存达到上限时如何移除数据。希望这份笔记对你有所帮助!欢迎关注“威哥爱编程”,一起学习与成长。
|
30天前
|
缓存 NoSQL 算法
面试题:Redis如何实现分布式锁!
面试题:Redis如何实现分布式锁!
|
3月前
|
缓存 NoSQL Redis
redis常见面试题总结(上)
Redis 提升读写性能,减少 MySQL 请求。优点包括:内存存储加速数据获取,支持多样数据结构如哈希和有序集合,事务确保操作原子性,具备队列、主从复制及持久化功能。相较于 Memcache,Redis 数据类型更丰富,支持数据持久化与恢复,单值大小可达 512MB。其单线程设计基于 C 语言实现,使用非阻塞 IO 复用来高效处理请求。主从同步机制确保数据一致性,首次同步需生成 RDB 文件。事务虽保证命令序列化执行但不支持回滚。Bigkey 会增加网络负载并可能导致内存不平衡。缓存雪崩、穿透等问题可通过分散过期时间和布隆过滤器解决。缓存预热则预先填充热点数据。
36 0

热门文章

最新文章

下一篇
无影云桌面