面试碰到分布式技术面试题该怎么解答? 面试中经常遇到的五大问题如何回答?

\u9762\u8bd5\u7684\u65f6\u5019\uff0c\u9047\u5230\u4e0d\u4f1a\u7684\u6280\u672f\u6027\u95ee\u9898\u5e94\u8be5\u600e\u4e48\u529e\uff1f

\u770b\u9762\u8bd5\u5bf9\u8c61\uff0c\u5982\u679c\u662f\u4eba\u4e8b\u884c\u653f\u7684\u4eba\u95ee\u4f60\uff0c\u4f60\u53ef\u4ee5\u7cca\u5f04\u3002\u4f46\u5982\u679c\u662f\u4e13\u4e1a\u4eba\u5458\uff0c\u5efa\u8bae\u59d4\u5a49\u8868\u8fbe\u81ea\u5df1\u7684\u6b20\u7f3a\u3002


1.1. Redis 有什么数据类型?分别用于什么场景?


数据类型可以存储的值操作STRING字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作


对整数和浮点数执行自增或者自减操作LIST列表从两端压入或者弹出元素


读取单个或者多个元素


进行修剪,只保留一个范围内的元素SET无序集合添加、获取、移除单个元素


检查一个元素是否存在于集合中


计算交集、并集、差集


从集合里面随机获取元素HASH包含键值对的无序散列表添加、获取、移除单个键值对


获取所有键值对


检查某个键是否存在ZSET有序集合添加、获取、删除元素


根据分值范围或者成员来获取元素


计算一个键的排名


What Redis data structures look like

1.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 放到哪个桶中。

