redis面试题(redis面试题2022)

      最后更新:2023-03-27 21:43:14 手机定位技术交流文章

      面试碰到分布式技术面试题该怎么解答?

      1.1. Redis 有什么数据类型?分别用于什么场景?数据类型可以存储的值操作STRING字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作对整数和浮点数执行自增或者自减操作LIST列表从两端压入或者弹出元素读取单个或者多个元素进行修剪,只保留一个范围内的元素SET无序集合添加、获取、移除单个元素检查一个元素是否存在于集合中计算交集、并集、差集从集合里面随机获取元素HASH包含键值对的无序散列表添加、获取、移除单个键值对获取所有键值对检查某个键是否存在ZSET有序集合添加、获取、删除元素根据分值范围或者成员来获取元素计算一个键的排名What Redis data structures look like1.2. Redis 的主从复制是如何实现的?从服务器连接主服务器,发送 SYNC 命令;主服务器接收到 SYNC 命名后,开始执行 BGSAVE 命令生成 RDB 文件并使用缓冲区记录此后执行的所有写命令;主服务器 BGSAVE 执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;1.3. Redis 的 key 是如何寻址的?背景(1)redis 中的每一个数据库,都由一个 redisDb 的结构存储。其中:redisDb.id 存储着 redis 数据库以整数表示的号码。redisDb.dict 存储着该库所有的键值对数据。redisDb.expires 保存着每一个键的过期时间。(2)当 redis 服务器初始化时,会预先分配 16 个数据库(该数量可以通过配置文件配置),所有数据库保存到结构 redisServer 的一个成员 redisServer.db 数组中。当我们选择数据库 select number 时,程序直接通过 redisServer.db[number] 来切换数据库。有时候当程序需要知道自己是在哪个数据库时,直接读取 redisDb.id 即可。(3)redis 的字典使用哈希表作为其底层实现。dict 类型使用的两个指向哈希表的指针,其中 0 号哈希表(ht[0])主要用于存储数据库的所有键值,而 1 号哈希表主要用于程序对 0 号哈希表进行 rehash 时使用,rehash 一般是在添加新值时会触发,这里不做过多的赘述。所以 redis 中查找一个 key,其实就是对进行该 dict 结构中的 ht[0] 进行查找操作。(4)既然是哈希,那么我们知道就会有哈希碰撞,那么当多个键哈希之后为同一个值怎么办呢?redis 采取链表的方式来存储多个哈希碰撞的键。也就是说,当根据 key 的哈希值找到该列表后,如果列表的长度大于 1,那么我们需要遍历该链表来找到我们所查找的 key。当然,一般情况下链表长度都为是 1,所以时间复杂度可看作 o(1)。寻址 key 的步骤当拿到一个 key 后,redis 先判断当前库的 0 号哈希表是否为空,即:if (dict->ht[0].size == 0)。如果为 true 直接返回 NULL。判断该 0 号哈希表是否需要 rehash,因为如果在进行 rehash,那么两个表中者有可能存储该 key。如果正在进行 rehash,将调用一次_dictRehashStep 方法,_dictRehashStep 用于对数据库字典、以及哈希键的字典进行被动 rehash,这里不作赘述。计算哈希表,根据当前字典与 key 进行哈希值的计算。根据哈希值与当前字典计算哈希表的索引值。根据索引值在哈希表中取出链表,遍历该链表找到 key 的位置。一般情况,该链表长度为 1。当 ht[0] 查找完了之后,再进行了次 rehash 判断,如果未在 rehashing,则直接结束,否则对 ht[1]重复 345 步骤。1.4. Redis 的集群模式是如何实现的?Redis Cluster 是 Redis 的分布式解决方案,在 Redis 3.0 版本正式推出的。Redis Cluster 去中心化,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。Redis Cluster 节点分配Redis Cluster 特点:所有的 redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽。节点的 fail 是通过集群中超过半数的节点检测失效时才生效。客户端与 redis 节点直连,不需要中间 proxy 层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。redis-cluster 把所有的物理节点映射到[0-16383] 哈希槽 (hash slot)上(不一定是平均分配),cluster 负责维护 node、slot、value。Redis 集群预分好 16384 个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384 的值,决定将一个 key 放到哪个桶中。转自:葡萄皮吃饱了
      面试碰到分布式技术面试题该怎么解答?

      java面试中redis,mongodb类的,会问哪些问题,怎么回答

      1、可能会问nosql和关系型数据库的区别: 优点:1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用Oracle那样花费大量成本购买使用,相比关系型数据库价格便宜2)查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型4)扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难缺点:1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本3)不提供关系型数据库对事物的处理2、介绍下redis和mongodb:自行google。3、应用场景:redis:a.主要是做热点数据缓存。b.数据过期处理。c.消息队列等功能。d.计数,例如投票等。mongodb:mongodb的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。mongo适用于以下场景:a.网站数据:mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。b.缓存:由于性能很高,mongo也适合作为信息基础设施的缓存层。在系统重启之后,由mongo搭建的持久化缓存可以避免下层的数据源过载。c.大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。d.高伸缩性的场景:mongo非常适合由数十或者数百台服务器组成的数据库。e.用于对象及JSON数据的存储:mongo的BSON数据格式非常适合文档格式化的存储及查询。4、支持的数据类型: 内容比较多,自行将网上的信息整理一下。
      java面试中redis,mongodb类的,会问哪些问题,怎么回答

      面试 - 必知必会的微服务面试题

      SOA与微服务的区别?SOA的提出是在企业计算领域,就是要将紧耦合的系统,划分为面向业务的,粗粒度,松耦合,无状态的服务。服务发布出来供其他服务调用,一组互相依赖的服务就构成了SOA架构下的系统。基于这些基础的服务,可以将业务过程用类似BPEL流程的方式编排起来,而BPEL反映的是业务处理的过程,这些过程对于业务人员更为直观,调整也比hardcode的代码更容易。当然企业还需要对服务治理,比如服务注册库,监控管理等。我们知道企业计算领域,如果不是交易系统的话,并发量都不是很大的,所以大多数情况下,一台服务器就容纳将许许多多的服务,这些服务采用统一的基础设施,可能都运行在一个应用服务器的进程中。虽然说是面向服务了,但还是单一的系统。而微服务架构大体是从互联网企业兴起的,由于大规模用户,对分布式系统的要求很高,如果像企业计算那样的系统,伸缩就需要多个容纳续续多多的服务的系统实例,前面通过负载均衡使得多个系统成为一个集群。但这是很不方便的,互联网企业迭代的周期很短,一周可能发布一个版本,甚至可能每天一个版本,而不同的子系统的发布周期是不一样的。而且,不同的子系统也不像原来企业计算那样采用集中式的存储,使用昂贵的Oracle存储整个系统的数据,二是使用MongoDB,HBase,Cassandra等NOSQL数据库和Redis,memcache等分布式缓存。那么就倾向采用以子系统为分割,不同的子系统采用自己的架构,那么各个服务运行自己的Web容器中,当需要增加计算能力的时候,只需要增加这个子系统或服务的实例就好了,当升级的时候,可以不影响别的子系统。这种组织方式大体上就被称作微服务架构。微服务与SOA相比,更强调分布式系统的特性,比如横向伸缩性,服务发现,负载均衡,故障转移,高可用。互联网开发对服务治理提出了更多的要求,比如多版本,比如灰度升级,比如服务降级,比如分布式跟踪,这些都是在SOA实践中重视不够的。Docker容器技术的出现,为微服务提供了更便利的条件,比如更小的部署单元,每个服务可以通过类似Node.js或Spring Boot的技术跑在自己的进程中。可能在几十台计算机中运行成千上万个Docker容器,每个容器都运行着服务的一个实例。随时可以增加某个服务的实例数,或者某个实例崩溃后,在其他的计算机上再创建该服务的新的实例。如何拆分服务?要围绕业务模块进行拆分,拆分粒度应该保证微服务具有业务的独立性与完整性,尽可能少的存在服务依赖,链式调用。但是,在实际开发过程中,有的时候单体架构更加适合当前的项目。实际上,微服务的设计并不是一蹴而就的,它是一个设计与反馈过程。因此,我们在设计之初可以将服务的粒度设计的大一些,并考虑其可扩展性,随着业务的发展,进行动态地拆分也是一个不错的选择。REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。实际上呢,不是所有的东西都是“资源”,尤其是在业务系统中,缺点如下:有个接口是更新订单状态,你是用上面的GET POST PUT DELETE 哪个呢,看样子应该是PUT,但是路径呢PUT /tickets/12我有时候多个接口 ,更新订单收款状态,更新订单支款状态,更新订单结算状态;Restful 的路径明显不友好不够用;再比如,批量删除,DELETE还好用么,DELETE /tickets/12 #删除ticekt 12 这种形式如果要传数组怎么办,url是不是不够友好?再比如,Resuful要求 GET /tickets # 获取ticket列表 。我们曾经有个需求,对方会把不超过1000个订单id传给我们,我们系统过滤其中一部分特殊订单;这也是个查询服务,用GET /tickets # 获取ticket列表的形式,1000个订单id显然是超过GET url长度的,这里也不合适;再者,我想开发多个条件查询列表服务,路径这么浅显然不合适;实际业务中,我们webapi的路径是这样的:systemAlias/controller/action总结下规则:简单查询尽量用GET,好处是可以直接带查询参数copy api路径;复杂查询和更新用POST,用的最多;不用PUT和DELETE,原因是增加复杂度,并没有带来什么好处看看BAT的很多openapi,也是写着restful,实际没有严格遵守,都是get和post,这是也很多人不知道put和delete的原因如://根据订单id获取订单GET oms/order/queryOrderById?id=value1¶m2=value2//根据订单id List获取订单POST oms/order/queryOrderByIdList//根据条件查询订单,带分页参数POST oms/order/queryOrderByCondition//更新订单收款状态POST oms/order/updateOrderCollectionStatus//批量更新订单收款状态POST oms/order/updateOrderCollectionStatusInBatch//批量更新订单收款状态POST oms/order/updateOrderCollectionStatusInBatch//批量删除订单,带操作来源POST oms/order/deleteOrderInBatch微服务如何进行数据库管理?CAP 原理(CAP Theorem)在足球比赛里,一个球员在一场比赛中进三个球,称之为帽子戏法(Hat-trick)。在分布式数据系统中,也有一个帽子原理(CAP Theorem),不过此帽子非彼帽子。CAP 原理中,有三个要素:CAP 原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。因此在进行分布式架构设计时,必须做出取舍。而对于分布式数据系统,分区容忍性是基本要求 ,否则就失去了价值,因此设计分布式数据系统,就是在一致性和可用性之间取一个平衡。对于大多数 WEB 应用,其实并不需要强一致性,因此牺牲一致性而换取高可用性,是目前多数分布式数据库产品的方向。当然,牺牲一致性,并不是完全不管数据的一致性,否则数据是混乱的,那么系统可用性再高分布式再好也没有了价值。牺牲一致性,只是不再要求关系型数 据库中的强一致性,而是只要系统能达到最终一致性即可,考虑到客户体验,这个最终一致的时间窗口,要尽可能的对用户透明,也就是需要保障“用户感知到的一致性”。通常是通过数据的多份异步复制来实现系统的高可用和数据的最终一致性的,“用户感知到的一致性”的时间窗口则 取决于数据复制到一致状态的时间。最终一致性(eventually consistent)对于一致性,可以分为从客户端和服务端两个不同的视角。从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。一致性是因为有并发读写才有的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。对于关系型数据库,要求更新过的数据能被后续的 访问都能看到,这是强一致性 ;如果能容忍后续的部分或者全部访问不到,则是弱一致性 ; 如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。从服务端角度,如何尽快将更新后的数据分布到整个系统,降低达到最终一致性的时间窗口,是提高系统的可用度和用户体验非常重要的方面。那么问题来了,如何实现数据的最终一致性呢?答案就在事件驱动架构。最佳解决办法是采用事件驱动架构。其中碰到的一个挑战是如何原子性的更新状态和发布事件。有几种方法可以解决此问题,包括将数据库视为消息队列和事件源等。从目前技术应用范围和成熟度看,推荐使用第一种方式(本地事务发布事件),来实现事件投递原子化,即可靠事件投递。SpringCloud和Dubbo有哪些区别?总体来说,两者各有优势。虽说后者服务调用的功能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的依赖,这在强调快速演化的微服务环境下,显得更加合适。品牌机与组装机的区别:很明显SpringCloud比dubbo的功能更强大,覆盖面更广,而且能够与SpringFramework、SpringBoot、SpringData、SpringBatch等其他Spring项目完美融合,这些对于微服务至关重要。使用Dubbo构建的微服务架构就像组装电脑、各环节我们选择自由度高,但是最总可能会因为内存质量而影响整体,但对于高手这也就不是问题。而SpringCloud就像品牌机,在Spring Source的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性。在面临微服务基础框架选型时Dubbo与SpringCloud只能二选一。
      面试 - 必知必会的微服务面试题

      一个面试问题,为什么用redis做缓存

      redis不是数据库,只是一种缓存软件,为了缓解服务器频繁读数据库带来的内存资源消耗,redis将需要和数据库交互的信息暂存,当下次同样的http请求,就能直接读取redis里面的内容,而不用读数据库。这样减少了数据库压力又能提高服务器响应时间。望您能采纳呀。
      一个面试问题,为什么用redis做缓存

      Redis 面试宝典之 Redis 如何处理已经过期的数据?

      本文讲的是 Redis 的键值过期之后的数据处理 ,讲的是正常情况下的数据清理 ,但面试者常常会把两个概念搞混,以至于和期望的工作失之交臂。我们本文的职责之一就是帮读者朋友搞清楚二者的区别,相信看完本文你就会对二者的概念有一个本质上的认识。 我们本文的面试题是,Redis 如何处理已过期的数据?在 Redis 中维护了一个过期字典,会将所有已经设置了过期时间的键值全部存储到此字典中,例如我们使用设置过期时间的命令时,命令如下:此命令表示 5s 之后键值为mykey:java的数据将会过期,其中ex是expire的缩写,也就是过期、到期的意思。过期时间除了上面的那种字符类型的直接设置之外,还可以使用expire key seconds的方式直接设置,示例如下:获取键值的执行流程是,当有键值的访问请求时 Redis 会先判断此键值是否在过期字典中,如果没有表示键值没有设置过期时间(永不过期),然后就可以正常返回键值数据了;如果此键值在过期字典中则会判断当前时间是否小于过期时间,如果小于则说明此键值没有过期可以正常返回数据,反之则表示数据已过期,会删除此键值并且返回给客户端nil ,执行流程如下图所示:这是键值数据的方法流程,同时也是过期键值的判断和删除的流程。本文的面试题考察的是你对 Redis 的过期删除策略的掌握,在 Redis 中为了平衡空间占用和 Redis 的执行效率,采用了两种删除策略,上面的回答不完全对,因为他只回答出了一种过期键的删除策略,和此知识点相关的面试题还有以下这些: 常见的过期策略,有以下三种:
      Redis 面试宝典之 Redis 如何处理已经过期的数据?

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/60907.html

          热门文章

          文章分类