摘要:對字符串執(zhí)行自增和自減操作的實例導(dǎo)入包包與本地進(jìn)行鏈接,地址為,端口號為嘗試獲取一個不存在的鍵將得到一個值。上一篇文章實戰(zhàn)第二章使用構(gòu)建應(yīng)用第五節(jié)網(wǎng)頁分析下一篇文章實戰(zhàn)第三章命令第二節(jié)列表
上一篇文章: Python--Redis實戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第五節(jié):網(wǎng)頁分析
下一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第二節(jié):列表
在Redis里面,字符串可以存儲以下三種類型的值:
字節(jié)串【byte string】
整數(shù)
浮點數(shù)
用戶可以通過給定一個任意的數(shù)值,對存儲著整數(shù)或者浮點數(shù)的字符串執(zhí)行自增【increment】或者自減【decrement】操作,在有需要的時候,Redis還好將整數(shù)轉(zhuǎn)換成浮點數(shù)。整數(shù)的取值范圍和系統(tǒng)的長整數(shù)【long integer】的取值范圍相同【在32位系統(tǒng)上,整數(shù)就是32位有符號整數(shù),在64位系統(tǒng)上,整數(shù)就是64位有符號整數(shù)】,而浮點數(shù)的取值范圍和精度則與IEEE754標(biāo)準(zhǔn)的雙精度浮點數(shù)【double】相同。Redis明確的區(qū)分字節(jié)串、整數(shù)和浮點數(shù)的做法是一種優(yōu)勢,比起只能夠存儲字節(jié)串的做法,Redis的做法在數(shù)據(jù)表現(xiàn)方面具有更大的靈活性。
本節(jié)將對Redis里面最簡單的結(jié)構(gòu):字符串進(jìn)行討論,介紹基本的數(shù)值自增和自減操作,以及二進(jìn)制位【bit】和子串【substring】處理命令,讀者可能會驚訝的發(fā)現(xiàn),Redis里面最簡單的機(jī)構(gòu)居然也有如此強(qiáng)大的作用。
下表展示了對Redis字符串執(zhí)行自增和自減操作的命令:
命令 | 用例 | 用例描述 |
---|---|---|
incr | incr key-name | 將鍵存儲的值+1 |
decr | decr key-name | 將鍵存儲的值-1 |
incrby | incrby key-name amount | 將鍵存儲的值加上整數(shù)amount |
decrby | decrby key-name amount | 將鍵存儲的值減去整數(shù)amount |
incrbyfloat | incrbyfloat key-name amount | 將鍵存儲的值加上浮點數(shù)amount,這個命令在Redis2.6或以上的版本可用。 |
當(dāng)用戶將一個值存儲到Redis字符串里面的時候,如果這個值可以被解釋【interpret】為十進(jìn)制或者浮點數(shù),那么Redis會察覺到這一點,并允許用戶對這個字符串執(zhí)行各種【incr*】和【decr*】操作。
如果用戶對一個不存在的鍵或者一個保存了空串的鍵執(zhí)行自增或者自減操作,那么Redis在執(zhí)行操作時會將這個鍵的值當(dāng)做是0來處理。
如果用戶嘗試對一個值無法被解釋為整數(shù)或者浮點數(shù)的字符串執(zhí)行自增或者自減操作,那么Redis將想用戶返回一個錯誤。
對字符串執(zhí)行自增和自減操作的實例:import redis #導(dǎo)入redis包包 #與本地redis進(jìn)行鏈接,地址為:localhost,端口號為6379 r=redis.StrictRedis(host="localhost",port=6379) r.delete("key") #嘗試獲取一個不存在的鍵將得到一個None值。 print(r.get("key")) #對不存在的鍵執(zhí)行自增操作 print(r.incr("key")) print(r.incr("key",15)) #執(zhí)行自減操作 print(r.decr("key",5)) print(r.get("key")) print(r.set("key",99)) print(r.incr("key"))
運行結(jié)果:
None 1 16 11 b"11" True 100
讀者可能會發(fā)現(xiàn)本書只調(diào)用了incr(),這是因為Pythin的Redis庫在內(nèi)部使用incrby命令來實現(xiàn)incr()方法,并且這個方法的第二個參數(shù)是可選的:如果用戶沒有為這個可選參數(shù)設(shè)置值,那么這個參數(shù)就會使用默認(rèn)值1.
除了自增操作和自減操作之外,Redis還擁有對字符串的其中一部分內(nèi)容進(jìn)行讀取或者寫入的操作(這些操作也可以用于整數(shù)或者浮點數(shù),但這種用法并不常見)。下表展示了用來處理字符串子串和二進(jìn)制位的命令:
命令 | 用例 | 用例描述 |
---|---|---|
append | append key-namr value | 將值value追加到給定鍵key-name當(dāng)前存儲的值得尾部 |
getrange | getrange key-name start end | 獲取一個由偏移量start至偏移量end范圍內(nèi)所有字符組成的子串,包括start和end在內(nèi) |
setrange | setrange key-name offset value | 將從start偏移量開始的子串設(shè)置為給定值 |
getbit | getbit key-name offset | 將字節(jié)串看做是二進(jìn)制位串【bit string】,并返回位串中偏移量為offset的二進(jìn)制位的值 |
setbit | setbit key-name offset value | 將字節(jié)串看做是二進(jìn)制位串,并將位串中偏移量為offset的二進(jìn)制位設(shè)置為value |
bitcount | bitcount key-name [start end] | 統(tǒng)計二進(jìn)制位串里面值為1的二進(jìn)制位的數(shù)量,如果給定了可選的start偏移量和end偏移量,那么只對偏移量范圍內(nèi)的二進(jìn)制位進(jìn)行統(tǒng)計 |
bitop | bitop operation dest-key key-name [key-namr ...] | 對一個或多個二進(jìn)制位串執(zhí)行包括并【and】、或【or】、異或【xor】、非【not】在內(nèi)的任意一種按位運算操作,并將計算得出的結(jié)果保存在dest-key鍵里面 |
Redis現(xiàn)在的getrange命令是由以前的substr命令改名而來的,因此,Python客戶端至今仍然可以使用substr()方法來獲取子串,但如果讀者使用的是2.6或以上版本的Redis,那么最好是使用getrang()方法獲取子串。
在使用setrange或者setbit命令對字符串進(jìn)行寫入的時候,如果字符串當(dāng)前的長度不能滿足寫入的要求,那么Redis會自動地使用空字節(jié)(null)來將字符串?dāng)U展至所需的長度,然后才執(zhí)行寫入或者更新操作。在使用getrange讀取字符串的時候,超出字符串末尾的數(shù)據(jù)會被視為是空串,而在使用getbit讀取二進(jìn)制位串的時候,超出字符串末尾的二進(jìn)制位會被視為是0.
Redis的子串操作和二進(jìn)制位操作實例import redis #導(dǎo)入redis包包 #與本地redis進(jìn)行鏈接,地址為:localhost,端口號為6379 r=redis.StrictRedis(host="localhost",port=6379) r.delete("new-string-key") r.delete("another-key") #將字符串"hello"追加到目前并不存在的"new-string-key"鍵里。 print(r.append("new-string-key","hello")) print(r.append("new-string-key","-world!")) #獲取字串 print(r.substr("new-string-key",3,7)) #對字符串執(zhí)行范圍設(shè)置操作,setrange會返回字符串的當(dāng)前長度 print(r.setrange("new-string-key",0,"H")) print(r.setrange("new-string-key",6,"W")) print(r.get("new-string-key")) #移除了!號并在后面添加了新的字符:--how are you? print(r.setrange("new-string-key",11,"--how are you?")) print(r.get("new-string-key")) #setbit命令會返回二進(jìn)制位被設(shè)置之前的值 #對超出字符串長度的二進(jìn)制位進(jìn)行設(shè)置時,超出部分會被填充為空字節(jié) print(r.setbit("another-key",2,1)) print(r.setbit("another-key",7,1)) #通過將第2個二進(jìn)制位以及第7個二進(jìn)制位的值設(shè)置位1,鍵的值將變?yōu)?!",也就是便秘為33的字符。 print(r.get("another-key"))
運行結(jié)果:
5 12 b"lo-wo" 12 12 b"Hello-World!" 25 b"Hello-World--how are you?" 0 0 b"!"
很多鍵值數(shù)據(jù)庫只能講數(shù)據(jù)存儲為普通的字符串,并且不提供任何字符串處理操作,有一些鍵值數(shù)據(jù)庫運行用戶將字節(jié)追加到字符串的前面后者后面,但是卻沒有辦法像Redis一樣對字符串的子串進(jìn)行讀寫。從很多方面來講,即使Redis只支持字符串結(jié)構(gòu),并且只支持本節(jié)列出的字符串處理命令,Redis也比很多別的數(shù)據(jù)庫要強(qiáng)大的多;通過使用子串操作或二進(jìn)制位操作,配合watch命令、multi命令和exec命令,用戶甚至可以手動去構(gòu)建任何他們想要的數(shù)據(jù)結(jié)構(gòu)。后面我們會介紹如何使用字符串去存儲一種簡單的映射,這種映射可以在某些情況下節(jié)省大量內(nèi)存。
只要花些心思,我們甚至可以將字符串當(dāng)作列表來使用,但這種做法能夠執(zhí)行的列表操作并不多,更好的方法時直接使用下面我們將要介紹的列表結(jié)構(gòu),Redis為這種結(jié)構(gòu)提供了豐富的列表操作命令。
上一篇文章: Python--Redis實戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第五節(jié):網(wǎng)頁分析
下一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第二節(jié):列表
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42585.html
摘要:上一篇文章實戰(zhàn)安裝下一篇文章實戰(zhàn)第一章初識第二節(jié)數(shù)據(jù)結(jié)構(gòu)簡介是一個遠(yuǎn)程內(nèi)存數(shù)據(jù)庫,它不僅性能強(qiáng)勁,而且還具有復(fù)制特性以及為解決問題而生的獨一無二的數(shù)據(jù)模型,是一個速度非常快的非關(guān)系數(shù)據(jù)庫。 上一篇文章:Pyhton--Redis實戰(zhàn):Mac brew安裝redis下一篇文章:Python--Redis實戰(zhàn):第一章:初識Redis:第二節(jié):Redis數(shù)據(jù)結(jié)構(gòu)簡介 Redis是一個遠(yuǎn)程內(nèi)...
摘要:上一篇文章實戰(zhàn)第三章命令第一節(jié)字符串下一篇文章實戰(zhàn)第三章命令第三節(jié)集合在之前我們介紹過,的列表允許用戶從序列的兩端推入或者彈出元素獲取列表元素以及執(zhí)行各種常見的列表操作。 上一篇文章: Python--Redis實戰(zhàn):第三章:Redis命令:第一節(jié):字符串下一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第三節(jié):集合 在之前我們介紹過,Redis的列表允許用戶從序列...
閱讀 1388·2021-11-22 09:34
閱讀 2591·2021-11-12 10:36
閱讀 1125·2021-11-11 16:55
閱讀 2340·2020-06-22 14:43
閱讀 1478·2019-08-30 15:55
閱讀 1989·2019-08-30 15:53
閱讀 1775·2019-08-30 10:50
閱讀 1232·2019-08-29 12:15