1. 關(guān)于set的覆蓋問題
在默認(rèn)情況下,對(duì)一個(gè)已經(jīng)設(shè)置了值的字符串鍵執(zhí)行SET命令將導(dǎo)致鍵的舊值被新值覆蓋。
從Redis2.6.12版本開始,用戶可以通過向SET命令提供可選的NX選項(xiàng)或者XX選項(xiàng)來指示SET命令是否要覆蓋一個(gè)已經(jīng)存在的值:SET key value [NX|XX]
如果用戶在執(zhí)行SET命令時(shí)給定了NX選項(xiàng),那么SET命令只會(huì)在鍵沒有值的情況下執(zhí)行設(shè)置操作,并返回OK表示設(shè)置成功;如果鍵已經(jīng)存在,那么SET命令將放棄執(zhí)行設(shè)置操作,并返回空值nil表示設(shè)置失敗。
以下代碼展示了帶有NX選項(xiàng)的SET命令的行為:
redis> SET password "123456" NX # OK 對(duì)尚未有值的password鍵進(jìn)行設(shè)置,成功
redis> SET password "999999" NX # (nil) password鍵已經(jīng)有了值,設(shè)置失敗
如果用戶在執(zhí)行SET命令時(shí)給定了XX選項(xiàng),那么SET命令只會(huì)在鍵已經(jīng)有值的情況下執(zhí)行設(shè)置操作,并返回OK表示設(shè)置成功;如果給定的鍵并沒有值,那么SET命令將放棄執(zhí)行設(shè)置操作,并返回空值表示設(shè)置失敗。
舉個(gè)例子,如果我們對(duì)一個(gè)沒有值的鍵mongodb-homepage執(zhí)行以下SET命令,那么命令將因?yàn)閄X選項(xiàng)的作用而放棄執(zhí)行設(shè)置操作:
redis> SET mongodb-homepage "mongodb.com" XX # (nil)
因?yàn)榈诙lSET命令沒有改變password鍵的值,所以password鍵的值仍然是剛開始時(shí)設(shè)置的"123456"。
相反,如果我們對(duì)一個(gè)已經(jīng)有值的鍵執(zhí)行帶有XX選項(xiàng)的SET命令,那么命令將使用新值去覆蓋已有的舊值:
redis> SET mysql-homepage "mysql.org" # OK為鍵mysqlhomepage設(shè)置一個(gè)值
redis> SET mysql-homepage "mysql.com" XX # OK對(duì)鍵的值進(jìn)行更新
在第二條SET命令執(zhí)行之后,mysql-homepage鍵的值將從原來的"mysql.org"更新為"mysql.com"。
2.字符串總結(jié)
- Redis的字符串鍵可以把單獨(dú)的一個(gè)鍵和單獨(dú)的一個(gè)值在數(shù)據(jù)庫中關(guān)聯(lián)起來,并且這個(gè)鍵和值既可以存儲(chǔ)文字?jǐn)?shù)據(jù),又可以存儲(chǔ)二進(jìn)制數(shù)據(jù)。
- SET命令在默認(rèn)情況下會(huì)直接覆蓋字符串鍵已有的值,如果我們只想在鍵不存在的情況下為它設(shè)置值,那么可以使用帶有
NX選項(xiàng)的SET命令;相反,如果我們只想在鍵已經(jīng)存在的情況下為它設(shè)置新值,那么可以使用帶有XX選項(xiàng)的SET命令。 - 使用
MSET、MSETNX以及MGET命令可以有效地減少程序的網(wǎng)絡(luò)通信次數(shù),從而提升程序的執(zhí)行效率。 - Redis用戶可以通過制定命名格式來提升Redis數(shù)據(jù)的可讀性并避免鍵名沖突。·字符串值的正數(shù)索引以0為開始,從字符串的開頭向結(jié)尾不斷遞增;字符串值的負(fù)數(shù)索引以1為開始,從字符串的結(jié)尾向開頭不斷遞減。
-
GETRANGE key start end命令接受的是閉區(qū)間索引范圍,位于start索引和end索引上的值也會(huì)被包含在命令返回的內(nèi)容當(dāng)中。 -
SETRANGE命令在需要時(shí)會(huì)自動(dòng)對(duì)字符串值進(jìn)行擴(kuò)展,并使用空字節(jié)填充新擴(kuò)展空間中沒有內(nèi)容的部分。 -
APPEND命令在鍵不存在時(shí)執(zhí)行設(shè)置操作,在鍵存在時(shí)執(zhí)行追加操作。 - Redis會(huì)把能夠被表示為long long int類型的整數(shù)以及能夠被表示為long double類型的浮點(diǎn)數(shù)當(dāng)作數(shù)字來處理。
3. 存取散列
info = {
'name': 'ChiOS',
'age': 29,
'sex': 'M'
}
client = Redis(decode_responses=True)
result = client.hmset('user_info', info) # 存
print(result)
result = client.hgetall('user_info') # 取
print(result)
4.散列總結(jié)
- 散列鍵會(huì)將一個(gè)鍵和一個(gè)散列在數(shù)據(jù)庫中關(guān)聯(lián)起來,用戶可以在散列中為任意多個(gè)字段設(shè)置值。與字符串鍵一樣,散列的字段和值既可以是文本數(shù)據(jù),也可以是二進(jìn)制數(shù)據(jù)。
- 用戶可以通過散列鍵把相關(guān)聯(lián)的多項(xiàng)數(shù)據(jù)存儲(chǔ)到同一個(gè)散列中,以便對(duì)其進(jìn)行管理,或者針對(duì)它們執(zhí)行批量操作。
- 因?yàn)镽edis并沒有為散列提供相應(yīng)的減法操作命令,所以如果用戶想對(duì)字段存儲(chǔ)的數(shù)字值執(zhí)行減法操作,就需要將負(fù)數(shù)增量傳遞給
HINCRBY命令或HINCRBYFLOAT命令。 - Redis散列包含的字段在底層是以無序方式存儲(chǔ)的,根據(jù)字段插入的順序不同,包含相同字段的散列在執(zhí)行
HKEYS、HVALS和HGETALL等命令時(shí)可能會(huì)得到不同的結(jié)果,因此用戶在使用這3個(gè)命令時(shí),不應(yīng)該對(duì)命令返回元素的排列順序作任何假設(shè)。 - 字符串鍵和散列鍵雖然在操作方式上非常相似,但是因?yàn)樗鼈兌紦碛懈髯元?dú)有的優(yōu)點(diǎn)和缺點(diǎn),所以在一些情況下,這兩種數(shù)據(jù)結(jié)構(gòu)是沒有辦法完全代替對(duì)方的。因此用戶在構(gòu)建應(yīng)用程序的時(shí)候,應(yīng)該根據(jù)實(shí)際需要來選擇相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。