Redis-第九章節-動態字元串
- 2021 年 2 月 20 日
- 筆記
- Storages-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小白,希望和大家一起在技術的道路上一快快樂的學習。希望與您在網路的世界上會面。