1. 程式人生 > >Redis Python開發指南

Redis Python開發指南

叠代 追加內容 替換 ria ont source cci 自減 追加

redis基本命令 String

set

Set

set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中設置值,默認,不存在則創建,存在則修改

參數說明:
 ex,過期時間(秒)
px,過期時間(毫秒)
nx,如果設置為True,則只有name不存在時,當前set操作才執行
xx,如果設置為True,則只有name存在時,當前set操作才執行
1.ex,過期時間(秒) 這裏過期時間是3秒,3秒後p,鍵food的值就變成None
import redis

pool = redis.ConnectionPool(host=
127.0.0.1, port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set(food, mutton, ex=3) # key是"food" value是"mutton" 將鍵值對存入redis緩存 print(r.get(food)) # mutton 取出鍵food對應的值 2.px,過期時間(豪秒) 這裏過期時間是3豪秒,3毫秒後,鍵foo的值就變成None import redis pool = redis.ConnectionPool(host=127.0.0.1
, port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set(food, beef, px=3) print(r.get(food)) 3.nx,如果設置為True,則只有name不存在時,當前set操作才執行 (新建) import redis pool = redis.ConnectionPool(host=127.0.0.1, port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) print
(r.set(fruit, watermelon, nx=True)) # True--不存在 # 如果鍵fruit不存在,那麽輸出是True;如果鍵fruit已經存在,輸出是None 4.xx,如果設置為True,則只有name存在時,當前set操作才執行 (修改) print((r.set(fruit, watermelon, xx=True))) # True--已經存在 # 如果鍵fruit已經存在,那麽輸出是True;如果鍵fruit不存在,輸出是None 5.setnx(name, value) 設置值,只有name不存在時,執行設置操作(添加) print(r.setnx(fruit1, banana)) # fruit1不存在,輸出為True

setex

setex(name, value, time)
設置值
參數:
time,過期時間(數字秒 或 timedelta對象)
import redis
import time

pool = redis.ConnectionPool(host=127.0.0.1, port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.setex("fruit2", "orange", 5)
time.sleep(5)
print(r.get(fruit2))  # 5秒後,取值就從orange變成None

psetex

psetex(name, time_ms, value)
設置值
參數:
time_ms,過期時間(數字毫秒 或 timedelta對象)
r.psetex("fruit3", 5000, "apple")
time.sleep(5)
print(r.get(fruit3))  # 5000毫秒後,取值就從apple變成None

mset

批量設置值
如:
r.mget({k1: v1, k2: v2})
r.mset(k1="v1", k2="v2") # 這裏k1 和k2 不能帶引號 一次設置對個鍵值對
print(r.mget("k1", "k2"))   # 一次取出多個鍵對應的值
print(r.mget("k1"))

mget

mget(keys, *args)
批量獲取
如:
print(r.mget(k1, k2))
print(r.mget([k1, k2]))
print(r.mget("fruit", "fruit1", "fruit2", "k1", "k2"))  # 將目前redis緩存中的鍵對應的值批量取出來

getset

getset(name, value)
設置新值並獲取原來的值
print(r.getset("food", "barbecue"))  # 設置的新值是barbecue 設置前的值是beef1

getrange

getrange(key, start, end)
獲取子序列(根據字節獲取,非字符)
參數:
name,Redis 的 name
start,起始位置(字節)
end,結束位置(字節)
如: “君惜大大” ,0-3表示 “君”
r.set("cn_name", "君惜大大") # 漢字
print(r.getrange("cn_name", 0, 2))   # 取索引號是0-2 前3位的字節 君 切片操作 (一個漢字3個字節 1個字母一個字節 每個字節8bit)
print(r.getrange("cn_name", 0, -1))  # 取所有的字節 君惜大大 切片操作
r.set("en_name","junxi") # 字母
print(r.getrange("en_name", 0, 2))  # 取索引號是0-2 前3位的字節 jun 切片操作 (一個漢字3個字節 1個字母一個字節 每個字節8bit)
print(r.getrange("en_name", 0, -1)) # 取所有的字節 junxi 切片操作

setrange

setrange(name, offset, value)
修改字符串內容,從指定字符串索引開始向後替換(新值太長時,則向後添加)
參數:
offset,字符串的索引,字節(一個漢字三個字節)
value,要設置的值
r.setrange("en_name", 1, "ccc")
print(r.get("en_name"))    # jccci 原始值是junxi 從索引號是1開始替換成ccc 變成 jccci2

setbit

setbit(name, offset, value)
對name對應值的二進制表示的位進行操作
參數:
name,redis的name
offset,位的索引(將值變換成二進制後再進行索引)
value,值只能是 1 或 0
註:如果在Redis中有一個對應: n1 = "foo",
那麽字符串foo的二進制表示為:01100110 01101111 01101111
所以,如果執行 setbit(n1, 7, 1),則就會將第7位設置為1,
那麽最終二進制則變成 01100111 01101111 01101111,即:"goo"
擴展,轉換二進制表示:
source = "郭加磊"
source = "foo"
for i in source:
num = ord(i)
print bin(num).replace(b,‘‘)
特別的,如果source是漢字 "郭加磊"怎麽辦?
答:對於utf-8,每一個漢字占 3 個字節,那麽 "郭加磊" 則有 9個字節
對於漢字,for循環時候會按照 字節 叠代,那麽在叠代時,將每一個字節轉換 十進制數,然後再將十進制數轉換成二進制
11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000

getbit

getbit(name, offset)
獲取name對應的值的二進制表示中的某位的值 (0或1)
print(r.getbit("foo1", 0)) # 0 foo1 對應的二進制 4個字節 32位 第0位是0還是1

bitcount

bitcount(key, start=None, end=None)
獲取name對應的值的二進制表示中 1 的個數
參數:
key,Redis的name
start 字節起始位置
end,字節結束位置
print(r.get("foo"))  # goo1 01100111
print(r.bitcount("foo",0,1))  # 11 表示前2個字節中,1出現的個數

bittop

bitop(operation, dest, *keys)
獲取多個值,並將值做位運算,將最後的結果保存至新的name對應的值
參數:
operation,AND(並) 、 OR(或) 、 NOT(非) 、 XOR(異或)
dest, 新的Redis的name
*keys,要查找的Redis的name
如:
bitop("AND", new_name, n1, n2, n3)
獲取Redis中n1,n2,n3對應的值,然後講所有的值做位運算(求並集),然後將結果保存 new_name 對應的值中
r.set("foo","1")  # 0110001
r.set("foo1","2")  # 0110010
print(r.mget("foo","foo1"))  # [‘goo1‘, ‘baaanew‘]
print(r.bitop("AND","new","foo","foo1"))  # "new" 0 0110000
print(r.mget("foo","foo1","new"))

source = "12"
for i in source:
num = ord(i)
print(num)  # 打印每個字母字符或者漢字字符對應的ascii碼值 f-102-0b100111-01100111
print(bin(num))  # 打印每個10進制ascii碼值轉換成二進制的值 0b1100110(0b表示二進制)
print bin(num).replace(b,‘‘)  # 將二進制0b1100110替換成01100110

strlen

strlen(name)
返回name對應值的字節長度(一個漢字3個字節)
print(r.strlen("foo"))  # 4 ‘goo1‘的長度是4

incr

incr(self, name, amount=1)
自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。
參數:
name,Redis的name
amount,自增數(必須是整數)
註:同incrby
r.set("foo", 123)
print(r.mget("foo", "foo1", "foo2", "k1", "k2"))
r.incr("foo", amount=1)
print(r.mget("foo", "foo1", "foo2", "k1", "k2"))
應用場景 – 頁面點擊數
假定我們對一系列頁面需要記錄點擊次數。例如論壇的每個帖子都要記錄點擊次數,而點擊次數比回帖的次數的多得多。如果使用關系數據庫來存儲點擊,可能存在大量的行級鎖爭用。所以,
點擊數的增加使用redis的INCR命令最好不過了。 當redis服務器啟動時,可以從關系數據庫讀入點擊數的初始值(12306這個頁面被訪問了34634次) r.set(
"visit:12306:totals", 34634) print(r.get("visit:12306:totals")) 每當有一個頁面點擊,則使用INCR增加點擊數即可。 r.incr("visit:12306:totals") r.incr("visit:12306:totals") 頁面載入的時候則可直接獲取這個值 print(r.get("visit:12306:totals"))

incrfloat

incrbyfloat(self, name, amount=1.0)
自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。
參數:
name,Redis的name
amount,自增數(浮點型)
r.set("foo1", "123.0")
r.set("foo2", "221.0")
print(r.mget("foo1", "foo2"))
r.incrbyfloat("foo1", amount=2.0)
r.incrbyfloat("foo2", amount=3.0)
print(r.mget("foo1", "foo2"))

decr

decr(self, name, amount=1)
自減 name對應的值,當name不存在時,則創建name=amount,否則,則自減。
參數:
name,Redis的name
amount,自減數(整數)
r.decr("foo4", amount=3) # 遞減3
r.decr("foo1", amount=1) # 遞減1
print(r.mget("foo1", "foo4"))

append

append(key, value)
在redis name對應的值後面追加內容
參數:
key, redis的name
value, 要追加的字符串
r.append("name", "haha")    # 在name對應的值junxi後面追加字符串haha
print(r.mget("name"))

Redis Python開發指南