redis——string類型的設計與實現

Redisstring類型可以保存任何數據,包括圖片、視頻,是用二進制形式存儲的

Redis String無前綴,對於不存在的key都會創建指定的key

命令

效果

備註

set key value

設置對應的keyvalue

 set name lzj

get key

獲取對應keyvalue

 get name

setnx key value

如果key已經存在,則不執行並返回0

set if not exists

setex key time value

設置鍵值對並且設置有效期,單位爲s

 setex name 10 lzj

setrange index str

從指定下標開始替換字符(6則從第七個字符開始替換)

剩餘的字符串不會被刪除

 setrange name 0 L

把首字母大寫

mset key1 value1 key2 value2

一次設置多個key的值10×,會覆蓋已經存在的key

mset name lzj sex man

mget key1 key2

一次獲取多個key的值

 mget name sex

getset

設置key的值,返回key的舊值

 gettest name

getrange key start end

獲取子字符串

 getrange name 0 2

incr key

key的值做加加操作,並返回新的值

可以通過負數來實現減法

 incr age

incrby

添加指定的值 

 incrb key 2

decr decrby

 

 

append key value

給指定key的字符串追加value,返回新字符串值的長度

 append name zzzz

strlen key

取指定keyvalue值的長度

 strlen name

 

 



redis中string的實現

redis自己構建了一種名爲簡單動態字符串(SDS , simple dunamic string)的抽象類型
將其作爲redis的默認字符串表示
例: 客戶端設置字符串時
set name lzj
鍵值對的鍵是一個字符串對象,底層是保存着字符串"name"的SDS
鍵值對的值也是SDS,保存着"lzj"

SDS的定義

每個sds.h/sdshdr結構表示一個SDS值:
struct sdshdr {
  //記錄buf數組已保存字符的個數
  int len;
  //標識buf數組中剩餘的空間
  int free;
  //保存字符串的字節數組
  char buf[];
}


SDS遵循C字符串以空字符結尾的慣例,保存空字符('\0')的1字節空間不包含在len裏面

SDS的空間分配規則:
1.如果SDS修改後len小於1MB,則free變爲修改後的len長度
即原來len==5,修改後len==10,則修改後 SDS = len(10) + free(10) + 1

2.如果SDS修改後len>=1MB,則每次擴展1MB












發佈了39 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章