Redis資料型別之字串

2021-12-29 22:15:55 字數 1658 閱讀 1678

redis的字串不是c語言原生的字串,而是自己構建的稱為簡單動態字串(****** dynamic string),簡稱 sds,和c語言原生的字串相似,使用』\0』作為結尾。

除了列印日誌之外,我們操作字串基本是在使用sds

sds的在redis的主要功能

1. 儲存資料庫的字串值

2. 用作緩衝區buffersds在redis的定義

在原始碼包下面的src目錄下的sds.h 和sds.c

typedef char *sds;

/*** 儲存字串物件的結構

*/struct sdshdr ;為什麼使用sds而不是c語言原生的字串?

sds有一下特點

獲取字串長度的時間複雜度是o(1)

c語言本省並不攜帶自身的長度屬性,所以要獲取長度必須要遍歷一次,這個複雜度是o(n)/**

* 返回實際的長度

*/static inline size_t sdslen(const sds s) 防止快取區溢位

這個由c語言的一些列不安全的字串操作函式可以看出,比如strcat(char* dest,const char* src)看看sds.c中的sdscat()

//函式原型

sds sdscat(sds s, const char *t);

//具體實現

sds sdscat(sds s, const char *t)

//sdscatlen

sds sdscatlen(sds s, const void *t, size_t len) 可以看到,sds在進行拼接的時候,首先獲取原字串的長度,然後進行擴充套件。

3. 減少修改字串時的記憶體重新分配

c語言的字串的首先還是依靠字元陣列,長度為n的字串對應的是乙個長度為n+1的字元陣列,所以,在對字串進行操作時,都會發生對字元陣列的記憶體重新分配。

對於記憶體的重新分配,一般設計複雜的演算法和系統呼叫,相對比較耗時,偶爾一次的重新分配還可以接受,但是對於redis,頻繁的操作,肯定效率非常低下。

還記得sds的結構體麼?儲存了乙個未使用的空間。sds通過這個來遮蔽了與底層陣列的關聯 。

那麼sds如何使用這個free來實現減少記憶體重新分配?

方法一、記憶體預分配。 優化sds的增長操作

簡單的說,就是redis api 在修改sds的時候,如果有涉及對sds長度進行擴充套件,那麼,同時擴充套件sds的free空間長度。如果free足夠,那麼就使用free空間。

那麼擴充套件多少?free與length又有什麼大小關係?

- 如果擴充套件之後的sds小於1m,那麼,擴充套件之後的free==length,總的記憶體大小是 free+length+1byte

- 如果擴充套件之後的sds大於於1m,那麼,free的大小是1m,總長度是1m+length+1byte

方法二、惰性空間釋放 優化sds的縮短操作

簡單的說,就是redis api 在截斷sds的時候,程式並不立即**多出來的記憶體,而是使用free屬性來儲存這些空間。

實現**

sds sdstrim(sds s, const char *cset) 二進位制安全

c語言的字串只能用來儲存ansi字元,因為不能包含空字元。

所有的sds的api都會以處理二進位制的方式來處理儲存在sds位元組陣列的資料,不對這些資料進行任何的處理。

相容部分c語言的字串。

Redis資料型別(字串)

redis存放的字串為二進位制是安全的。字串長度支援到512m。遞增數字incr key 當儲存的字串是整數時,redis提供了乙個實用的命令 incr 其作用是讓當前鍵值遞增,並返回遞增後的值。從例子可以看出,如果num不存在,則自動會建立,如果存在自動 1。127.0.0.1 6379 keys...

Redis資料型別 String字串

redis基礎 redis預設支援16個資料庫,連線預設選擇0庫 redis資料型別 字串 介紹 字串型是redis中最基本的資料型別,它能儲存任何型別的字串,包括二進位制資料。可以儲存郵箱 json化的字串和。乙個鍵最大儲存容量為512m。常用的key命名規則 物件型別 物件id 物件屬性,多個單...

Redis基本資料型別 字串型別

字串型別是redis中最基本的資料型別,它可以儲存任何形式的字串,包括二進位制資料。其他的型別都是以字串型別為基礎,可以看作是字串型別的不同組織形式。1 賦值與取值格式 redis set key value 單個key賦值 redis mset key1 value1 key2 value2 ke...