2021Java面试题合集-Redis面试题70道.pdf





《2021Java面试题合集-Redis面试题70道.pdf》由会员分享,可在线阅读,更多相关《2021Java面试题合集-Redis面试题70道.pdf(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、概述1.什么是Red is?Redis是一个使用C语言写成的,开源的高性能key-value非关系缓存数据库。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set-有序集合)和hash(哈希类型)。Red is的数据都基于缓存的,所以很快,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。Redis也可以实现数据写入磁盘中,保证了数据的安全不丢失,而且Red is的操作是原子性的。2.Redis有哪些优缺点?优点。读写性能优异,Redis能读的速度是110000次/s,写的速度是81000次/
2、s。支持数据持久化,支持AOF和RDB两种持久化方式。支持事务,Redis的所有操作都是原子性的,同时Red is还支持对几个操作合并后的原子性执行。数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。缺点。数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Red is适合的场景主要局限在较小数据量的高性能操作和运算上。Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。主机宕机,宕机前有部分
3、数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。3.使用redis有哪些好处?速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是蛰找和操作的时间复杂度都很低 (2)支持丰富数据类型,支持string,list,set,sorted set,hash(3)支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行(4)丰富的特性:可用于缓存,消息,按keyig置过期
4、时间,过期后将会自动删除4.为什么要用Redis/为什么要用缓存主要从“高性能”和“高并发 这两点来看待这个问题。高性能:。假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!高并发:。直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。5.为什么要用Redis而不用ma
5、p/guava做缓存?缓存分为本地缓存和分布式缓存。以Java为例,使用自带的m叩 或 者guava实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。使用redis或memcached之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性.缺点是需要保持redis或memcached服务的高可用,整个程序架构上较为复杂。6.Redis为什么这么快 1、完全基于内存,绝大部分请求是睇的内存操作,非常快速。数据存在内存中,类似于HashMap,HashM叩的优势就是杳找和操作
6、的时间复杂度都是0(1);2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;4、使用多路I/。复用模型,非阻塞I0;5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM机 制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;7.Redis有哪些数据类型Redis主要有5种数据类型,包括String,List,Set,Z
7、set,H a sh,满足大部分的使用要求数据类型可以存储的值操作应用场悬String字注串、整数或者浮点数List列表Set无序集合Hash包含键值对的无序教表ZSet有序集合走整个字符序或者字符品的其中一部分执行操作对 朝 和 浮 点 朝 行吕增或者皂减操作从两途压人或者理出元素有单个或者多个元素进行修鹑,艮保备一个花围内的元素添加.获取.移除单检查一个元素是否存在于集合中计算交集、并集、差集从集合里面随机获取元素添加.获取、移除单馒跳获取所有提值充检查其个整是否存在添加.获取.删除元素根据分值定围或者成员来获取元素计算一个建的排名做简单的键值对缓存存储一些列表型的数据结构,类似粉丝列表、
8、文章的评论列表之类的数据交集、并集、差集的操作,比如交集,可以把两个人的粉丝列表整一个交集结构化的数据,比如f对象去重但可以排序,如获取排名前几名的用户8.Redis的应用场景 计数器可以对String进行自增自减运算,从而实现计数器功能.Redis这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。缓存将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。会话缓存可以使用Redis来统一存储多台应用服务器的会话信息.当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。全页缓存(FPC)除基
9、本的会话token之外,Redis还提供很简便的FPC平台。以Magent。为例,Magent。提供一个插件来使用Redis作为全页缓存后端。此外,对W ordPress的用户来说,Pantheon有一个非常好的插件wp-re d is,这个插件能帮助你以最快速度加载你曾浏览过的页面。查找表例 如DNS记录就很适合使用Redis进行存储。查找表和缓存类似,也是利用了 Redis快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。消息队列(发布/订阅功能)List是一f双向链表,可以通过Ipush和rpop写入和读取消息。不过最好使用Kafka、Rabb
10、itMQ等消息中间件。分布式锁实现在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。可以使用Redis自带的SETNX命令实现分布式锁,除此之外,还可以使用官方提供的Red Lock分布式锁实现。其它Set可以实现交集、并集等操作,从而实现共同好友等功能。ZSet可以实现有序性操作,从而实现排行榜等功能。9.持久化什么是Redis持久化?持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。10.Redis的持久化机制是什么?各自的优缺点?Redis提供两种持久化机制RDB(默认)和AOF机制:RDB:是Redis DataBase缩写快照RD B是Red is默认
11、的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dum p.rdb.通过配置文件中的save参数来定义快照的周期。内存中的数据对象-rd bSav ev-rdbLoad-磁盘中的RDB文件优点:1、只有一个文件dum p.rdb,方便持久化。2、容灾性好,一个文件可以保存到安全的磁盘。3、性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是I。最大化。使用单独子进程来进行持久化,主进程不会进行任何I。操作,保证了 redis的高性能4.相对于数据集大时,比AOF的启动效率更高。缺点:1、数据安全性低。RDB是间隔一段时间进行持久化,如果持久
12、化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)2、AOF(Append-only file)持久化方式:是指所有的命令行记录以redis命令请求协议的格式完全持久化存储)保存为aof文件。AO F:持久化:AOF持久化很叫ppend Only File持久化),则是将Red is执行的每次写命令记录到单独的日志文件中,当重启Red is会重新将持久化的日志中文件恢复数据。当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复AOFI flushAppendOnlyFile 服务端;I磁盘中的AOF文 件i|优点:1、数据安全,aof持久化可以配置app
13、endfsync属性,有 alw ays,每进行一次命令操作就记录至!la o f文件中一次。2、通过append模式写文件,即使中途服务器宕机,可以通过redis-check-aof工具解决数据一致性问题。3、AOF机制的rewrite模式。AOF文件没被rewrite之 前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)缺点:1、AOF文件比RDB文件大,且恢复速度慢。2、数据集大的时候,比 rdb启动效率低。俩种持久化的优缺点是什么?。AOF文件比RDB更新频率高,优先使用AOF还原数据.。AOF比RDB更安全也更大o R D B ttA O F
14、 i?。如果两个都配了优先加载AOF11.如何选择合适的持久化方式 一般来说,如果想达到足以媲美PostgreSQL的数据安全性,你应该同时使用两种持久化功能。在这种情况下,当 Redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成RDB快 照(snapshot)非常便于进行数据库备份,并且RDB恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避
15、免AOF程序的bug。如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。12.Redis持久化数据和缓存怎么做犷容?如果Red is被当做缓存使用,使用一致性哈希实现动态扩容缩容。如果Red is被当做一个持久化存储使用,必须使用固定的1主从架构-读写分离-水平扩容支撑读高并发redis replication 的核心机制 redis采用异步方式复制数据到slave节点,不过redis2.8开始,sve node会周期性地确认自己每次复制的数据量;一个master node是可以配置多个slave node的;slave node也可以连接其他的slave node;s
16、lave node做复制的时候,不会block master node的正常工作;slave node在做复制的时候,也不会block对自己的查询操作,它会用旧的数据集来提供服务;但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了;slave node主要用来进行横向扩容,做读写分离,扩容的slave node可以提高读的吞吐量。如果采用了主从架构,那么建议必须开启master node的持久化,不建议用slave node作为master node的数据热备,因为那样的话,如果你关掉master的持久化,可能在master宕机重启的时候数据是空的,然后可能一经过复
17、制,slave node的数据也丢了。另外,master的各种备份方案,也需要做.万一本地的所有文件丢失了,从备份中挑选一份rdb去恢复master,这样才能确保启动的时候,是有数据的,即使采用了后续讲解的高可用机制,slave node 可以自动接管 master node,但也可能 sentinel 还没检测到 master failure,masternode就自动重启了,还是可能导致上面所有的slave node数据被清空。redis主从复制的核心原理 当启动一个slave node的时候,它会发送一个PSYNC命令给master node.如果这是slave node初次连接至11m
18、aster node,那么会触发一次fu ll resynchronization全量复制。止 匕 时master会启动一t后台线程,开始生成T 分 RD B快照文件,同时还会将从客户端client新收到的所有写命令缓存在内存中。RDB文件生成完毕后,master会将这个RDB发送给slave,sgve会先写入本地磁盘,然后再从本地磁盘加载到内存中,接 着master会将内存中缓存的写命令发送到slave,slave也会同步这些数据。sgve node如果跟master node有网络故障,断开了连接,会自动重连,连接之后master node仅会复制给slave部分缺少的数据。RDB持久化过
19、程原理1.当从库和主库建立MS关系后,会向主数据库发送SYNC命令2.主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来3.当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis4.从Redis接收到后,会载入快照文件并且执行收到的缓存的命令5.之后,主Redis每当接收到写命令时就会将命令发送从R edis,从而保证数据的一致缺点所有的slave节点数据的复制和同步都由master节点来处理,会照成master节点压力太大,使用主从从结构来解决35.Red is集群的主从复制模型是怎样的?为了使在部分节点失败或者大部分节点无法
20、通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品36.生产环境中的redis是怎么部署的?redis cluster,10台机器,5台机器部署了 redis主实例,另外5台机器部署了 redis的从实例,每个主实例挂了一个从实例,5个节点对外提供读写服务,每个节点的读写高峰qps可能可以达到每秒5万,5台机器最多是25万读写请求/s。机器是什么配置?32G内存+8核CPU+1T磁盘,但是分配给redis进程的是10g内存,一般线上生产环境,redis的内存尽量不要超过1 0 g,超过10g可能会有问题.5台机器对夕隈供读写,一共有50g内存。因为每个主实例都挂
21、了一个从实例,所以是高可用的,任何一个主实例宕机,都会自动故障迁移,redis从实例会自动变成主实例继续提供读写服务。你往内存里写的是什么数据?每条数据的大小是多少?商品数据,每条数据是10kb。100条数据是1mb,10万条数据是1g。常驻内存的是200万条商品数据,占用内存是2 0 g,仅仅不到总内存的5 0%,目前高峰期每秒就是3500左右的请求量。其实大型的公司,会有基础架构的team负责缓存集群的运维。37.说说Redis哈希槽的概念?Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定
22、放置哪个槽,集群的每个节点负责一部分hash槽。38.Red is集群会有写操作丢失吗?为什么?Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。39.Red is集群之间是如何复制的?异步复制40.Red is集群最大节点个数是多少?16384个41.Red is集群如何选择数据库?Redis集群目前无法做数据库选择,默认在。数据库。分区42.Redis是单线程的,如何提高多核CPU的利用率?可以在同一个服务器部署多个Red is的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的,所以,如果你想使用多个CPU,你可以考虑一下分
23、片(sha rd)。43.为什么要做Redis分区?分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机T O 网卡的增加而成倍增长。44.你知道有哪些Redis分区实现方案?客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。代理分区意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2021 Java 试题 Redis 70

限制150内