转自:葡萄皮吃饱了



  • 闈㈣瘯濡備綍鍥炵瓟鍒嗗竷寮
    绛旓細1銆鐢靛晢骞冲彴涓垱寤鸿鍗曪細棰勭暀搴撳瓨銆侀鎵e噺绉垎銆侀攣瀹氫紭鎯犲埜锛屾鏃剁數鍟嗗钩鍙板唴鍚勬湇鍔¢棿浼氭湁鍒嗗竷寮忎簨鍔¢棶棰橈紝鍥犱负姝ゆ椂宸茬粡瑕佽法澶氫釜鍐呴儴鏈嶅姟淇敼鏁版嵁锛2銆佹敮浠樺钩鍙颁腑鍒涘缓鏀粯璁㈠崟锛堥夐摱琛屽崱鏀粯锛夛細鏌ヨ璐︽埛銆佹煡璇㈤檺鍒惰鍒欙紝绗﹀悎鏉′欢鐨勫氨鍒涘缓鏀粯璁㈠崟骞惰烦杞摱琛岋紝姝ゆ椂涓嶄細鏈夊垎甯冨紡浜嬪姟闂锛屽洜涓鸿繕涓嶄細璺ㄦ湇鍔℃敼鏁版嵁...
  • 闈㈣瘯纰板埌鍒嗗竷寮忔妧鏈潰璇曢璇ユ庝箞瑙g瓟?
    绛旓細褰撴嬁鍒颁竴涓 key 鍚庯紝redis 鍏堝垽鏂綋鍓嶅簱鐨 0 鍙峰搱甯岃〃鏄惁涓虹┖锛屽嵆锛歩f (dict->ht[0].size == 0)銆傚鏋滀负 true 鐩存帴杩斿洖 NULL銆傚垽鏂 0 鍙峰搱甯岃〃鏄惁闇瑕 rehash锛屽洜涓哄鏋滃湪杩涜 rehash锛岄偅涔堜袱涓〃涓呮湁鍙兘瀛樺偍璇 key銆傚鏋滄鍦ㄨ繘琛 rehash锛屽皢璋冪敤涓娆dictRehashStep 鏂规硶锛宊dictRehash...
  • 闈㈣瘯棰-鍏充簬澶ф暟鎹噺鐨鍒嗗竷寮澶勭悊
    绛旓細鏂规涓锛氱洿瑙傜殑澶勭悊鏂规硶鏄愭潯妫鏌ユ棩蹇楁枃浠禙涓殑璁板綍锛屼笌鍘嗗彶璁块棶鐢ㄦ埛鏁版嵁杩涜鍖归厤銆傚鏋滃巻鍙叉暟鎹腑瀛樺湪鍖归厤椤癸紝鍒欏拷鐣ワ紱濡傛灉涓嶅瓨鍦紝鍒欒涓烘柊澧炵敤鎴枫傝繖绉嶆柟娉曢渶瑕佸2浜挎潯鍘嗗彶鏁版嵁杩涜5000W娆″尮閰嶏紝鏁堢巼鏄剧劧寰堜綆銆傛柟妗堜簩锛氭垜鎻愬嚭浜嗘敼杩涚殑鏂规硶锛屽厛灏嗘柊澧炴暟鎹鍏ユ暟鎹簱锛屽苟涓庡巻鍙叉暟鎹繘琛屽乏澶栬繛鎺ャ傚鏋滆繛鎺...
  • 闈㈣瘯棰-鍏充簬澶ф暟鎹噺鐨鍒嗗竷寮澶勭悊
    绛旓細闂鍒嗘瀽锛氶鍏堟湰娆¢潰璇曠殑鏄湁鍏充簬鍒嗗竷寮忔暟鎹鐞嗕互鍙婃暟鎹垎鏋愮殑鑱屼綅锛鎵浠ョ浉鍏崇殑闈㈣瘯棰樼洰鍙兘浼氬亸鍚戜簬浣跨敤鍒嗗竷寮忕殑鎬濇兂鍘昏В鍐銆備絾鏃犲鏈汉褰撴椂鍙嶅簲澶參锛屽疄鍦ㄦ病鍚戝垎甯冨紡澶勭悊鏂瑰悜鎬濊冦傛柟妗堜竴锛氭湰棰樻渶鐩磋鐨勪竴涓鐞嗘柟娉曞氨鏄紝鐩存帴鎷跨潃褰撴棩鏂板鐨5000W鏉¤闂褰涓鏉′竴鏉$殑鍘诲尮閰嶅巻鍙茶闂敤鎴枫傝嫢瀛樺湪鍘嗗彶璁块棶...
  • 闈㈣瘯濂楄矾鈥斺濡備綍搴斿Linux闂
    绛旓細鏈夌殑闈㈣瘯瀹橈細锛堟紡鍑烘弧鎰忕殑绗戝锛変笉閿欍傦紙鏀归棶鍏朵粬閮ㄥ垎鐨闂锛夎繕鏈夌殑闈㈣瘯瀹橈細 shell 鍛戒护鐔熸倝鍚楋紵鎴戯細鎺ヨЕ杩囷紝鏈夊嚑娆¢渶瑕佺紪鍐欑畝鍗曠殑shell鑴氭湰杩涜鑷姩鍖栨祴璇曪紝褰撴椂鐢ㄧ殑鏄 base shell 锛屼絾鏄彧鐢ㄨ繃涓涓ゆ锛屽叿浣撴庝箞鍐欐兂涓嶈捣鏉ヤ簡锛屽鏋滆鐢ㄧ殑璇濋渶瑕佹煡涓涓 銆傞潰璇曞畼锛氬摝~鑳芥煡鍑烘潵鏄惂锛屽彲浠ャ傛讳箣锛...
  • 鍒嗗竷寮閿佺殑涓浜涚粏鑺闂,鍊煎緱鏀惰棌
    绛旓細娌″姙娉曪紝閫艰揩浣犲繀椤诲緱鑳屼細瀹冦傛帴涓嬫潵灏辫涓嬬兢鍙闈㈣瘯纰板埌鐨闂锛屽洜涓哄欓変汉鍙兘鑷繁宸茬粡鎺屾彙浜嗗疄鐜鍒嗗竷寮閿佺殑鍘熺悊锛屼絾鏄闈㈣瘯瀹橀棶鍒扮粏鑺傚彲鑳藉氨涓嶆竻妤氫簡锛屽洜姝ょ粰澶у璁蹭笅杩欏潡銆傞棶棰-1 濡傛灉setnx鎵ц鎴愬姛锛屼絾鏄湪expire鎵ц鐨勬椂鍊檙edis鑺傜偣瀹曟満浜嗭紝鍦ㄨ繖绉嶆儏鍐典笅锛岄攣涓嶄細琚噴鏀撅紝瀵艰嚧姝婚攣銆傝В鍐虫柟妗堬細闂-...
  • 鍒嗗竷寮閿佺殑涓夌瀹炵幇鏂瑰紡闈㈣瘯
    绛旓細姝ゅ锛屽鏋滄暟鎹簱閲囩敤涓讳粠澶嶅埗鏋舵瀯锛岃繕鍙兘瀛樺湪鏁版嵁鍚屾寤惰繜瀵艰嚧鐨勯攣涓嶄竴鑷闂銆傚叾娆★紝鍩轰簬Redis鐨鍒嗗竷寮閿佸疄鐜帮紝涓昏鍒╃敤浜哛edis鐨剆etnx锛坰et if not exists锛夊懡浠ゃ傝繖涓懡浠ゅ彧鏈夊湪key涓嶅瓨鍦ㄧ殑鏃跺欐墠鑳借缃垚鍔燂紝鍥犳鍙互鐢ㄦ潵瀹炵幇閿佺殑鍔熻兘銆傚綋闇瑕佸姞閿佹椂锛屽皾璇曚娇鐢╯etnx璁剧疆涓涓壒瀹氱殑key锛屽鏋滆缃垚鍔熷垯琛ㄧず...
  • 澶у巶闈㈣瘯棰璇﹁В:濡備綍鐢≧edis瀹炵幇鍒嗗竷寮閿?
    绛旓細璇翠竴閬撳父瑙闈㈣瘯棰: 涓涓緢绠鍗曠殑绛旀灏辨槸鍘讳娇鐢 Redission 瀹㈡埛绔俁edission 涓殑閿佹柟妗堝氨鏄 Redis 鍒嗗竷寮閿佸緱姣旇緝瀹岀編鐨勮缁嗘柟妗堛 閭d箞,Redission 涓殑閿佹柟妗堜负浠涔堜細姣旇緝瀹岀編鍛? 姝eソ,鎴戠敤 Redis 鍋氬垎甯冨紡閿佺粡楠屽崄鍒嗕赴瀵,鍦ㄥ疄闄呭伐浣滀腑,涔 鎺㈢储 杩囪澶氱浣跨敤 Redis 鍋氬垎甯冨紡閿佺殑鏂规,缁忚繃浜嗘棤鏁拌娉暀璁...
  • ...婧愪互鍙濡備綍閰嶇疆澶氭暟鎹簮涓嬬殑鍒嗗竷寮浜嬪姟,璇ユ庝箞鍥炵瓟?鐪嬫竻鍐嶅仛绛...
    绛旓細浣犲ソ锛屾垜鏉ュ厛鍥炵瓟浣犵殑绗竴涓闂锛氶氬父澶氭暟鎹簮锛屽湪spring涓厤缃涓嬶紝濡傛灉浣犳兂鍒囨崲鐜ENV 鐨勫硷紝鍦╬roperty涓 <bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreResourceNotFound" value="true"></property> <...
  • 闃块噷闈㈣瘯:璇磋浣犻」鐩噷浣跨敤鐨 MQ ,鍒嗗竷寮绯荤粺涓 MQ 浣滅敤?
    绛旓細瑷褰掓浼狅紝鍏跺疄鎴戣寰楄繖鏄竴涓濊冮锛岄鍏堟垜浠鐪嬬殑搴旇鏄潯浠舵槸鍝簺锛熶笂鍥剧殑渚嬪瓙鏃ュ織娑堟伅灏辨槸浣跨敤鐨 kafka锛屼负浠涔堟槸kafka锛烱afka鏄疞inkedIn寮婧愮殑鍒嗗竷寮鍙戝竷-璁㈤槄娑堟伅绯荤粺锛屽睘浜 Apache 椤剁骇椤圭洰锛岀ぞ鍖烘椿璺冦侹afka涓昏鐗圭偣鏄熀浜嶱ull鐨勬ā寮忔潵澶勭悊娑堟伅娑堣垂锛岃拷姹傞珮鍚炲悙閲忥紝涓寮濮嬬殑鐩殑灏辨槸鐢ㄤ簬鏃ュ織鏀堕泦鍜...
  • 扩展阅读:医院招聘面试100题 ... 面试50道刁钻题 ... 公务员面试必背50题及答案 ... web前端面试题2024 ... 2024公务员考试题库 ... 面试100题及答案大全 ... 面试必背100题答案 ... 应聘必问十个问题 ... 结构化面试必背40题 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网