Redis Python開發指南
阿新 • • 發佈:2018-03-25
叠代 追加內容 替換 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開發指南