新聞中心

創(chuàng)新互聯(lián)建站致力于成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè),成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場(chǎng)競(jìng)爭(zhēng)中脫穎而出。 選擇創(chuàng)新互聯(lián)建站,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!
認(rèn)識(shí)Redis字符串
Redis 使用標(biāo)準(zhǔn) C 語(yǔ)言編寫,但在存儲(chǔ)字符時(shí),Redis 并未使用 C 語(yǔ)言的字符類型,而是自定義了一個(gè)屬于特殊結(jié)構(gòu) SDS(Simple Dynamic String)即簡(jiǎn)單動(dòng)態(tài)字符串),這是一個(gè)可以修改的內(nèi)部結(jié)構(gòu),非常類似于 Java 的 ArrayList。
1) SDS動(dòng)態(tài)字符串
SDS 的結(jié)構(gòu)定義如下:
struct sdshdr{
//記錄buf數(shù)組中已使用字符的數(shù)量,等于 SDS 保存字符串的長(zhǎng)度
int len;
//記錄 buf 數(shù)組中未使用的字符數(shù)量
int free;
//字符數(shù)組,用于保存字符串
char buf[];
從上述結(jié)構(gòu)體可以看出,Redis string 將字符串存儲(chǔ)到字符類型的
buf[]中,并使用
len、
free對(duì)
buf[]數(shù)組的長(zhǎng)度和未使用的字符數(shù)進(jìn)行描述。
下圖展示了 SDS 字符串的結(jié)構(gòu)示意圖:
圖1
上圖 1 存儲(chǔ)了一個(gè)
len為 4 的 “java\0”字符串,并且未使用的字符數(shù)
free為 0。你可能注意到 buf 數(shù)組存儲(chǔ)的字符串仍然以 C語(yǔ)言字符格式的“\0”結(jié)尾的,這樣做的目的是為了能夠重用 C語(yǔ)言庫(kù)
在 C語(yǔ)言中,字符串類型的結(jié)尾以空字符串 ‘\0’來(lái)標(biāo)識(shí)的。但在某些情況下,字符串可能會(huì)包含具有實(shí)際意義的“空字符”,此時(shí) C語(yǔ)言就無(wú)法正確的存取這個(gè)字符了,而 Redis 通過 len 來(lái)標(biāo)識(shí)字符串的總長(zhǎng)度,從而保證了數(shù)據(jù)的二進(jìn)制安全特性。
2) 分配冗余空間
string 采用了預(yù)先分配冗余空間的方式來(lái)減少內(nèi)存的頻繁分配,如下圖所示:
圖2
如圖 2 所示,Redis 每次給 string 分配的空間都要大于字符串實(shí)際占用的空間,這樣就在一定程度上提升了 Redis string 存儲(chǔ)的效率,比如當(dāng)字符串長(zhǎng)度變大時(shí),無(wú)需再重新申請(qǐng)內(nèi)存空間。
3) string自動(dòng)擴(kuò)容
當(dāng)字符串所占空間小于 1MB 時(shí),Redis 對(duì)字符串存儲(chǔ)空間的擴(kuò)容是以成倍的方式增加的;而當(dāng)所占空間超過 1MB 時(shí),每次擴(kuò)容只增加 1MB。Redis 字符串允許的最大值字節(jié)數(shù)是 512 MB。
Redis字符串命令
1) 命令格式
Redis 提供了操作字符串的命令,通過學(xué)習(xí)這些命令我們可以掌握如何使用它們,其語(yǔ)法格式如下:
redis 127.0.0.1:6379> COMMAND KEY_NAME
- COMMAND:表示字符串的命令;
- KEY_NAME:表示 key(鍵)的名稱。
在練習(xí)命令的過程中,大家要善于利用 Redis 客戶端給出的自動(dòng)語(yǔ)法提示,比如
SET命令的格式如下:
127.0.0.1:6379> SET key value [EX seconds|PX milliseconds] [NX|XX]
其中
[]內(nèi)代表可選參數(shù),其含義如下所示:
- EX seconds:設(shè)置指定的過期時(shí)間,以秒為單位;
- PX milliseconds:設(shè)置指定的過期時(shí)間,以毫秒為單位;
- NX:先判斷 key 是否存在,如果 key 不存在,則設(shè)置 key 與 value;
- XX:先判斷 key 是否存在,如果 key 存在,則重新設(shè)置 value。
SET命令演示:在 key 不存在的情況下設(shè)置過期時(shí)間為 60s:
#key的過期時(shí)間為60s,過期后自動(dòng)刪除 redis 127.0.0.1:6379> SET www.biancheng.net "hello編程幫" EX 60 NX OK # 查詢 key 對(duì)應(yīng)的值 redis 127.0.0.1:6379> GET www.biancheng.net "hello編程幫"
2) 常用命令
| 命令 | 說明 |
|---|---|
| SET key value | 用于設(shè)定指定鍵的值。 |
| GET key | 用于檢索指定鍵的值。 |
| GETRANGE key start end | 返回 key 中字符串值的子字符。 |
| GETSET key value | 將給定 key 的值設(shè)置為 value,并返回 key 的舊值。 |
| GETBIT key offset | 對(duì) key 所存儲(chǔ)的字符串值,獲取其指定偏移量上的位(bit)。 |
| MGET key1 [key2..] | 批量獲取一個(gè)或多個(gè) key 所存儲(chǔ)的值,減少網(wǎng)絡(luò)耗時(shí)開銷。 |
| SETBIT key offset value | 對(duì) key 所儲(chǔ)存的字符串值,設(shè)置或清除指定偏移量上的位(bit)。 |
| SETEX key seconds value | 將值 value 存儲(chǔ)到 key中 ,并將 key 的過期時(shí)間設(shè)為 seconds (以秒為單位)。 |
| SETNX key value | 當(dāng) key 不存在時(shí)設(shè)置 key 的值。 |
| SETRANGE key offset value | 從偏移量 offset 開始,使用指定的 value 覆蓋的 key 所存儲(chǔ)的部分字符串值。 |
| STRLEN key | 返回 key 所儲(chǔ)存的字符串值的長(zhǎng)度。 |
| MSET key value [key value ...] | 該命令允許同時(shí)設(shè)置多個(gè)鍵值對(duì)。 |
| MSETNX key value [key value ...] | 當(dāng)指定的 key 都不存在時(shí),用于設(shè)置多個(gè)鍵值對(duì)。 |
| PSETEX key milliseconds value | 此命令用于設(shè)置 key 的值和有過期時(shí)間(以毫秒為單位)。 |
| INCR key | 將 key 所存儲(chǔ)的整數(shù)值加 1。 |
| INCRBY key increment | 將 key 所儲(chǔ)存的值加上給定的遞增值(increment)。 |
| INCRBYFLOAT key increment | 將 key 所儲(chǔ)存的值加上指定的浮點(diǎn)遞增值(increment)。 |
| DECR key | 將 key 所存儲(chǔ)的整數(shù)值減 1。 |
| DECRBY key decrement | 將 key 所儲(chǔ)存的值減去給定的遞減值(decrement)。 |
| APPEND key value | 該命令將 value 追加到 key 所存儲(chǔ)值的末尾。 |
Redis string 的
SET/GET命令只能一次設(shè)置/查詢一個(gè)鍵值對(duì),這樣雖然簡(jiǎn)單,但是效率不高。為了提高命令的執(zhí)行效率,Redis 提供了可以批量操作多個(gè)字符串的讀寫命令 MSET/MGET(“M”代表“Many”),它們?cè)试S你一次性設(shè)置或查詢多個(gè)鍵值對(duì),這樣就有效地減少了網(wǎng)絡(luò)耗時(shí)。
簡(jiǎn)單命令演示
下面對(duì)常用命令做簡(jiǎn)單演示:
1) GETRANGE命令
GETRANGE 命令用于截取一定長(zhǎng)度的 value,并返回截取后的新值。語(yǔ)法格式如下:
redis 127.0.0.1:6379> GETRANGE KEY_NAME start end
注意,字符串的截取范圍由 start 和 end 兩個(gè)偏移量決定(包括 start 和 end 在內(nèi)的閉區(qū)間)
示例如下:
127.0.0.1:6379> SET website www.biancheng.net OK #索引值 127.0.0.1:6379> GETRANGE website 0 4 "www.b" #使用負(fù)數(shù)索引 127.0.0.1:6379> GETRANGE website 0 -1 "www.biancheng.net" 127.0.0.1:6379>
2) GETSET命令
GETSET 命令用于重新設(shè)置 value 值,并返回之前舊 value。示例如下:
127.0.0.1:6379> GETSET num first "6" 127.0.0.1:6379> GETSET num second "first" #查看長(zhǎng)度值 127.0.0.1:6379> strlen num (integer) 6
注意:num 之前存儲(chǔ)的值為“6”,所以結(jié)果返回“6”。
3) SETEX命令
將值 value 存儲(chǔ)到 key 中 ,并將 key 的過期時(shí)間設(shè)為 seconds (以秒為單位)。示例如下:
#設(shè)置過期時(shí)間為60s 127.0.0.1:6379> SETEX www.biancheng.net 60 hello OK #查看過期時(shí)間 127.0.0.1:6379> ttl www.biancheng.net (integer) 5
4) MSETNX命令
該命令了類似于 MSET 命令,但是它僅當(dāng)指定的 key 不存在時(shí)才能夠執(zhí)行成功,用于同時(shí)設(shè)置多個(gè)鍵值對(duì)。示例如下:
#返回0,說明命令執(zhí)行失敗 127.0.0.1:6379> MSETNX www.biancheng.net hello title world (integer) 0 #刪除重復(fù)的鍵 127.0.0.1:6379> del www.biancheng.net (integer) 1 #重新執(zhí)行 127.0.0.1:6379> MSETNX www.biancheng.net hello title world (integer) 1
由于 key 之前已經(jīng)存在,所以第一次執(zhí)行失敗,當(dāng)刪除存在的后,命令就會(huì)執(zhí)行成功。
5) SETRANGE命令
該命令使用指定的字符在給定的范圍內(nèi)覆蓋 key 對(duì)應(yīng)的 value ,其語(yǔ)法格式如下:
redis 127.0.0.1:6379> SETRANGE KEY_NAME OFFSET VALUE
- KEY_NAME:指 key 的名字;
- OFFSET:指初始偏移量;
- VALUE:指要替換成的字符串。
示例如下:
127.0.0.1:6379> SET word "hello world" OK 127.0.0.1:6379> SETRANGE word 6 www.biancheng.net (integer) 23 127.0.0.1:6379> GET word "hello www.biancheng.net"
在線練習(xí)工具:https://try.redis.io/
查看更多命令:https://redis.io/commands
當(dāng)前題目:Redisstring字符串
文章源于:http://fisionsoft.com.cn/article/ccssghi.html


咨詢
建站咨詢
