資料庫基礎面試第四彈

来源:https://www.cnblogs.com/beyond-tester/archive/2023/09/12/17698154.html
-Advertisement-
Play Games

1. Redis的數據結構有哪些 1. 字元串(String):字元串是Redis最基本的數據結構。它可以存儲任意類型的數據,包括文本、整數或二進位數據。字元串類型的值最大可以達到512MB。 SET name "John" GET name ``` 將字元串"John"存儲在鍵名為"name"的字 ...


1. Redis的數據結構有哪些

1. 字元串(String):
字元串是Redis最基本的數據結構。它可以存儲任意類型的數據,包括文本、整數或二進位數據。字元串類型的值最大可以達到512MB。

SET name "John"
GET name
```
將字元串"John"存儲在鍵名為"name"的字元串類型數據結構中,並通過GET命令獲取它。

2. 列表(List):

列表是一個有序的字元串集合。它允許在列表的兩端進行元素的插入和刪除操作,支持按照索引獲取元素,還提供了一些其他操作如獲取子列表、插入元素等。

LPUSH fruits "apple"
LPUSH fruits "banana"
LRANGE fruits 0 -1
```
使用LPUSH命令將"apple"和"banana"兩個字元串插入名為"fruits"的列表中,然後使用LRANGE命令獲取整個列表的元素。

3. 集合(Set):
集合是一個無序的、唯一的元素集合。它支持添加、刪除和檢查元素的操作,還提供了集合的並、交、差等操作。

SADD tags "redis"
SADD tags "database"
SMEMBERS tags
```
使用SADD命令將"redis"和"database"兩個字元串添加到名為"tags"的集合中,並使用SMEMBERS命令獲取集合中的所有元素。

4. 有序集合(Sorted Set):

有序集合是一個有序的、唯一的元素集合。每個元素都會關聯一個分數(score),用於排序。可以對有序集合中的元素按照分數範圍或成員進行查詢。

ZADD leaderboard 1000 "player1"
ZADD leaderboard 800 "player2"
ZRANGE leaderboard 0 -1 WITHSCORES
```
使用ZADD命令將"player1"和"player2"兩個玩家以分數1000和800的形式添加到名為"leaderboard"的有序集合中,並使用ZRANGE命令按照分數範圍獲取有序集合中的所有元素及其分數。  

 

5. 哈希(Hash):
哈希是一個鍵值對集合。在Redis中,每個哈希可以存儲多個欄位和對應的值。哈希適用於存儲對象,可以像操作資料庫中的行一樣對哈希進行存取操作。

 

HSET user:id1 name "Alice"
HSET user:id1 age 25
HGETALL user:id1
```
使用HSET命令將"name"欄位設為"Alice"、"age"欄位設為25,並使用HGETALL命令獲取名為"user:id1"的哈希中的所有欄位和對應的值。

 

2. Redis 中的緩存雪崩,擊穿,穿透是什麼

緩存雪崩(Cache Avalanche):

緩存雪崩指的是在某個時間點,緩存中大量的數據同時過期或失效,導致大量的請求直接訪問後端資料庫。這會導致資料庫負載突然增加,引起資料庫性能問題,甚至導致資料庫崩潰。

原因:

  緩存數據設置了相同的過期時間,一旦這些數據同時過期,會導致大量請求直接訪問資料庫。

  緩存伺服器宕機或發生故障,無法提供緩存服務。

解決方案:

  為緩存數據設置隨機的過期時間,避免同時失效。

  使用多級緩存架構,如熱點數據預熱、使用本地緩存等。

  監控緩存的健康狀況,及時發現故障並修複。

2. 緩存擊穿(Cache Breakdown):

緩存擊穿指的是某個熱點數據失效時,恰好有大量併發請求同時訪問該數據,導致請求直接訪問資料庫。與緩存雪崩不同的是,緩存擊穿只是某個特定的數據失效,而不是所有的緩存數據。

原因:

  熱點數據失效,導致併發請求直接訪問資料庫。

  惡意請求或異常情況,針對某個特定的緩存數據進行大量請求。

解決方案:

     使用互斥鎖或分散式鎖來控制併發請求,只有一個請求能夠重新生成緩存數據。

    提前非同步更新緩存,避免數據失效時的併發請求。

3. 緩存穿透(Cache Penetration):

緩存穿透指的是請求訪問一個不存在於緩存中的數據,由於緩存無法命中,請求直接訪問後端資料庫。這可能是惡意請求或者查詢不存在的數據。

原因:

  惡意請求:攻擊者故意發送大量的請求,查詢不存在的數據,以此來對系統造成壓力。

  查詢不存在的數據:應用程式中未對請求的數據進行有效的校驗,導致查詢不存在的數據。

解決方案:

  使用布隆過濾器(Bloom Filter)等技術來過濾掉不存在的數據請求。

  對請求的數據進行有效的校驗,如校驗請求的參數、ID等,避免查詢不存在的數據。

3. 資料庫的存儲過程是什麼

存儲過程是一種非常有用的工具。它是一組預定義的資料庫操作步驟,被封裝在一個可重覆使用的單元中,以便在需要時被調用執行。存儲過程通常由SQL語句和控制結構(例如條件語句和迴圈)組成,可以接受輸入參數並返回結果。

存儲過程的設計思想類似於我們平時做的烹飪食譜。假設你想要做一道紅燒肉,你可以編寫一個詳細的步驟清單,列出從準備食材到最後上桌的所有步驟。每次你想要做紅燒肉時,只需按照清單上的步驟逐一執行即可。

