【Redis】數(shù)據(jù)結(jié)構(gòu)---String-創(chuàng)新互聯(lián)

文章目錄
    • String(字符串)
      • 1.Redis 鍵(key)
      • 2.String(字符串)
        • 2.1常用命令
        • 2.2.String底層結(jié)構(gòu)
      • 3.空間分配策略
        • 3.1空間預(yù)分配
        • 3.2惰性空間釋放
        • 3.3為什么SDS的大長度是512M?
      • 4.SDS面試題

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比商洛網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式商洛網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋商洛地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。String(字符串) 1.Redis 鍵(key)
  • keys *查看當(dāng)前庫所有key (匹配:keys *1)
  • exists key判斷某個key是否存在
  • type key 查看你的key是什么類型
  • del key 刪除指定的key數(shù)據(jù)
  • unlink key 根據(jù)value選擇非阻塞刪除。僅將keys從keyspace元數(shù)據(jù)中刪除,真正的刪除會在后續(xù)異步操作。
  • expire key 10 10秒鐘:為給定的key設(shè)置過期時間
  • ttl key 查看還有多少秒過期,-1表示永不過期,-2表示已過期

image-20221130014337304

執(zhí)行上面的操作

image-20221130015234931

2.String(字符串)

String是Redis最基本的類型,一個key對應(yīng)一個value。

String類型是二進(jìn)制安全的。意味著Redis的string可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對象。

String類型是Redis最基本的數(shù)據(jù)類型,一個Redis中字符串value最多可以是512M

2.1常用命令

set 添加鍵值對

image-20221130021209021

關(guān)于set的其他參數(shù)

  • NX:當(dāng)數(shù)據(jù)庫中key不存在時,可以將key-value添加數(shù)據(jù)庫
  • *XX:當(dāng)數(shù)據(jù)庫中key存在時,可以將key-value添加數(shù)據(jù)庫,與NX參數(shù)互斥
  • EX:key的超時秒數(shù)
  • PX:key的超時毫秒數(shù),與EX互斥

get 查詢對應(yīng)鍵值

append 將給定的 追加到原值的末尾

strlen 獲得值的長度

setnx 只有在 key 不存在時 設(shè)置 key 的值

image-20221130022154240

數(shù)字類型的命令:

incr

  • 將 key 中儲存的數(shù)字值增1
  • 只能對數(shù)字值操作,如果為空,新增值為1

decr

  • 將 key 中儲存的數(shù)字值減1
  • 只能對數(shù)字值操作,如果為空,新增值為-1

incrby / decrby<步長>將 key 中儲存的數(shù)字值增減。自定義步長。

  • 注意:INCR類型的命令是原子的,Redis單命令的原子性主要得益于Redis的單線程。

image-20221130022352456

mset …

  • 同時設(shè)置一個或多個 key-value對

mget …

  • 同時獲取一個或多個 value

image-20221130022635543

msetnx …

  • 同時設(shè)置一個或多個 key-value 對,當(dāng)且僅當(dāng)所有給定 key 都不存在。
  • 該命令具有原子性:其中有一個key是存在的,則都創(chuàng)建失敗

image-20221130022855031

getrange<起始位置><結(jié)束位置>

  • 獲得值的范圍,類似C++中string類的substr。

setrange<起始位置>

  • 用 覆寫所儲存的字符串值,從<起始位置>開始(索引從0****開始)。

image-20221130023035175

setex<過期時間>

  • 設(shè)置鍵值的同時,設(shè)置過期時間,單位秒。

getset

  • 以新?lián)Q舊,設(shè)置了新值同時獲得舊值。
2.2.String底層結(jié)構(gòu)

Redis是用C語言寫的,但是對應(yīng)Redis的Sting,并不是C 語言中的字符串(即以空字符’\0’結(jié)尾的字符數(shù)組);Redis自定義了數(shù)據(jù)結(jié)構(gòu)SDS(simple dynamic string)【簡單動態(tài)字符串】,并將 SDS 作為 Redis的默認(rèn)字符串表示。

struct sdshdr{//記錄 buf 數(shù)組中未使用字節(jié)的數(shù)量
     int free;
    
    //記錄buf數(shù)組已使用字節(jié)的數(shù)量
    //等于 SDS 保存字符串的長度
     int len;
        
     //字節(jié)數(shù)組,用于保存字符串
     char buf[];	//柔性數(shù)組
}

