《Redis面试题.docx》由会员分享,可在线阅读,更多相关《Redis面试题.docx(45页珍藏版)》请在第一文库网上搜索。
1、一适合的场景Redis使用场景不适合的场景或霭鬻祟镶畛职小助手Redis面试题1、谈下你对Redis的了解?Redis (全称:Remote Dictionary Server远程字典服务)是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的APIo2、Redis 一般都有哪些使用场景?- 缓存- 排行榜- 计数器质速器(统计在线人数/浏览量/播放量)- 好友关系(点赞/共同好友)- 简单的消息队列(订阅发布)Session服务器Redis适合的场景1.缓存:减轻MySQL的查询压力,提升系统性能;2.3.排行榜:利用Redis
2、的SortSet (有序集合)实现;4.5.计算器/限速器:利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等。这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;6.7.好友关系:利用集合的一些命令,比如求交集、并集、差集等。可以方便解决一些共同好友、共同爱好之类的功能;8.9.消息队列:除了 Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用L
3、ist来完成异步解耦;10.11.Session共享:Session是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息。12.Redis不适合的场景数据量太大、数据访问频率非常低的业务都不适合使用Redis,数据太大会增加成木,访问频率太低,保存在内存中纯属浪费资源。3、Redis有哪些常见的功能?1.数据缓存功能2.3.分布式锁的功能4.5.支持数据持久化6.支持事务7.9.支持消息队列10.4、Redis支持的数据类型有哪些?1. string字符串
4、字符串类型是Redis最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的。字符串类型实际上可以是字符串:简单的字符串、XML、JSON;数字:整数、浮点数;二进制:图片、音频、视频。使用场景:缓存、计数器、共享Session、限速。2. Hash (哈希)在 Redis中哈希类型是指键本身是一种键值对结构,如value=f i eldl,valuel),f i eldN, valueN)使用场景:哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。所以常常用于用户信息等管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,而关系型数据库是
5、完全结构化的,关系型数据库可以做复杂的关系查询,而Redis去模拟关系型复杂查询开发困难且维护成本高。3. List (列表)列表类型是用来储存多个有序的字符串,列表中的每个字符串成为元素,一个列表最多可以储存2-32 - 1个元素,在Redis中,可以队列表两端插入和弹出,还可以获取指定范围的元素列表、获取指定索引下的元素等,列表是一种比较灵活的数据结构,它可以充当栈和队列的角色。使用场景:Redis的Ipush + brpop命令组合即可实现阻塞队列,生产者客户端是用Ipush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡
6、和高可用性。4. Set (集合)集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中不允许有重复的元素,并且集合中的元素是无序的,不能通过索引下标获取元素,Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。合理的使用好集合类型,能在实际开发中解决很多实际问题。使用场景:如:一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及曾强用户粘度比较重要。5. zset (sorted set:有序集合)有序集合和集合有着必然的联系,它保留了集合不能有重复成员的特
7、性,但不同得是,有序集合中的元素是可以排序的,但是它和列表的使用索引下标作为排序依据不同的是:它给每个元素设置一个分数,作为排序的依据。使用场景:排行榜是有序集合经典的使用场景。例如:视频网站需要对用户上传的文件做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。5、Redis为什么这么快?1.完全基于内存,绝大部分请求是纯粹的内存操作,非常快速;2.3.数据结构简单,对数据操作也简单;4.5.采用单线程,避免了不必要的卜.下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可.能出现死锁而导致的性能消耗
8、;6.1.使用多路I/O复用模型,非阻塞10。8.6、什么是缓存穿透?怎么解决?缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。解决办法:1、缓存空对象:如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。缓存空对象带来的问题:1.空值做了缓存,意味着缓存中存了更多的键,需要更多的内存空间,比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。2.3.缓存和存储的数据会有一段时间窗口的不一
9、致,可能会对业务有一定影响。例如:过期时间设置为5分钟,如果此时存储添加了这个数据,那此段时间就会出现缓存和存储数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。2、布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。7、什么是缓存雪崩?该如何解决?如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。解决办法:1.加锁排队:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线
10、程等待;2.3.数据预热:可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀;5.做二级缓存,或者双缓存策略:Cachel为原始缓存,Cache2为拷贝缓存,Cachel失效时,可以访问Cache2, Cachel缓存失效时间设置为短期,Cache2设置为长期。6.7.在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。8.8、怎么保证缓存和数据库数据的一致性?从理论上说,只要我们设置了合理的键的过期时间,我们就能保证缓存和数据库的数据最终是一致的。因为只要缓存数据过期了,就
11、会被删除。随后读的时候,因为缓存里没有,就可以查数据库的数据、然后将数据库查出来的数据写入到缓存中。除了设置过期时间,我们还需要做更多的措施来尽量避免数据库与缓存处于不一致的情况发生。9.10.新增、更改、删除数据库操作时同步更新Redis,可以使用事物机制来保证数据的一致性。4.9、Redis持久化有几种方式?持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。Redis提供了两种持久化方式:RDB (默认)和A0FoRDBRDB是Redis DataBase的缩写。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即Snapshot快照存储,对应产生的数据文
12、件为dump, rdb,通过配置文件中的save参数来定义快照的周期。核心函数:rdbSave(生成RDB文件)和rdbLoad (从文件加载内存)两个函数。rdbSave内存中的数据对象磁盘中的RDB文件-rdbLoadA0FA0F是Append-only file的缩写。Redis会将每一个收到的写命令都通过Write函数追加到文件最后,类似丁 MySQL的binlogo当Red is重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。每当执行服务器(定时)任务或者函数时,flushAppendOnlyFile函数都会被调用,这个函数执行以下两个工作:WRITE:根据条件
13、,将aof_buf中的缓存写入到AOF文件;SAVE:根据条件,调用fsync或fdatasync函数,将AOF文件保存到磁盘中。RDB和AOF的区别:1.AOF文件比RDB更新频率高,优先使用AOF还原数据;2.3.AOF比RDB更安全也更大;4.5.RDB性能比AOF好;#.7.如果两个都配了优先加载AOFo10、Redis怎么实现分布式锁?Redis为单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。Redis中可以使用SETNX命令实现分布式锁。一般使用setnx (set if not exists)指令,只允许被一个程序占有,使用完调用d
14、el释放锁。11、Redis内存淘汰策略有哪些?1.volat i le-lru:从已设置过期时间的数据集(server, db i. expires )中挑选最近最少使用的数据淘汰;2.3.volat i le-ttl :从已设置过期时间的数据集(server, db i. expires )中挑选将要过期的数据淘汰。4.5.volat i le-random:从已设置过期时间的数据集(server, db i. expires )中任意选择数据淘汰。#.7.allkeys-lru:从数据集(server. dbi. diet)中挑选最近最少使用的数据淘汰。8.9.allkeys-random:从数据集(server. dbi. diet)中任意选择数据淘汰。10.11.no-enviction (驱逐):禁止驱逐数据。12.12、Redis常见性能问题和解决方案?1.Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件。如果数据比较重要,某