在資料庫中,存儲過程的作用類似於這個烹飪食譜。它允許你定義一個包含一系列資料庫操作的過程,例如插入、更新、刪除或查詢數據。一旦你定義了存儲過程,你可以通過簡單地調用存儲過程的名稱來執行其中的操作。

CREATE PROCEDURE GetUsersByAge
    @Age INT
AS
BEGIN
    SELECT Name, Age, Email
    FROM Users
    WHERE Age = @Age
END

在上面的代碼中,我們首先使用CREATE PROCEDURE語句創建了一個名為"GetUsersByAge"的存儲過程。它接受一個@Age參數,用於指定要查詢的年齡。

在存儲過程的主體部分,我們使用SELECT語句從"Users"表中選擇滿足指定年齡的用戶信息,並將結果返回。

完成後,我們可以通過以下方式調用這個存儲過程:

EXEC GetUsersByAge @Age = 25

4. 視圖和表的區別

  表是資料庫中的實際對象,用於存儲和組織數據,而視圖是基於一個或多個表的查詢結果構建而成的虛擬表。表存儲了實際的數據,而視圖僅存儲了查詢定義。

表可以直接進行數據的增刪改查操作,而視圖提供了對數據的抽象視圖,可以進行篩選、排序、連接等操作,並以表的形式返回結果。此外,

視圖還提供了更細粒度的數據安全性和許可權控制。

5. count(*) 和count(1) 的區別

COUNT(*)是一種通用的寫法,它用於計算滿足條件的所有行的數量,包括那些具有NULL值的行。它會對錶中的每一行進行計數,不考慮具體的列值。因此,COUNT(*)會掃描整個表,並返回表中的總行數。

COUNT(1)是一種優化的寫法,它通過使用常量值1來進行計數。因為每一行都存在一個常量值1,所以COUNT(1)實際上是對每一行進行計數。與COUNT(*)相比,使用COUNT(1)可以稍微提高一點性能,因為它不會關心具體的列值或NULL值,只需簡單地計算行的數量。

儘管在大多數情況下,COUNT(*)COUNT(1)的效果是相同的,但在某些特定資料庫中,優化器可能對它們進行不同的優化處理,可能會有微小的性能差異。

6. 索引和主鍵的區別

  索引是一種用於提高資料庫查詢性能的數據結構,它可以加速數據的定位和訪問。主鍵是一種用於標識表中唯一記錄的約束,它保證表中每行的唯一性和非空性。索引可以是唯一或非唯一

的,而主鍵是一種特殊的唯一索引。索引和主鍵在資料庫中起著不同的作用,並且可以根據具體需求和查詢優化的需要來選擇使用。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 針對工業來講,特殊是流程行業,視圖建模(Web組態)是必不可少應用場景,因為有很多工序要直觀的展示工藝流程圖。該功能也廣泛應用在:鋼鐵、煤炭、水務、中醫葯、能源、航天、加工製造、風電、儲能等領域。 ...
  • 前言 組合模式,英文名稱是:Composite Pattern。當我們談到這個模式的時候,有一個物件和這個模式很像,也符合這個模式要表達的意思,那就是“俄羅斯套娃”。“俄羅斯套娃”就是大的瓷器娃娃裡面裝著一個小的瓷器娃娃,小的瓷器娃娃裡面再裝著更小的瓷器娃娃,直到最後一個不能再裝更小的瓷器娃娃的那個 ...
  • 引子 "某呼"網友提問“C#為什麼非要把函數叫方法?”,看到這個問題還真不知道怎麼回答。要想知道C#為什麼叫方法,還得從傳統面向過程語言說起。 方法的由來 函數(function)是面向過程編程語言里,對可以獨立調用代碼段的另一種叫法,因為通常有數個輸入和一個輸出,很像數學里的那個函數。比如C語言中 ...
  • 在前面隨筆《循序漸進介紹基於CommunityToolkit.Mvvm 和HandyControl的WPF應用端開發(1)》中介紹了Mvvm 的開發,以及一些界面效果,本篇隨筆繼續深入探討基於CommunityToolkit.Mvvm 和HandyControl的WPF應用端開發,介紹如何整合Sql... ...
  • 文件與文件流的區別(自己的話): 在軟體開發過程中,我們常常把文件的“讀寫操作”,與“創造、移動、複製、刪除操作”區分開來。其中,文件的“讀寫操作”是由System.IO命名空間下fileStream類控制的。而文件的“創造、移動、複製、刪除操作”是由file類控制的。 當然了,還有很多和這兩個類功 ...
  • 1、背景描述 出於安全考慮,需要禁止使用root用戶通過ssh遠程登錄Linux 禁用root用戶遠程登錄後,需要提供一個許可權用戶用於ssh遠程登錄 2、創建擁有sudo許可權的用戶 2.1、創建一個普通用戶rain useradd命令用於創建一個用戶, 選項 -m 表示創建用戶的主目錄, -c 表示 ...
  • Intel 海光 鯤鵬920 飛騰2500 CPU性能對比 為了讓程式能快點,特意瞭解了CPU的各種原理,比如多核、超線程、NUMA、睿頻、功耗、GPU、大小核再到分支預測、cache_line失效、加鎖代價、IPC等各種指標(都有對應的代碼和測試數據)都會在這系列文章中得到答案。當然一定會有程式員 ...
  • 1. ENUM(枚舉) 1.1. MySQL在存儲枚舉時非常緊湊,會根據列表值的數量壓縮到1或者2位元組中 1.2. 轉換為ENUM會使表變小 1.3. 如果表中有其他索引,減少主鍵大小也會使這些非主鍵索引小得多 1.4. ENUM列可以存儲一組預定義的不同字元串值 1.5. ENUM欄位是根據內部整 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...