我的Redis學(xué)習(xí)筆記

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、HVALSHGETALL等命令時(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)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,707評(píng)論 0 5
  • redis的誕生 redis的創(chuàng)建者 是一個(gè)叫做antriez的意大利男士,個(gè)人網(wǎng)站http://invece.o...
    指向遠(yuǎn)方的燈塔閱讀 868評(píng)論 0 1
  • Key(鍵) 1. DEL 時(shí)間復(fù)雜度:O(N), N 為被刪除的 key 的數(shù)量。刪除單個(gè)字符串類型的 key...
    one_zheng閱讀 606評(píng)論 0 0
  • 個(gè)人學(xué)習(xí)批處理的初衷來源于實(shí)際工作;在某個(gè)迭代版本有個(gè)BS(安卓手游模擬器)大需求,從而在測(cè)試過程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,981評(píng)論 0 11
  • Redis從入門到精通:中級(jí)篇 本文目錄 上一篇文章以認(rèn)識(shí)Redis為主,寫了Redis系列的第一篇,現(xiàn)在開啟第二...
    叨唧唧的閱讀 783評(píng)論 0 0

友情鏈接更多精彩內(nèi)容