主頁 > 資料庫 > 我的字符陣列的最后一個字符被排除在外

我的字符陣列的最后一個字符被排除在外

2022-06-21 10:31:30 資料庫

int n;
cin>>n;
cin.ignore();

char arr[n 1];
cin.getline(arr,n);
cin.ignore();
cout<<arr;

輸入:一年中的 11

輸出:年度

我已經為空字符提供了 n 1 。那為什么我的最后一個角色被排除在外了?

uj5u.com熱心網友回復:

您為陣列分配n 1了字符,但隨后您告訴getline只有n字符可用。它應該是這樣的:

int n;
cin>>n;
cin.ignore();

char arr[n 1];
cin.getline(arr,n 1);  // change here
cin.ignore();
cout<<arr;

uj5u.com熱心網友回復:

根據 cppreference.com:

https://en.cppreference.com/w/cpp/io/basic_istream/getline

表現為UnformattedInputFunction在構造和檢查哨兵物件后,從陣列的第一個元素指向的連續位置中提取字符*this并將它們存盤s,直到發生以下任何情況(按所示順序測驗):

  1. 檔案結束條件出現在輸入序列中(在這種情況下setstate(eofbit)執行)
  2. 下一個可用字符c是分隔符,由 . 確定Traits::eq(c, delim)分隔符被提取(與 不同basic_istream::get())并計入gcount(),但不存盤。
  3. count-1字符已被提取(在這種情況下setstate(failbit)被執行)。

如果函式沒有提取字符(例如,如果count < 1)setstate(failbit)執行。

在任何情況下,如果count > 0,它將空字符 CharT() 存盤到陣列的下一個連續位置并更新gcount()

在你的情況下,n=11. 您正在分配n 1(12) 個字符,但告訴getline()只有n(11) 個字符可用,因此它僅將n-1(10) 個字符讀取到陣列中,然后'\0'在第 11 個字符中終止陣列。這就是為什么您缺少最后一個字符的原因。

of the year
         ^
        10th char, stops here

您需要 1在呼叫時getline(),以匹配您的實際陣列大小:

cin.getline(arr,n 1);

uj5u.com熱心網友回復:

約翰的回答應該可以解決您的問題。出于正當理由,可變長度陣列(您的char arr[n 1])不是 C 標準的一部分然而,我花了幾個小時的時間超出了問題的范圍并創建了...

C I/O 學生指南

...和一般的 I/O,重點是I部分。不要害怕,用 C 的方式來做吧!以下片段應使用符合標準的 C 編譯器進行編譯。

C I/O 和標準庫

文本輸入

這是在 C (最廣泛的文本編碼)中讀取UTF-8 編碼字串的推薦方法。我們將std::string用于存盤,這是保存 UTF-8 編碼字串的事實上的方式,以及std::getline用于讀取本身。

#include <iostream> // std::cin, std::cout, std::ws
#include <string>   // std::string, std::getline

int main() {
    int size;
    // std::ws ignores all whitespace in the stream,
    // until the first non-whitespace character.
    // it's prettier and handles cases a simple .ignore() does not.
    std::cin >> size >> std::ws;

    std::string input;
    std::getline(std::cin, input);

    // This condition will most certainly be true (output will be 1).
    std::cout << (size == input.size()) << '\n';
}

std::string是動態分配的,或者,你可能聽說過,在堆上這是一個廣泛的主題,因此請從這個給定的起點隨意冒險!這對我們有什么幫助?我們可以提前在堆上存盤大小未知的字串,因為我們總是可以重新分配更大的緩沖區!std::getline在讀取輸入時分配和重新分配,直到到達換行符,因此您可以在size事先不知道的情況下閱讀。size假設這是一個提供輸入長度的學校練習,因為您可能沒有教過動態記憶體,因此您的變數很可能與字串的大小相等。不過,這是有充分理由的——它很復雜,并且會不必要地分散實際主題(演算法、資料結構等)的注意力。請記住:std::strings 與 C 風格的字串不同,它不是以 null 結尾的,但是您可以std::string通過呼叫.c_str()方法從 an 中獲取以 null 結尾的 C 風格的字串。

二進制資料

