Python--Redis實戰:第三章:Redis命令:第一節:字符串

上一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第五節:網頁分析
下一篇文章: Python--Redis實戰:第三章:Redis命令:第二節:列表

在Redis裏面,字符串能夠存儲如下三種類型的值:redis

  • 字節串【byte string】
  • 整數
  • 浮點數

用戶能夠經過給定一個任意的數值,對存儲着整數或者浮點數的字符串執行自增【increment】或者自減【decrement】操做,在有須要的時候,Redis還好將整數轉換成浮點數。整數的取值範圍和系統的長整數【long integer】的取值範圍相同【在32位系統上,整數就是32位有符號整數,在64位系統上,整數就是64位有符號整數】,而浮點數的取值範圍和精度則與IEEE754標準的雙精度浮點數【double】相同。Redis明確的區分字節串、整數和浮點數的作法是一種優點,比起只可以存儲字節串的作法,Redis的作法在數據表現方面具備更大的靈活性。數據庫

本節將對Redis裏面最簡單的結構:字符串進行討論,介紹基本的數值自增和自減操做,以及二進制位【bit】和子串【substring】處理命令,讀者可能會驚訝的發現,Redis裏面最簡單的機構竟然也有如此強大的做用。segmentfault

下表展現了對Redis字符串執行自增和自減操做的命令:數據結構

命令 用例 用例描述
incr incr key-name 將鍵存儲的值+1
decr decr key-name 將鍵存儲的值-1
incrby incrby key-name amount 將鍵存儲的值加上整數amount
decrby decrby key-name amount 將鍵存儲的值減去整數amount
incrbyfloat incrbyfloat key-name amount 將鍵存儲的值加上浮點數amount,這個命令在Redis2.6或以上的版本可用。

當用戶將一個值存儲到Redis字符串裏面的時候,若是這個值能夠被解釋【interpret】爲十進制或者浮點數,那麼Redis會察覺到這一點,並容許用戶對這個字符串執行各類【incr*】和【decr*】操做。app

若是用戶對一個不存在的鍵或者一個保存了空串的鍵執行自增或者自減操做,那麼Redis在執行操做時會將這個鍵的值當作是0來處理。code

若是用戶嘗試對一個值沒法被解釋爲整數或者浮點數的字符串執行自增或者自減操做,那麼Redis將想用戶返回一個錯誤。內存

對字符串執行自增和自減操做的實例:

import redis #導入redis包包

#與本地redis進行連接,地址爲:localhost,端口號爲6379
r=redis.StrictRedis(host='localhost',port=6379)

r.delete('key')
#嘗試獲取一個不存在的鍵將獲得一個None值。
print(r.get('key'))

#對不存在的鍵執行自增操做
print(r.incr('key'))
print(r.incr('key',15))

#執行自減操做
print(r.decr('key',5))

print(r.get('key'))

print(r.set('key',99))
print(r.incr('key'))

運行結果:rem

None
1
16
11
b'11'
True
100
讀者可能會發現本書只調用了incr(),這是由於Pythin的Redis庫在內部使用incrby命令來實現incr()方法,而且這個方法的第二個參數是可選的:若是用戶沒有爲這個可選參數設置值,那麼這個參數就會使用默認值1.

除了自增操做和自減操做以外,Redis還擁有對字符串的其中一部份內容進行讀取或者寫入的操做(這些操做也能夠用於整數或者浮點數,但這種用法並不常見)。下表展現了用來處理字符串子串和二進制位的命令:字符串

命令 用例 用例描述
append append key-namr value 將值value追加到給定鍵key-name當前存儲的值得尾部
getrange getrange key-name start end 獲取一個由偏移量start至偏移量end範圍內全部字符組成的子串,包括start和end在內
setrange setrange key-name offset value 將從start偏移量開始的子串設置爲給定值
getbit getbit key-name offset 將字節串看作是二進制位串【bit string】,並返回位串中偏移量爲offset的二進制位的值
setbit setbit key-name offset value 將字節串看作是二進制位串,並將位串中偏移量爲offset的二進制位設置爲value
bitcount bitcount key-name [start end] 統計二進制位串裏面值爲1的二進制位的數量,若是給定了可選的start偏移量和end偏移量,那麼只對偏移量範圍內的二進制位進行統計
bitop bitop operation dest-key key-name [key-namr ...] 對一個或多個二進制位串執行包括並【and】、或【or】、異或【xor】、非【not】在內的任意一種按位運算操做,並將計算得出的結果保存在dest-key鍵裏面
Redis如今的getrange命令是由之前的substr命令更名而來的,所以,Python客戶端至今仍然可使用substr()方法來獲取子串,但若是讀者使用的是2.6或以上版本的Redis,那麼最好是使用getrang()方法獲取子串。

在使用setrange或者setbit命令對字符串進行寫入的時候,若是字符串當前的長度不能知足寫入的要求,那麼Redis會自動地使用空字節(null)來將字符串擴展至所需的長度,而後才執行寫入或者更新操做。在使用getrange讀取字符串的時候,超出字符串末尾的數據會被視爲是空串,而在使用getbit讀取二進制位串的時候,超出字符串末尾的二進制位會被視爲是0.get

Redis的子串操做和二進制位操做實例

import redis #導入redis包包

#與本地redis進行連接,地址爲: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))

#對字符串執行範圍設置操做,setrange會返回字符串的當前長度
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命令會返回二進制位被設置以前的值
#對超出字符串長度的二進制位進行設置時,超出部分會被填充爲空字節
print(r.setbit('another-key',2,1))
print(r.setbit('another-key',7,1))
#經過將第2個二進制位以及第7個二進制位的值設置位1,鍵的值將變爲'!',也就是便祕爲33的字符。
print(r.get('another-key'))

運行結果:

5
12
b'lo-wo'
12
12
b'Hello-World!'
25
b'Hello-World--how are you?'
0
0
b'!'

不少鍵值數據庫只能講數據存儲爲普通的字符串,而且不提供任何字符串處理操做,有一些鍵值數據庫運行用戶將字節追加到字符串的前面後者後面,可是卻沒有辦法像Redis同樣對字符串的子串進行讀寫。從不少方面來說,即便Redis只支持字符串結構,而且只支持本節列出的字符串處理命令,Redis也比不少別的數據庫要強大的多;經過使用子串操做或二進制位操做,配合watch命令、multi命令和exec命令,用戶甚至能夠手動去構建任何他們想要的數據結構。後面咱們會介紹如何使用字符串去存儲一種簡單的映射,這種映射能夠在某些狀況下節省大量內存。

只要花些心思,咱們甚至能夠將字符串看成列表來使用,但這種作法可以執行的列表操做並很少,更好的方法時直接使用下面咱們將要介紹的列表結構,Redis爲這種結構提供了豐富的列表操做命令。

上一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第五節:網頁分析
下一篇文章: Python--Redis實戰:第三章:Redis命令:第二節:列表
相關文章
相關標籤/搜索