image-20221130024613783

  • len為字符串的實(shí)際長度,保證了獲取字符串長度時為O(1)操作
  • free為buf數(shù)組中剩余的空間大小
  • buf 保存字符串的數(shù)組
  • 如果長度不夠,會主動申請空間
  • redis實(shí)際開辟的空間為len+free

優(yōu)點(diǎn):

減少修改字符串的內(nèi)存重新分配次數(shù)

C語言字符串由于不記錄字符串長度,所以如果要修改字符串,必須重新分配內(nèi)存(先釋放再申請)。因?yàn)槿绻麤]有重新分配,字符串長度增大時會造成內(nèi)存緩沖區(qū)溢出,字符串長度減小時會造成內(nèi)存泄露。

對于SDS,由于len屬性和free屬性的存在,對于修改字符串SDS實(shí)現(xiàn)了空間預(yù)分配和惰性空間釋放兩種策略:

  • **空間預(yù)分配:**對字符串進(jìn)行空間擴(kuò)展的時候,擴(kuò)展的內(nèi)存比實(shí)際需要的多,這樣可以減少連續(xù)執(zhí)行字符串增長操作所需的內(nèi)存重分配次數(shù)。
  • **惰性空間釋放:**對字符串進(jìn)行縮短操作時,程序不立即使用內(nèi)存重新分配來回收縮短后多余的字節(jié),而是使用 free 屬性將這些字節(jié)的數(shù)量記錄下來,等待后續(xù)使用。

二進(jìn)制安全

  • C字符串以空字符作為字符串結(jié)束的標(biāo)識,而對于一些二進(jìn)制文件(如圖片等),內(nèi)容可能包括空字符串,因此C字符串無法正確存?。?/li>
  • 而所有 SDS 的API 都是以處理二進(jìn)制的方式來處理 buf 里面的元素,**并且 SDS 不是以空字符串來判斷是否結(jié)束,而是以 len 屬性表示的長度來判斷字符串是否結(jié)束。**所以SDS可以保存圖片、音頻等文件內(nèi)容。
3.空間分配策略 3.1空間預(yù)分配

C++中數(shù)組在進(jìn)行擴(kuò)容時,往往會申請一個更大的數(shù)組,然后把數(shù)組拷貝過去。Redis同樣基于這種策略提高了空間預(yù)分配機(jī)制。

當(dāng)執(zhí)行字符串增長操作并且需要擴(kuò)展內(nèi)存時,程序不僅僅會給SDS分配必需的空間還會分配額外的未使用空間,其長度存到free屬性中。具體如下:

  • **如果修改后len長度將小于1M,這時分配給free的大小和len一樣;**例如修改過后為10字節(jié), 那么給free也是10字節(jié),buf實(shí)際長度變成了10+10+1 = 21byte(別忘記了\0的存在)
  • **如果修改后len的長度大于等于1M,這時分配給free的長度為1M;**例如修改過后為30M,那么給free是1M.buf實(shí)際長度變成了30M+1M+1byte

image-20221130031707362

3.2惰性空間釋放

惰性空間釋放用于字符串縮短的操作。當(dāng)字符串縮短是,程序并不是立即使用內(nèi)存重分配來回收縮短出來的字節(jié),而是使用free屬性記錄起來,并等待將來使用。

image-20221130031932892

3.3為什么SDS的大長度是512M?

Redis字符串使用int類型表示長度,一共有32個比特位。2^32字節(jié)=512M

4.SDS面試題

1.SDS如何兼容C語言字符串?如何保證二進(jìn)制安全?

C99中提到,結(jié)構(gòu)體的最后一個成員如果是一個數(shù)組,大小不確定,那么就是一個柔性數(shù)組。

SDS對象中的buf是一個柔性數(shù)組,上層調(diào)用時,SDS直接返回了buf。由于buf是直接指向內(nèi)容的指針,所以兼容C語言函數(shù)。而當(dāng)真正讀取內(nèi)容時,SDS會通過len來限制讀取長度,而非“\0”,所以保證了二進(jìn)制安全。

2.SDS是如何擴(kuò)容的?

空間預(yù)分配。先判斷擴(kuò)容長度與free的大小關(guān)系,如果夠就直接拼接字符串,如果不夠使用空間預(yù)分配的方式擴(kuò)容。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

當(dāng)前名稱:【Redis】數(shù)據(jù)結(jié)構(gòu)---String-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://muchs.cn/article26/piocg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)軟件開發(fā)、網(wǎng)站收錄品牌網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司