共計(jì) 7182 個(gè)字符,預(yù)計(jì)需要花費(fèi) 18 分鐘才能閱讀完成。
本篇內(nèi)容主要講解“redis 數(shù)據(jù)類型 strings 的詳細(xì)介紹”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓丸趣 TV 小編來(lái)帶大家學(xué)習(xí)“redis 數(shù)據(jù)類型 strings 的詳細(xì)介紹”吧!
1. String(字符串)
string 是最簡(jiǎn)單的類型,你可以理解成與 Memcached 一模一樣的類型,一個(gè) key 對(duì)應(yīng)一個(gè) value,其上支持的操作與 Memcached 的操作類似。但它的功能更豐富。
redis 采用結(jié)構(gòu) sdshdr 和 sds 封裝了字符串,字符串相關(guān)的操作實(shí)現(xiàn)在源文件 sds.h/sds.c 中。在 Redis 中字符串類型的 Value 最多可以容納的數(shù)據(jù)長(zhǎng)度是 512M
在 Redis 中是二進(jìn)制安全的,這便意味著該類型可以接受任何格式的數(shù)據(jù),如 JPEG 圖像數(shù)據(jù)或 Json 對(duì)象描述信息等
數(shù)據(jù)結(jié)構(gòu)定義如下:
typedefchar*sds;
structsdshdr{
longlen;
longfree;
charbuf[];
};
1.1. SET
Set key value [EX seconds] [PXmilliseconds] [NX|XX]
將字符串值 value 關(guān)聯(lián)到 key。如果 key 已經(jīng)持有其他值,SET 就覆寫舊值,無(wú)視類型。對(duì)于某個(gè)原本帶有生存時(shí)間(TTL)的鍵來(lái)說(shuō),當(dāng) SET 命令成功在這個(gè)鍵上執(zhí)行時(shí),這個(gè)鍵原有的 TTL 將被清除。
可選參數(shù)
從 Redis 2.6.12 版本開(kāi)始,SET 命令的行為可以通過(guò)一系列參數(shù)來(lái)修改:
EXsecond:設(shè)置鍵的過(guò)期時(shí)間為 second 秒。SET key value EX second 效果等同于 SETEXkey second value。
PXmillisecond:設(shè)置鍵的過(guò)期時(shí)間為 millisecond 毫秒。SET key value PX millisecond 效果等同于 PSETEXkey millisecond value。
NX:只在鍵不存在時(shí),才對(duì)鍵進(jìn)行設(shè)置操作。SETkey value NX 效果等同于 SETNX key value。
XX:只在鍵已經(jīng)存在時(shí),才對(duì)鍵進(jìn)行設(shè)置操作。
#賦值與取值
127.0.0.1:6379 set dbredis
OK
127.0.0.1:6379 get db
redis
#使用 ex 選項(xiàng)
127.0.0.1:6379 set dbredis ex 20
OK
127.0.0.1:6379 ttl db
(integer) 16
127.0.0.1:6379 get db
redis
127.0.0.1:6379 ttl db
(integer) 5
127.0.0.1:6379 get db
redis
127.0.0.1:6379 get db
redis
127.0.0.1:6379 get db
(nil)
# 使用 PX 選項(xiàng)
127.0.0.1:6379 set db redis px 20000
OK
127.0.0.1:6379 PTTL db
(integer)15674
127.0.0.1:6379 PTTL db
(integer)8974
127.0.0.1:6379 PTTL db
(integer)8045
127.0.0.1:6379 get db
redis
127.0.0.1:6379 PTTL db
(integer)2482
127.0.0.1:6379 get db
redis
127.0.0.1:6379 get db
(nil)
# 使用 NX 選項(xiàng)
127.0.0.1:6379 set db oracle NX
OK
127.0.0.1:6379 get db
oracle
127.0.0.1:6379 set db redis NX — 鍵存在,失敗
(nil)
127.0.0.1:6379 get db
oracle
# 使用 XX 選項(xiàng)
127.0.0.1:6379 exists name
(integer)0
127.0.0.1:6379 get name
(nil)
127.0.0.1:6379 set name hunt1574 XX — 鍵不存在,失敗
(nil)
127.0.0.1:6379 set name redis
OK
127.0.0.1:6379 set name hunt1574 XX
OK
127.0.0.1:6379 get name
hunt1574
1.2. SETEX
Setex key seconds value
將值 value 關(guān)聯(lián)到 key,并將 key 的生存時(shí)間設(shè)為 seconds (以秒為單位)。
如果 key 已經(jīng)存在,SETEX 命令將覆寫舊值。
這個(gè)命令類似于以下兩個(gè)命令:
SETkey value
EXPIREkey seconds # 設(shè)置生存時(shí)間
不同之處是,SETEX 是一個(gè)原子性 (atomic) 操作,關(guān)聯(lián)值和設(shè)置生存時(shí)間兩個(gè)動(dòng)作會(huì)在同一時(shí)間內(nèi)完成,該命令在 Redis 用作緩存時(shí),非常實(shí)用。
#key 不存在賦值
127.0.0.1:6379 EXISTS user
(integer)0
127.0.0.1:6379 setex user 30 root
OK
127.0.0.1:6379 get user
root
127.0.0.1:6379 ttl user
(integer)15
127.0.0.1:6379 get user
(nil)
#key 存在賦值
127.0.0.1:6379 setex user 20 admin
OK
127.0.0.1:6379 get user
admin
127.0.0.1:6379 ttl user
(integer)14
127.0.0.1:6379 get user
(nil)
1.3. SETNX
SETNX key value
將 key 的值設(shè)為 value,當(dāng)且僅當(dāng) key 不存在。
若給定的 key 已經(jīng)存在,則 SETNX 不做任何動(dòng)作。
SETNX 是『SET if Not eXists』(如果不存在,則 SET)的簡(jiǎn)寫。
# 賦值與取值
127.0.0.1:6379 EXISTS www
(integer)0
127.0.0.1:6379 setnx www code.google.com
(integer)1
127.0.0.1:6379 setnx www redis.io
(integer)0
127.0.0.1:6379 get www
code.google.com
127.0.0.1:6379
1.4. SETRANGE
SETRANGE key offset value
用 value 參數(shù)覆寫 (overwrite) 給定 offset 的 key 所儲(chǔ)存的字符串值
127.0.0.1:6379 set www code.google.com
OK
127.0.0.1:6379 get www
code.google.com
127.0.0.1:6379 SETRANGE www 0 mail
(integer)15
127.0.0.1:6379 get www
mail.google.com
127.0.0.1:6379 SETRANGE www 0 gmail
(integer)15
127.0.0.1:6379 get www
gmailgoogle.com
1.5. MSET
MSET key value [key value …]
同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì)。
如果某個(gè)給定 key 已經(jīng)存在,那么 MSET 會(huì)用新值覆蓋原來(lái)的舊值,如果這不是你所希望的效果,請(qǐng)考慮使用 MSETNX 命令:它只會(huì)在所有給定 key 都不存在的情況下進(jìn)行設(shè)置操作。
MSET 是一個(gè)原子性 (atomic) 操作,所有給定 key 都會(huì)在同一時(shí)間內(nèi)被設(shè)置,某些給定 key 被更新而另一些給定 key 沒(méi)有改變的情況,不可能發(fā)生。
# 賦值與取值
127.0.0.1:6379 mset os linux db redis date 2015-03-17
OK
127.0.0.1:6379 mget os db date
1) linux
2) redis
3) 2015-03-17
# 值覆蓋
127.0.0.1:6379 mset os linux db oracle date 2015-03-17
OK
127.0.0.1:6379 mget os db date
1) linux
2) oracle
3) 2015-03-17
127.0.0.1:6379
1.6. MSETNX
MSETNX key value [key value …]
同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì),當(dāng)且僅當(dāng)所有給定 key 都不存在。
即使只有一個(gè)給定 key 已存在,MSETNX 也會(huì)拒絕執(zhí)行所有給定 key 的設(shè)置操作。MSETNX 是原子性的,因此它可以用作設(shè)置多個(gè)不同 key 表示不同字段 (field) 的唯一性邏輯對(duì)象(unique logic object),所有字段要么全被設(shè)置,要么全不被設(shè)置。
# 賦值與取值
127.0.0.1:6379 mget os db date
1) linux
2) redis
3) 2015-03-17
127.0.0.1:6379 msetnx os linux db oracle date 2015-03-17
(integer)0
127.0.0.1:6379 mget os db date
1) linux
2) redis
3) 2015-03-17
127.0.0.1:6379
1.7. GET
GET key
返回 key 所關(guān)聯(lián)的字符串值。
如果 key 不存在那么返回特殊值 nil。
假如 key 儲(chǔ)存的值不是字符串類型,返回一個(gè)錯(cuò)誤,因?yàn)?GET 只能用于處理字符串值。
127.0.0.1:6379 set dbname redis
OK
127.0.0.1:6379 get dbname
redis
127.0.0.1:6379 get dbversion
(nil)
127.0.0.1:6379 lpush db redis mysql mongodb
(integer)3
127.0.0.1:6379 get db
(error)WRONGTYPE Operation against a key holding the wrong kind of value
1.8. MGET
MGET key [key …]
返回所有 (一個(gè)或多個(gè)) 給定 key 的值。
如果給定的 key 里面,有某個(gè) key 不存在,那么這個(gè) key 返回特殊值 nil。因此,該命令永不失敗。
# 賦值與取值
127.0.0.1:6379 set date 2015-03-17
OK
127.0.0.1:6379 set time 10:00
OK
127.0.0.1:6379 mget date time
1) 2015-03-17
2) 10:00
127.0.0.1:6379 mget date time week —week 不存在,返回 nil
1) 2015-03-17
2) 10:00
3)(nil)
1.9. GETRANGE
GETRANGE key startend
返回 key 中字符串值的子字符串,字符串的截取范圍由 start 和 end 兩個(gè)偏移量決定(包括 start 和 end 在內(nèi))。負(fù)數(shù)偏移量表示從字符串最后開(kāi)始計(jì)數(shù),-1 表示最后一個(gè)字符,-2 表示倒數(shù)第二個(gè),以此類推。范圍超過(guò)字符串最大下標(biāo)值以最大下標(biāo)值為準(zhǔn)。
# 賦值與取值
127.0.0.1:6379 set www redis.io
OK
127.0.0.1:6379 GETRANGE www 0 4
redis
127.0.0.1:6379 GETRANGE www -2 -1
io
127.0.0.1:6379 GETRANGE www -100 -1
redis.io
1.10. GETSET
GETSET key value
將給定 key 的值設(shè)為 value,并返回 key 的舊值(old value)。
當(dāng) key 存在但不是字符串類型時(shí),返回一個(gè)錯(cuò)誤。
127.0.0.1:6379 getset dbname mysql
(nil)
127.0.0.1:6379 get dbname
mysql
127.0.0.1:6379 getset dbname redis
mysql
127.0.0.1:6379 get dbname
redis
1.11. INCR
INCR key
將 key 中儲(chǔ)存的數(shù)字值增一。
如果 key 不存在,那么 key 的值會(huì)先被初始化為 0,然后再執(zhí)行 INCR 操作。如果值包含錯(cuò)誤的類型,或字符串類型的值不能表示為數(shù)字,那么返回一個(gè)錯(cuò)誤。
本操作的值限制在 64 位 (bit) 有符號(hào)數(shù)字表示之內(nèi)。
127.0.0.1:6379 EXISTS pages
(integer)0
127.0.0.1:6379 incr pages
(integer)1
127.0.0.1:6379 get pages
1
127.0.0.1:6379 set rows 0
OK
127.0.0.1:6379 incr rows
(integer)1
127.0.0.1:6379 incr rows
(integer)2
127.0.0.1:6379 incr rows
(integer)3
127.0.0.1:6379 get rows
3
127.0.0.1:6379
1.12. INCRBY
INCRBY keyincrement
將 key 所儲(chǔ)存的值加上增量 increment。
如果 key 不存在,那么 key 的值會(huì)先被初始化為 0,然后再執(zhí)行 INCRBY 命令。
如果值包含錯(cuò)誤的類型,或字符串類型的值不能表示為數(shù)字,那么返回一個(gè)錯(cuò)誤。
本操作的值限制在 64 位 (bit) 有符號(hào)數(shù)字表示之內(nèi)
# 鍵存在
127.0.0.1:6379 get rows
3
127.0.0.1:6379 INCRBY rows 3
(integer)6
127.0.0.1:6379 INCRBY rows 3
(integer)9
127.0.0.1:6379 INCRBY rows 3
(integer)12
# 鍵不存在
127.0.0.1:6379 get num
(nil)
127.0.0.1:6379 INCRBY num -2
(integer)-2
127.0.0.1:6379 INCRBY num -2
(integer)-4
127.0.0.1:6379 INCRBY num -2
(integer)-6
1.13. INCRBYFLOAT
INCRBYFLOAT keyincrement
為 key 中所儲(chǔ)存的值加上浮點(diǎn)數(shù)增量 increment。
如果 key 不存在,那么 INCRBYFLOAT 會(huì)先將 key 的值設(shè)為 0,再執(zhí)行加法操作。
如果命令執(zhí)行成功,那么 key 的值會(huì)被更新為(執(zhí)行加法之后的)新值,并且新值會(huì)以字符串的形式返回給調(diào)用者。
無(wú)論是 key 的值,還是增量 increment,都可以使用像 2.0e7、3e5、90e-2 那樣的指數(shù)符號(hào) (exponential notation) 來(lái)表示,但是,執(zhí)行 INCRBYFLOAT 命令之后的值總是以同樣的形式儲(chǔ)存,也即是,它們總是由一個(gè)數(shù)字,一個(gè)(可選的)小數(shù)點(diǎn)和一個(gè)任意位的小數(shù)部分組成(比如 3.14、69.768,諸如此類),小數(shù)部分尾隨的 0 會(huì)被移除,如果有需要的話,還會(huì)將浮點(diǎn)數(shù)改為整數(shù)(比如 3.0 會(huì)被保存成 3)。
127.0.0.1:6379 set price 45.99
OK
127.0.0.1:6379 INCRBYFLOAT price 4.5
50.49
127.0.0.1:6379 INCRBYFLOAT price 4.5
54.99
127.0.0.1:6379 get num
(nil)
127.0.0.1:6379 INCRBYFLOAT num 5.3
5.3
127.0.0.1:6379 INCRBYFLOAT num 5.3
10.6
1.14. DECR
DECR key
將 key 中儲(chǔ)存的數(shù)字值減一。
如果 key 不存在,那么 key 的值會(huì)先被初始化為 0,然后再執(zhí)行 DECR 操作。
如果值包含錯(cuò)誤的類型,或字符串類型的值不能表示為數(shù)字,那么返回一個(gè)錯(cuò)誤。
127.0.0.1:6379 set price 398.99
OK
127.0.0.1:6379 decr price
(error)ERR value is not an integer or out of range
127.0.0.1:6379 set pages 98
OK
127.0.0.1:6379 decr pages
(integer)97
127.0.0.1:6379 decr pages
(integer)96
1.15. DECRBY
DECRBY keydecrement
將 key 所儲(chǔ)存的值減去減量 decrement。
如果 key 不存在,那么 key 的值會(huì)先被初始化為 0,然后再執(zhí)行 DECRBY 操作。
如果值包含錯(cuò)誤的類型,或字符串類型的值不能表示為數(shù)字,那么返回一個(gè)錯(cuò)誤。
127.0.0.1:6379 get pages
96
127.0.0.1:6379 decrby pages 5
(integer)91
127.0.0.1:6379 decrby pages 5
(integer)86
127.0.0.1:6379 decrby pages -5
(integer)91
127.0.0.1:6379 decrby pages -5
(integer)96
127.0.0.1:6379
1.16. APPEND
APPEND key value
如果 key 已經(jīng)存在并且是一個(gè)字符串,APPEND 命令將 value 追加到 key 原來(lái)的值的末尾。
如果 key 不存在,APPEND 就簡(jiǎn)單地將給定 key 設(shè)為 value,就像執(zhí)行 SET key value 一樣。
127.0.0.1:6379 get db
(nil)
127.0.0.1:6379 APPENDdb redis
(integer) 5
127.0.0.1:6379 APPENDdb .io
(integer) 8
127.0.0.1:6379 get db
redis.io
127.0.0.1:6379
1.17. STRLEN
STRLEN key
返回 key 所儲(chǔ)存的字符串值的長(zhǎng)度。
當(dāng) key 儲(chǔ)存的不是字符串值時(shí),返回一個(gè)錯(cuò)誤。
127.0.0.1:6379 getpages
96
127.0.0.1:6379 STRLENpages
(integer) 2
127.0.0.1:6379 get db
redis.io
127.0.0.1:6379 STRLENdb
(integer) 8
127.0.0.1:6379
到此,相信大家對(duì)“redis 數(shù)據(jù)類型 strings 的詳細(xì)介紹”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是丸趣 TV 網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!