什么是二進制資料所有不是文本的東西:影像、視頻、音樂、2003 MS Word 檔案(.doc那些,等到你看到什么.docx)等等。通常將二進制存盤為原始位元組,這是一種表示數字的奇特方式。unsigned char是用于表示這些原始位元組的 C/C 型別(std::byte為此目的引入了 C 17。為了處理來自二進制輸入的資料,我們需要將其存盤在記憶體中的某個位置——堆疊或堆上。我們可以一次存盤整個輸入,但是二進制檔案被認為太大了(實際上,考慮到電影的大小!),所以我們通常以塊的形式讀取它- 這意味著,我們一次只讀取它的有限部分(比如 256 個字符,這是我們的緩沖區),并且我們一直讀取直到我們到達輸入的末尾(通常稱為檔案結尾或簡稱 EOF)。根據經驗,當緩沖區很小且是靜態的(不需要調整大小,如我們上面的字串)時,我們可以將其存盤在堆疊中。如果其中任何一個條件不滿足,它就會進入堆。我們應該注意到,的概念非常依賴于背景關系 - 編譯器、作業系統、硬體、運行時環境(請參閱有關堆疊大小限制嵌入式系統的執行緒)。您將選擇的緩沖區大小也是特定于任務的,因此這里也沒有規則。現在讓我們看一些代碼!

#include <array>   // std::array
#include <fstream> // std::ifstream, std::ofstream

int main() {
    // We open this file in binary mode.
    // The default mode may modify the input.
    std::ifstream input{"some_image.jpg", std::ios::binary};
    // 256 is our buffer size, unsigned char is the array type.
    // This is the C   way of `unsigned char buffer[256]`.
    std::array<unsigned char, 256> buffer;

    while (input.read(buffer.data(), buffer.size())) {
        // Buffer is filled, do something with it
    }

    // At this point, either EOF is reached or an error occurred.
    if (input.eof()) {
        // Less characters than the buffer's size have been read.
        // .gcount() returns the number of characters read by
        // the last operation.
        const std::streamsize chunk_size = input.gcount();
        // Do something with these characters, as in the loop.
        // Valid range to access in the buffer is [0, chunk_size).
        // chunk_size can be 0, too. In that case, there is no more data
        // to handle.
    } else {
        // Some other failure, handle error.
    }
}

此代碼段使用 256 位元組的小型堆疊分配緩沖區讀取檔案。std::array使用它的方法使使用變得方便和安全 - 閱讀鏈接的檔案!如果我們想使用一個大緩沖區(比如 16MB),我們將 替換std::arraystd::vector

std::vector buffer(1 << 24); // 1 << 24 gives 16MB in bytes

休息也是一樣。您也可以std::string在此處使用,因為std::string這并不意味著/強制輸入 UTF-8 編碼。有一個約定可以在代碼中輕松區分二進制資料和文本資料是很有用的。需要注意的是,讀取較小的塊使用較少的空間,但需要更多的時間——從檔案中讀取位元組涉及分別從硬碟驅動器SSD讀取時進行作業系統系統呼叫和移動磁盤或電子C 的物件已經為您進行緩沖以加快讀取速度,這通常是急需的優化。你會知道這是否會影響你。fstream

另一件需要注意的是EOF和錯誤處理,使用.eof()方法。我們在文本輸入檢索中省略了錯誤處理,但是如果我們不想丟失資料,我們不得不這樣做。達到時EOF,通常讀取的位元組數少于緩沖區大小,因此我們需要一種方法來了解緩沖區中有多少已被資料填充。這就是.gcount()告訴我們的。根據您正在制作的程式,如果緩沖區被部分填充(回傳非 0 值) ,您可能會將EOF錯誤視為“意外” - 例如,根據假定的規則,讀取的資料不完整.gcount()在資料應該結束之前到達檔案末尾之后創建。除此之外,EOF是完全讀取后所有檔案都在的條件。

C 風格 I/O

這可能看起來更接近學校所教的內容。正如我們已經解釋了上面的一般概念,本節將在編碼和代碼解釋方面更加豐富。我們仍然使用 C 作為一種語言,因此將使用 C 版本的 C 頭檔案和std命名空間 - 讓后面的代碼在 C 編譯器中作業,用型別和函式替換<csomething>頭檔案<something.h>并洗掉std::命名空間前綴。讓我們深入了解它!

文本輸入

C 中的 C 流(std::cin、std::fstream 等)的等價物是std::FILE. FILEs 默認情況下被緩沖,C 流也是如此。我們將std::fscanf用于讀取輸入的大小,它只是scanf將您從中讀取的流作為引數,并std::fgets用于讀取文本行。

#include <cstdio>  // std::FILE, std::fscanf, std::fgets, stdin
#include <cstring> // std::strcspn

// discard_whitespace does what std::ws did above.
// It consumes all whitespace before a non-whitespace
// character from stream f.
void discard_whitespace(std::FILE* f) {
    char discard;
    // The leading space in the format string
    // tells fscanf to consume all whitespace.
    std::fscanf(f, " %c", &discard);
}

int main() {
    int size;
    // stdin is a macro, doesn't have a namespace,
    // hence no std:: prefix.
    std::fscanf(stdin, "%d", &size);
    // fscanf, like std::cin, doesn't consume whitespace
    discard_whitespace(stdin);

    // Your school exercise will probably have a size limit for the input.
    // We consider it to be 256.
    const int SIZE_UPPER_BOUND = 256;
    // We add some extra bytes so the maximum length input can be accomodated.    
    // 1 is added for the null terminator of C-style strings.
    // The other 2 is because `fgets` will also read the newline,
    // which can be \n or \r\n, depending on OS. See explanation after code.
    char input[SIZE_UPPER_BOUND   3];

    // The actual read - sizeof gets the size of our input buffer,
    // we don't have to write it twice.
    std::fgets(input, sizeof input, stdin);
    // fgets also reads the newline, unlike `std::getline` or
    // `std::cin.getline` - we have to remove it ourselves.
    input[std::strcspn(input, "\r\n")] = '\0';

    // This condition will be true, as in the C   example.
    std::fprintf(stdin, "%d\n", std::strlen(input) == size);
}

讓我們解開換行洗掉。std::strcspn查找輸入中任何給定字符的第一個位置。我們同時提供\rand\n來支持 UNIX ( \n) 和 Windows ( \r\n) 換行符終止符 - 是的,它們是不同的,請參閱 Wikipedia 上的“換行符”通過添加空終止符'\0',我們將字串的結尾移到換行符所在的位置,基本上是“洗掉”換行符。如果這是一個學校作業,我們可以假設輸入是正確的,所以我們可以使用size 1而不是std::strcspn洗掉換行符:

input[size   1] = '\0';

This doesn't work when we don't know the input size or the input may be invalid. As an optimization trick, observe that std::strcspn returns the line length, in this case. When you don't know the size, but you need it for later, you can save the result of std::strcspn in a variable before, and then use it instead of std::strlen:

// std::size_t is an unsigned integral type, used to represent
// array sizes and indexes in C/C  
const std::size_t input_size = std::strcspn(input, "\r\n");
input[input_size] = '\0';

You'll see some people use 0 or NULL for the terminator. I recommend against it - unlike the \0 literal, that is of char type, the other two variants are implicitly casted to char. If you read the linked documentation, you'll realize NULL is even incorrect, according to the spec, as it's meant to be used in contexts that require pointers only.

An alternative method to fgets is fscanf, again. Thread carefully, though - while a simple %s may do it, it makes your code vulnerable to buffer overflow exploits. See this StackOverflow thread on disadvantages of scanf, too. Let's see the (safe) code:

std::fscanf(stdin, "%6[^\r\n]s", input);

該數字將輸入大小限制為我們的SIZE_UPPER_BOUND,并且[^\r\n]告訴fscanf讀取所有字符到\ror \n使用此方法,您可以洗掉discard_whitespace呼叫,因為fscanf動詞%s消耗前導空格。缺點是您必須保持輸入字串中的大小限制和緩沖區大小同步 - 除了動態構建格式字串fscanf之外,您無法動態指定輸入大小,這對于學校作業來說太過分了)。這在更大的代碼庫中是一個問題,但對于一個檔案、一次性的學校作業來說,這并不是什么大問題,所以你可能更喜歡因為它的作業量更少。也不讀取緩沖區中的換行符。fscanffgetsfscanf

