這篇文章主要介紹“redis分布式技術面試題有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Redis分布式技術面試題有哪些”文章能幫助大家解決問題。
創新互聯專注骨干網絡服務器租用10年,服務更有保障!服務器租用,聯通機房服務器托管 成都服務器租用,成都服務器托管,骨干網絡帶寬,享受低延遲,高速訪問。靈活、實現低成本的共享或公網數據中心高速帶寬的專屬高性能服務器。
數據類型 | 可以存儲的值 | 操作 |
---|---|---|
STRING | 字符串、整數或者浮點數 | 對整個字符串或者字符串的其中一部分執行操作 對整數和浮點數執行自增或者自減操作 |
LIST | 列表 | 從兩端壓入或者彈出元素 讀取單個或者多個元素 進行修剪,只保留一個范圍內的元素 |
SET | 無序集合 | 添加、獲取、移除單個元素 檢查一個元素是否存在于集合中 計算交集、并集、差集 從集合里面隨機獲取元素 |
HASH | 包含鍵值對的無序散列表 | 添加、獲取、移除單個鍵值對 獲取所有鍵值對 檢查某個鍵是否存在 |
ZSET | 有序集合 | 添加、獲取、刪除元素 根據分值范圍或者成員來獲取元素 計算一個鍵的排名 |
What Redis data structures look like
從服務器連接主服務器,發送 SYNC 命令;
主服務器接收到 SYNC 命名后,開始執行 BGSAVE 命令生成 RDB 文件并使用緩沖區記錄此后執行的所有寫命令;
主服務器 BGSAVE 執行完后,向所有從服務器發送快照文件,并在發送期間繼續記錄被執行的寫命令;
從服務器收到快照文件后丟棄所有舊數據,載入收到的快照;
主服務器快照發送完畢后開始向從服務器發送緩沖區中的寫命令;
從服務器完成對快照的載入,開始接收命令請求,并執行來自主服務器緩沖區的寫命令;
(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 后,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 步驟。
Redis Cluster 是 Redis 的分布式解決方案,在 Redis 3.0 版本正式推出的。
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 放到哪個桶中。
Redis Cluster 為了保證數據的高可用性,加入了主從模式。
一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份。當這個主節點掛掉后,就會有這個從節點選取一個來充當主節點,從而保證集群不會掛掉。所以,在集群建立的時候,一定要為每個主節點都添加了從節點。
Redis Sentinel 用于管理多個 Redis 服務器,它有三個功能:
監控(Monitoring) - Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
提醒(Notification) - 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
自動故障遷移(Automatic failover) - 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級為新的主服務器, 并讓失效主服務器的其他從服務器改為復制新的主服務器; 當客戶端試圖連接失效的主服務器時, 集群也會向客戶端返回新主服務器的地址, 使得集群可以使用新主服務器代替失效服務器。
Redis 集群中應該有奇數個節點,所以至少有三個節點。
哨兵監控集群中的主服務器出現故障時,需要根據 quorum 選舉出一個哨兵來執行故障轉移。選舉需要 majority,即大多數哨兵是運行的(2 個哨兵的 majority=2,3 個哨兵的 majority=2,5 個哨兵的 majority=3,4 個哨兵的 majority=2)。
假設集群僅僅部署 2 個節點
+----+ +----+| M1 |---------| R1 || S1 | | S2 |+----+ +----+
如果 M1 和 S1 所在服務器宕機,則哨兵只有 1 個,無法滿足 majority 來進行選舉,就不能執行故障轉移。
分布式鎖的三種實現:
基于數據庫實現分布式鎖;
基于緩存(Redis 等)實現分布式鎖;
基于 Zookeeper 實現分布式鎖;
獲取鎖的時候,使用 setnx 加鎖,并使用 expire 命令為鎖添加一個超時時間,超過該時間則自動釋放鎖,鎖的 value 值為一個隨機生成的 UUID,通過此在釋放鎖的時候進行判斷。
獲取鎖的時候還設置一個獲取的超時時間,若超過這個時間則放棄獲取鎖。
釋放鎖的時候,通過 UUID 判斷是不是該鎖,若是該鎖,則執行 delete 進行鎖釋放。
創建一個目錄 mylock;
線程 A 想獲取鎖就在 mylock 目錄下創建臨時順序節點;
獲取 mylock 目錄下所有的子節點,然后獲取比自己小的兄弟節點,如果不存在,則說明當前線程順序號最小,獲得鎖;
線程 B 獲取所有節點,判斷自己不是最小節點,設置監聽比自己次小的節點;
線程 A 處理完,刪除自己的節點,線程 B 監聽到變更事件,判斷自己是不是最小的節點,如果是則獲得鎖。
ZooKeeper 具備高可用、可重入、阻塞鎖特性,可解決失效死鎖問題。 但 ZooKeeper 因為需要頻繁的創建和刪除節點,性能上不如 Redis 方式。
將存在于某一時刻的所有數據都寫入到硬盤中。
快照的原理
在默認情況下,Redis 將數據庫快照保存在名字為 dump.rdb 的二進制文件中。你可以對 Redis 進行設置, 讓它在“N 秒內數據集至少有 M 個改動”這一條件被滿足時, 自動保存一次數據集。你也可以通過調用 SAVE 或者 BGSAVE,手動讓 Redis 進行數據集保存操作。這種持久化方式被稱為快照。
當 Redis 需要保存 dump.rdb 文件時, 服務器執行以下操作:
Redis 創建一個子進程。
子進程將數據集寫入到一個臨時快照文件中。
當子進程完成對新快照文件的寫入時,Redis 用新快照文件替換原來的快照文件,并刪除舊的快照文件。
這種工作方式使得 Redis 可以從寫時復制(copy-on-write)機制中獲益。
快照的優點
它保存了某個時間點的數據集,非常適用于數據集的備份。
很方便傳送到另一個遠端數據中心或者亞馬遜的 S3(可能加密),非常適用于災難恢復。
快照在保存 RDB 文件時父進程唯一需要做的就是 fork 出一個子進程,接下來的工作全部由子進程來做,父進程不需要再做其他 IO 操作,所以快照持久化方式可以最大化 redis 的性能。
與 AOF 相比,在恢復大的數據集的時候,DB 方式會更快一些。
快照的缺點
如果你希望在 redis 意外停止工作(例如電源中斷)的情況下丟失的數據最少的話,那么快照不適合你。
快照需要經常 fork 子進程來保存數據集到硬盤上。當數據集比較大的時候,fork 的過程是非常耗時的,可能會導致 Redis 在一些毫秒級內不能響應客戶端的請求。
AOF 持久化方式記錄每次對服務器執行的寫操作。當服務器重啟的時候會重新執行這些命令來恢復原始的數據。
Redis 創建一個子進程。
子進程開始將新 AOF 文件的內容寫入到臨時文件。
對于所有新執行的寫入命令,父進程一邊將它們累積到一個內存緩存中,一邊將這些改動追加到現有 AOF 文件的末尾,這樣樣即使在重寫的中途發生停機,現有的 AOF 文件也還是安全的。
當子進程完成重寫工作時,它給父進程發送一個信號,父進程在接收到信號之后,將內存緩存中的所有數據追加到新 AOF 文件的末尾。
搞定!現在 Redis 原子地用新文件替換舊文件,之后所有命令都會直接追加到新 AOF 文件的末尾。
使用默認的每秒 fsync 策略,Redis 的性能依然很好(fsync 是由后臺線程進行處理的,主線程會盡力處理客戶端請求),一旦出現故障,使用 AOF ,你最多丟失 1 秒的數據。
AOF 文件是一個只進行追加的日志文件,所以不需要寫入 seek,即使由于某些原因(磁盤空間已滿,寫的過程中宕機等等)未執行完整的寫入命令,你也也可使用 redis-check-aof 工具修復這些問題。
Redis 可以在 AOF 文件體積變得過大時,自動地在后臺對 AOF 進行重寫:重寫后的新 AOF 文件包含了恢復當前數據集所需的最小命令集合。整個重寫操作是絕對安全的。
AOF 文件有序地保存了對數據庫執行的所有寫入操作,這些寫入操作以 Redis 協議的格式保存。因此 AOF 文件的內容非常容易被人讀懂,對文件進行分析(parse)也很輕松。
對于相同的數據集來說,AOF 文件的體積通常要大于 RDB 文件的體積。
根據所使用的 fsync 策略,AOF 的速度可能會慢于快照。在一般情況下,每秒 fsync 的性能依然非常高,而關閉 fsync 可以讓 AOF 的速度和快照一樣快,即使在高負荷之下也是如此。不過在處理巨大的寫入載入時,快照可以提供更有保證的最大延遲時間(latency)。
noeviction - 當內存使用達到閾值的時候,所有引起申請內存的命令會報錯。
allkeys-lru - 在主鍵空間中,優先移除最近未使用的 key。
allkeys-random - 在主鍵空間中,隨機移除某個 key。
volatile-lru - 在設置了過期時間的鍵空間中,優先移除最近未使用的 key。
volatile-random - 在設置了過期時間的鍵空間中,隨機移除某個 key。
volatile-ttl - 在設置了過期時間的鍵空間中,具有更早過期時間的 key 優先移除。
兩者都是非關系型內存鍵值數據庫。有以下主要不同:
數據類型
Memcached 僅支持字符串類型;
而 Redis 支持五種不同種類的數據類型,使得它可以更靈活地解決問題。
數據持久化
Memcached 不支持持久化;
Redis 支持兩種持久化策略:RDB 快照和 AOF 日志。
分布式
Memcached 不支持分布式,只能通過在客戶端使用像一致性哈希這樣的分布式算法來實現分布式存儲,這種方式在存儲和查詢時都需要先在客戶端計算一次數據所在的節點。
Redis Cluster 實現了分布式的支持。
內存管理機制
Memcached 將內存分割成特定長度的塊來存儲數據,以完全解決內存碎片的問題,但是這種方式會使得內存的利用率不高,例如塊的大小為 128 bytes,只存儲 100 bytes 的數據,那么剩下的 28 bytes 就浪費掉了。
在 Redis 中,并不是所有數據都一直存儲在內存中,可以將一些很久沒用的 value 交換到磁盤。而 Memcached 的數據則會一直在內存中。
Redis 快速的原因:
絕大部分請求是純粹的內存操作(非常快速)
采用單線程,避免了不必要的上下文切換和競爭條件
非阻塞 IO
內部實現采用 epoll,采用了 epoll+自己實現的簡單的事件框架。epoll 中的讀、寫、關閉、連接都轉化成了事件,然后利用 epoll 的多路復用特性,絕不在 io 上浪費一點時間。
異步處理 - 相比于傳統的串行、并行方式,提高了系統吞吐量。
應用解耦 - 系統間通過消息通信,不用關心其他系統的處理。
流量削鋒 - 可以通過消息隊列長度控制請求量;可以緩解短時間內的高并發請求。
日志處理 - 解決大量日志傳輸。
消息通訊 - 消息隊列一般都內置了高效的通信機制,因此也可以用在純的消息通訊。比如實現點對點消息隊列,或者聊天室等。
將所有 Broker 和待分配的 Partition 排序
將第 i 個 Partition 分配到第(i mod n)個 Broker 上
將第 i 個 Partition 的第 j 個 Replica 分配到第((i + j) mode n)個 Broker 上
MQ 的常見問題有:
消息的順序問題
消息的重復問題
消息有序指的是可以按照消息的發送順序來消費。
假如生產者產生了 2 條消息:M1、M2,假定 M1 發送到 S1,M2 發送到 S2,如果要保證 M1 先于 M2 被消費,怎么做?
解決方案:
(1)保證生產者 - MQServer - 消費者是一對一對一的關系
缺陷:
并行度就會成為消息系統的瓶頸(吞吐量不夠)
更多的異常處理,比如:只要消費端出現問題,就會導致整個處理流程阻塞,我們不得不花費更多的精力來解決阻塞的問題。
(2)通過合理的設計或者將問題分解來規避。
不關注亂序的應用實際大量存在
隊列無序并不意味著消息無序
所以從業務層面來保證消息的順序而不僅僅是依賴于消息系統,是一種更合理的方式。
造成消息重復的根本原因是:網絡不可達。
所以解決這個問題的辦法就是繞過這個問題。那么問題就變成了:如果消費端收到兩條一樣的消息,應該怎樣處理?
消費端處理消息的業務邏輯保持冪等性。只要保持冪等性,不管來多少條重復消息,最后處理的結果都一樣。 保證每條消息都有唯一編號且保證消息處理成功與去重表的日志同時出現。利用一張日志表來記錄已經處理成功的消息的 ID,如果新到的消息 ID 已經在日志表中,那么就不再處理這條消息。
節點角色:
節點 | 角色說明 |
---|---|
Provider | 暴露服務的服務提供方 |
Consumer | 調用遠程服務的服務消費方 |
Registry | 服務注冊與發現的注冊中心 |
Monitor | 統計服務的調用次數和調用時間的監控中心 |
Container | 服務運行容器 |
調用關系:
務容器負責啟動,加載,運行服務提供者。
服務提供者在啟動時,向注冊中心注冊自己提供的服務。
服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數據給消費者。
服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
Random
隨機,按權重設置隨機概率。
在一個截面上碰撞的概率高,但調用量越大分布越均勻,而且按概率使用權重后也比較均勻,有利于動態調整提供者權重。
RoundRobin
輪循,按公約后的權重設置輪循比率。
存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。
LeastActive
最少活躍調用數,相同活躍數的隨機,活躍數指調用前后計數差。
使慢的提供者收到更少請求,因為越慢的提供者的調用前后計數差會越大。
ConsistentHash
一致性 Hash,相同參數的請求總是發到同一提供者。
當某一臺提供者掛時,原本發往該提供者的請求,基于虛擬節點,平攤到其它提供者,不會引起劇烈變動。
缺省只對第一個參數 Hash,如果要修改,請配置 <dubbo:parameter key="hash.arguments" value="0,1" />
缺省用 160 份虛擬節點,如果要修改,請配置 <dubbo:parameter key="hash.nodes" value="320" />
Failover - 失敗自動切換,當出現失敗,重試其它服務器。通常用于讀操作,但重試會帶來更長延遲。可通過 retries="2" 來設置重試次數(不含第一次)。
Failfast - 快速失敗,只發起一次調用,失敗立即報錯。通常用于非冪等性的寫操作,比如新增記錄。
Failsafe - 失敗安全,出現異常時,直接忽略。通常用于寫入審計日志等操作。
Failback - 失敗自動恢復,后臺記錄失敗請求,定時重發。通常用于消息通知操作。
Forking - 并行調用多個服務器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設置最大并行數。
Broadcast - 播調用所有提供者,逐個調用,任意一臺報錯則報錯。通常用于通知所有提供者更新緩存或日志等本地資源信息。
Dubbo 作為 RPC 框架,首先要完成的就是跨系統,跨網絡的服務調用。消費方與提供方遵循統一的接口定義,消費方調用接口時,Dubbo 將其轉換成統一格式的數據結構,通過網絡傳輸,提供方根據規則找到接口實現,通過反射完成調用。也就是說,消費方獲取的是對遠程服務的一個代理(Proxy),而提供方因為要支持不同的接口實現,需要一個包裝層(Wrapper)。調用的過程大概是這樣:
消費方的 Proxy 和提供方的 Wrapper 得以讓 Dubbo 構建出復雜、統一的體系。而這種動態代理與包裝也是通過基于 SPI 的插件方式實現的,它的接口就是ProxyFactory。
@SPI("javassist")public interface ProxyFactory { @Adaptive({Constants.PROXY_KEY}) <T> T getProxy(Invoker<T> invoker) throws RpcException; @Adaptive({Constants.PROXY_KEY}) <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException; }
ProxyFactory 有兩種實現方式,一種是基于 JDK 的代理實現,一種是基于 javassist 的實現。ProxyFactory 接口上定義了@SPI("javassist"),默認為 javassist 的實現。
dubbo 序列化,阿里尚不成熟的 java 序列化實現。
hessian2 序列化:hessian 是一種跨語言的高效二進制的序列化方式,但這里實際不是原生的 hessian2 序列化,而是阿里修改過的 hessian lite,它是 dubbo RPC 默認啟用的序列化方式。
json 序列化:目前有兩種實現,一種是采用的阿里的 fastjson 庫,另一種是采用 dubbo 中自已實現的簡單 json 庫,一般情況下,json 這種文本序列化性能不如二進制序列化。
java 序列化:主要是采用 JDK 自帶的 java 序列化實現,性能很不理想。
Kryo 和 FST:Kryo 和 FST 的性能依然普遍優于 hessian 和 dubbo 序列化。
Hessian 序列化與 Java 默認的序列化區別?
Hessian 是一個輕量級的 remoting on http 工具,采用的是 Binary RPC 協議,所以它很適合于發送二進制數據,同時又具有防火墻穿透能力。
Hessian 支持跨語言串行
比 java 序列化具有更好的性能和易用性
支持的語言比較多
Protocol Buffer 是 Google 出品的一種輕量 & 高效的結構化數據存儲格式,性能比 Json、XML 真的強!太!多!
Protocol Buffer 的序列化 & 反序列化簡單 & 速度快的原因是:
編碼 / 解碼 方式簡單(只需要簡單的數學運算 = 位移等等)
采用 Protocol Buffer 自身的框架代碼 和 編譯器 共同完成
Protocol Buffer 的數據壓縮效果好(即序列化后的數據量體積小)的原因是:
采用了獨特的編碼方式,如 Varint、Zigzag 編碼方式等等
采用 T - L - V 的數據存儲方式:減少了分隔符的使用 & 數據存儲得緊湊
可以。Dubbo 消費者在應用啟動時會從注冊中心拉取已注冊的生產者的地址接口,并緩存在本地。每次調用時,按照本地存儲的地址進行調用。
ZooKeeper 是一個分布式應用協調系統,已經用到了許多分布式項目中,用來完成統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等工作。
每個 Server 在內存中存儲了一份數據;
Zookeeper 啟動時,將從實例中選舉一個 leader(Paxos 協議);
Leader 負責處理數據更新等操作(Zab 協議);
一個更新操作成功,當且僅當大多數 Server 在內存中成功修改數據。
Netty 是一個“網絡通訊框架”。
Netty 進行事件處理的流程。Channel
是連接的通道,是 ChannelEvent 的產生者,而ChannelPipeline
可以理解為 ChannelHandler 的集合。
IO 的方式通常分為幾種:
同步阻塞的 BIO
同步非阻塞的 NIO
異步非阻塞的 AIO
在使用同步 I/O 的網絡應用中,如果要同時處理多個客戶端請求,或是在客戶端要同時和多個服務器進行通訊,就必須使用多線程來處理。
NIO 基于 Reactor,當 socket 有流可讀或可寫入 socket 時,操作系統會相應的通知引用程序進行處理,應用再將流讀取到緩沖區或寫入操作系統。也就是說,這個時候,已經不是一個連接就要對應一個處理線程了,而是有效的請求,對應一個線程,當連接沒有數據時,是沒有工作線程來處理的。
與 NIO 不同,當進行讀寫操作時,只須直接調用 API 的 read 或 write 方法即可。這兩種方法均為異步的,對于讀操作而言,當有流可讀取時,操作系統會將可讀的流傳入 read 方法的緩沖區,并通知應用程序;對于寫操作而言,當操作系統將 write 方法傳遞的流寫入完畢時,操作系統主動通知應用程序。 即可以理解為,read/write 方法都是異步的,完成后會主動調用回調函數。
系統拆分從資源角度分為:應用拆分和數據庫拆分。
從采用的先后順序可分為:水平擴展、垂直拆分、業務拆分、水平拆分。
是否使用服務依據實際業務場景來決定。
當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用于提高業務復用及整合的分布式服務框架(RPC)是關鍵。
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基于訪問壓力實時管理集群容量,提高集群利用率。此時,用于提高機器利用率的資源調度和治理中心(SOA)是關鍵。
Thrift 是跨語言的 RPC 框架。
Dubbo 支持服務治理,而 Thrift 不支持。
關于“Redis分布式技術面試題有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注創新互聯行業資訊頻道,小編每天都會為大家更新不同的知識點。
本文題目:Redis分布式技術面試題有哪些
分享網址:http://vcdvsql.cn/article22/jhgpcc.html
成都網站建設公司_創新互聯,為您提供虛擬主機、域名注冊、網站營銷、企業網站制作、全網營銷推廣、定制網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