Redis-第九章節-動態字元串

目錄

  • 概述
  • SDS(動態字元串)
  • SDS(動態字元串)與c語言字元串的區別

1、概述

String類型底層實現的簡單動態字元串sds,是可以修改的字元串。它採用預分配冗餘空間的方式來減少記憶體的頻繁分配。

2、SDS動態字元串

動態字元串是以 \0 為分隔符。最大容量是redis主動分配的一塊記憶體空間,實際存儲內容是具體的存的數據。

3、SDS(動態字元串)與c語言字元串的區別

1、獲取存儲長度不同

c語言:c語言不記錄長度資訊,如果要獲取字元串的長度,需要遍歷所有的字元串,才能獲取字元串的長度。獲取長度的複雜度為 O(n)
sds(動態字元串):sds存儲了字元串的長度,獲取長度的複雜度為 O(1)

2、快取溢出

c語言:c語言不記錄長度,在執行strcat函數時,假設分配了記憶體,存儲的內容比已經分配的記憶體多時,這個時候就會出現緩衝區溢出現象。
sds(動態字元串):sds存儲內容時,先檢查內容的存儲是否能夠存儲下實際的值,如果不能存儲實際的值,就先擴展快取區域,再將值存儲到緩衝區域中。

3、記憶體的開闢和釋放

c語言:需要自己主動釋放或者擴展記憶體,如果不能夠主動釋放或者擴展記憶體,就會出現緩衝溢出或者泄露。
sds(動態字元串):sds採取下面的方式

1、空間預分配

  // 先進行記憶體區域進行擴展,然後在執行下面的程式碼
  public void  test(){
    if(len < 1M){
       //程式分配和len屬性一樣的大小未使用的空間。
    }else if(len > 1M){
       //程式分配1M 未使用的空間。
    }
 }

2、惰性空間釋放
在修改字元串時,如果實際的內容要比老的數據小,先不將緩衝區的空閑記憶體釋放掉,等下次存儲內容時再進行空間的釋放或者擴展。

4、二進位安全

c語言:C語言必須存儲指定的格式數據。
sds(動態字元串):SDS不會對數據限制。

-END-

您好,我是一個Java小白,希望和大家一起在技術的道路上一快快樂的學習。希望與您在網路的世界上會面。