2.2 strings類型及操作 string是最簡單的類型,你可以理解成與Memcached是一模一樣的類型,一個key對應(yīng)一個value,其上支持的操作與Memcached的操作類似。但它的功能更豐富。 string類型是二進制安全的。意思是redis的string可以包含任何數(shù)據(jù),比如jpg圖片或者序列化的對象。從內(nèi)部實現(xiàn)來看其實string可以看作byte數(shù)組,最大上限是1G字節(jié),下面是string類型的定義: struct sdshdr { long len; long free; char buf[]; }; |
len是buf數(shù)組的長度。 free是數(shù)組中剩余可用字節(jié)數(shù),由此可以理解為什么string類型是二進制安全的了,因為它本質(zhì)上就是個byte數(shù)組,當(dāng)然可以包含任何數(shù)據(jù)了 buf是個char數(shù)組用于存貯實際的字符串內(nèi)容,其實char和c#中的byte是等價的,都是一個字節(jié)。 另外string類型可以被部分命令按int處理.比如incr等命令,如果只用string類型,redis就可以被看作加上持久化特性的memcached。當(dāng)然redis對string類型的操作比memcached還是多很多的,具體操作方法如下: 2.2.1 set 設(shè)置key對應(yīng)的值為string類型的value。 例如我們添加一個name= HongWan的鍵值對,可以這樣做: redis 127.0.0.1:6379> set name HongWan OK redis 127.0.0.1:6379> |
2.2.2 setnx 設(shè)置key對應(yīng)的值為string類型的value。如果key已經(jīng)存在,返回0,nx是not exist的意思。 例如我們添加一個name= HongWan_new的鍵值對,可以這樣做: redis 127.0.0.1:6379> get name "HongWan" redis 127.0.0.1:6379> setnx name HongWan_new (integer) 0 redis 127.0.0.1:6379> get name "HongWan" redis 127.0.0.1:6379> |
由于原來name有一個對應(yīng)的值,所以本次的修改不生效,且返回碼是0。 2.2.3 setex 設(shè)置key對應(yīng)的值為string類型的value,并指定此鍵值對應(yīng)的有效期。 例如我們添加一個haircolor= red的鍵值對,并指定它的有效期是10秒,可以這樣做: redis 127.0.0.1:6379> setex haircolor 10 red OK redis 127.0.0.1:6379> get haircolor "red" redis 127.0.0.1:6379> get haircolor (nil) redis 127.0.0.1:6379> |
可見由于最后一次的調(diào)用是10秒以后了,所以取不到haicolor這個鍵對應(yīng)的值。 2.2.4 setrange 設(shè)置指定key的value值的子字符串。 例如我們希望將HongWan的126郵箱替換為gmail郵箱,那么我們可以這樣做: redis 127.0.0.1:6379> get name "HongWan@126.com" redis 127.0.0.1:6379> setrange name 8 gmail.com (integer) 17 redis 127.0.0.1:6379> get name "HongWan@gmail.com" redis 127.0.0.1:6379> |
其中的8是指從下標(biāo)為8(包含8)的字符開始替換 2.2.5 mset 一次設(shè)置多個key的值,成功返回ok表示所有的值都設(shè)置了,失敗返回0表示沒有任何值被設(shè)置。 redis 127.0.0.1:6379> mset key1 HongWan1 key2 HongWan2 OK redis 127.0.0.1:6379> get key1 "HongWan1" redis 127.0.0.1:6379> get key2 "HongWan2" redis 127.0.0.1:6379> |
2.2.6 msetnx 一次設(shè)置多個key的值,成功返回ok表示所有的值都設(shè)置了,失敗返回0表示沒有任何值被設(shè)置,但是不會覆蓋已經(jīng)存在的key。 redis 127.0.0.1:6379> get key1 "HongWan1" redis 127.0.0.1:6379> get key2 "HongWan2" redis 127.0.0.1:6379> msetnx key2 HongWan2_new key3 HongWan3 (integer) 0 redis 127.0.0.1:6379> get key2 "HongWan2" redis 127.0.0.1:6379> get key3 (nil) |
可以看出如果這條命令返回0,那么里面操作都會回滾,都不會被執(zhí)行。 2.2.7 get 獲取key對應(yīng)的string值,如果key不存在返回nil。 例如我們獲取一個庫中存在的鍵name,可以很快得到它對應(yīng)的value redis 127.0.0.1:6379> get name "HongWan" redis 127.0.0.1:6379> |
我們獲取一個庫中不存在的鍵name1,那么它會返回一個nil以表時無此鍵值對 redis 127.0.0.1:6379> get name1 (nil) redis 127.0.0.1:6379> |
2.2.8 getset 設(shè)置key的值,并返回key的舊值。 redis 127.0.0.1:6379> get name "HongWan" redis 127.0.0.1:6379> getset name HongWan_new "HongWan" redis 127.0.0.1:6379> get name "HongWan_new" redis 127.0.0.1:6379> |
接下來我們看一下如果key不存的時候會什么樣兒? redis 127.0.0.1:6379> getset name1 aaa (nil) redis 127.0.0.1:6379> |
可見,如果key不存在,那么將返回nil 2.2.9 getrange 獲取指定key的value值的子字符串。 具體樣例如下: redis 127.0.0.1:6379> get name "HongWan@126.com" redis 127.0.0.1:6379> getrange name 0 6 "HongWan" redis 127.0.0.1:6379> |
字符串左面下標(biāo)是從0開始的 redis 127.0.0.1:6379> getrange name -7 -1 "126.com" redis 127.0.0.1:6379> |
字符串右面下標(biāo)是從-1開始的 redis 127.0.0.1:6379> getrange name 7 100 "@126.com" redis 127.0.0.1:6379> |
當(dāng)下標(biāo)超出字符串長度時,將默認為是同方向的最大下標(biāo) 2.2.10 mget 一次獲取多個key的值,如果對應(yīng)key不存在,則對應(yīng)返回nil。 具體樣例如下: redis 127.0.0.1:6379> mget key1 key2 key3 1) "HongWan1" 2) "HongWan2" 3) (nil) redis 127.0.0.1:6379> |
key3由于沒有這個鍵定義,所以返回nil。 2.2.11 incr 對key的值做加加操作,并返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設(shè)置key為1 redis 127.0.0.1:6379> set age 20 OK redis 127.0.0.1:6379> incr age (integer) 21 redis 127.0.0.1:6379> get age "21" redis 127.0.0.1:6379> |
2.2.12 incrby 同incr類似,加指定值 ,key不存在時候會設(shè)置key,并認為原來的value是 0 redis 127.0.0.1:6379> get age "21" redis 127.0.0.1:6379> incrby age 5 (integer) 26 redis 127.0.0.1:6379> get name "HongWan@gmail.com" redis 127.0.0.1:6379> get age "26" redis 127.0.0.1:6379> |
2.2.13 decr 對key的值做的是減減操作,decr一個不存在key,則設(shè)置key為-1 redis 127.0.0.1:6379> get age "26" redis 127.0.0.1:6379> decr age (integer) 25 redis 127.0.0.1:6379> get age "25" redis 127.0.0.1:6379> |
2.2.14 decrby 同decr,減指定值。 redis 127.0.0.1:6379> get age "25" redis 127.0.0.1:6379> decrby age 5 (integer) 20 redis 127.0.0.1:6379> get age "20" redis 127.0.0.1:6379> |
decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現(xiàn)同樣效果,反之一樣。 redis 127.0.0.1:6379> get age "20" redis 127.0.0.1:6379> incrby age -5 (integer) 15 redis 127.0.0.1:6379> get age "15" redis 127.0.0.1:6379> |
2.2.15 append 給指定key的字符串值追加value,返回新字符串值的長度。 例如我們向name的值追加一個@126.com字符串,那么可以這樣做: redis 127.0.0.1:6379> append name @126.com (integer) 15 redis 127.0.0.1:6379> get name "HongWan@126.com" redis 127.0.0.1:6379> |
2.2.16 strlen 取指定key的value值的長度。 redis 127.0.0.1:6379> get name "HongWan_new" redis 127.0.0.1:6379> strlen name (integer) 11 redis 127.0.0.1:6379> get age "15" redis 127.0.0.1:6379> strlen age (integer) 2 redis 127.0.0.1:6379> |
-------------------------------------------------------------------
《MongoDB管理與開發(fā)精要》、《Redis實戰(zhàn)》作者
ChinaUnix.net專家博主 http://cdhongwan.blog.chinaunix.net
@CD紅丸 http://weibo.com/u/2446082491
|