二進制資料

std::cin.readC 世界中 C 的等價物是std::fread. 代碼將類似于它的 C 對應物:

#include <cstdio>

int main() {
    // The second parameter is the file access mode.
    // In this case, it is read (r) binary (b).
    std::FILE* f = std::fopen("some_image.jpg", "rb");
    unsigned char buffer[256];

    std::size_t chunk_size;
    while (chunk_size = std::fread(buffer, sizeof buffer[0], sizeof buffer, f)) {
        // chunk_size == sizeof buffer, do something with the buffer
    }

    if (std::feof(f)) {
        // chunk_size != sizeof buffer, do something with buffer
        // or handle as error
    } else {
        // an error occurred, handle it
    }

    // We need to close the file, unlike in C  , where it is closed automatically.
    std::fclose(f);
}

的論點std::fread是毛茸茸的:閱讀檔案。從回圈到錯誤處理,其他一切看起來都非常類似于 C 方式。為什么?因為它實際上是同一件事——我們只是使用不同的(標準)庫。另一個相似之處是 CI/O 在默認情況下也是緩沖的,就像 C 一樣。不同的是最后的行 - 呼叫std::fclose. 我們沒有在 C 代碼中做任何類似的事情,對吧?不。請記住,C 類具有建構式析構函式,它們分別在變數生命周期的開始和結束時自動呼叫。這兩個允許我們實作RAII 技術,它將自動進行資源管理(在建構式中打開檔案,在解構式中關閉它)。RAII 用于內部std::stringstd::vector(以及其他容器智能指標和其他)。換句話說, 的解構式std::ifstream在 結尾處關閉檔案main(),就像我們在這里所做的那樣,手動關閉檔案。

