新聞中心

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


咨詢
建站咨詢
