資料庫基礎面試第四彈

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...