混合方法(??)

你想把兩者結合起來嗎?所以它看起來。先說缺點:

  • C I/O 庫,由于它的構建方式,與 C 的 (函式呼叫和額外的函式呼叫相比,特別是在使用運算子和流操作符時,更注意以高性能方式使用,因為它們中的每一個都是一個函式呼叫,與使用 C 庫的單個普通函式呼叫/操作相比)。也可以在 i/ostream speed 上查看這個 StackOverflow 執行緒C 庫也更冗長,尤其是在輸出的情況下(聽說過“雪佛龍地獄”嗎?)virtual <<>>
  • CI/O 庫很容易使用不當/不安全,簡潔的簡寫命名使代碼難以遵循,并且輸出無法擴展以支持自定義型別(這是在 C 中使用 C 樣式 I/O 時的問題)。malloc考慮到在 C 中管理堆記憶體的唯一方法是andfree,正確處理動態緩沖區也需要非常小心
  • 如果std::string在視線中留下任何痕跡(或者我聽說過),有些學校可能會把你釘在十字架上
  • 使用 C 風格的型別(例如,char[N]而不是std::array<char, N>)更容易 - 無需包含標頭,因為型別是內置的原始型別,并且型別較少。在學校演算法練習等簡短的一次性程式中可能是首選。

有了這些,我們就可以看看在閱讀文本和二進制時如何方便地將兩者結合起來!

文本輸入

我們將利用 C 風格型別的簡潔性和 C 的 I/O 庫的易用性:

#include <iostream>

int main() {
    int size;
    std::cin >> size >> std::ws;

    const int SIZE_UPPER_BOUND = 256;
    char input[SIZE_UPPER_BOUND   1];

    std::cin.getline(input, sizeof input);
    // Input done, solve the problem.
}

老師們不必為您在這個兔子洞中潛水后開始使用的所有標準庫惡作劇而撓頭std::stringstd::getline作為程式員,您不必為了讀取字串和 int 就清理換行符結尾并記住晦澀難懂的格式說明符。專注于代碼并解決問題,而無需除錯輸入讀取邏輯,永遠 - 它只是作業!

二進制資料

C 的 I/O 庫型別的錯綜復雜的層次樹讓你害怕,喜歡干凈的匯編輸出,就像 Linus Torvalds 一樣你還是有點害怕手動管理記憶體,所以你選擇了這個解決方案:

#include <cstdio>
#include <vector>

int main() {
    // The second parameter is the file access mode.
    // In this case, it is read (r) binary (b).
    std::FILE* f = std::fopen("some_image.jpg", "rb");
    std::vector<unsigned char> buffer(1 << 24);

    std::size_t chunk_size;
    while (chunk_size = std::fread(buffer.data(), sizeof buffer[0], buffer.size(), f)) {
        // use the buffer
    }

    if (std::feof(f)) {
        // handle EOF
    } else {
        // handle error
    }

    std::fclose(f);
}

奇怪的選擇,因為您仍然手動管理檔案的生命周期。雖然這可能不是最好的例子,但將 C RAII 容器與 C 庫一起使用并不少見——記憶體安全至關重要。

瑣事

  • 像往常一樣,權衡你的決定using namespace std;

你不需要的很酷的東西:

  • 在程式開頭使用一行來加速 C I/O (但要小心
  • 禁用 CI/O 緩沖
  • 禁用 C I/O 緩沖

結論

I/O 是基本 CS 概念、硬體和軟體內部作業以及 C 的特性和怪癖的擁擠交匯點。一次盡你所能,專注于重要的事情,并確保你建立在堅實的基礎之上。

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/493794.html

標籤:C 数组

上一篇:檢查向量是否通過頂點c

下一篇:如何在UDP套接字通信中進行多客戶端

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more