天天看點

python調用lua腳本_python redis 關于pipline(),lua腳本和scan指令的初步使用

conn=redis.StrictRedis(connection_pool=config_manager_list[str(app_id)].redis_pool,socket_timeout=5,socket_connect_timeout=5, retry_on_timeout=5) 連接配接資料庫

r = conn.pipeline() 擷取管道

使用pipelining 發送指令時,redis server必須部分請求放到隊列中(使用記憶體)執行完畢後一次性發送結果

pipeline期間将“獨占”連結,此期間将不能進行非“管道”類型的其他操作,直到pipeline關閉;如果你的pipeline的指令集很龐大,為了不幹擾連結中的其他操作,你可以為pipeline操作建立Client連結,讓pipeline和其他正常操作分離在2個client中

r.hset(name, "JWT", new_JWT) 更新key為name的哈希記錄裡叫做 JWT字段的值為new_JWT

r.rename(old_name, new_name) 将old_name對應的哈希記錄的key更新為new_name

r.execute() 執行指令

pipeline和 execute合起來相當于使用事務來操作,可以一次性執行多個指令

#!/usr/bin/python2

import redis

import time

def without_pipeline():

r=redis.Redis()

for i in range(10000):

r.ping()

return

def with_pipeline():

r=redis.Redis()

pipeline=r.pipeline()

for i in range(10000):

pipeline.ping()

pipeline.execute()

return

def bench(desc):

start=time.clock()

desc()

stop=time.clock()

diff=stop-start

print "%s has token %s" % (desc.func_name,str(diff))

if __name__=='__main__':

bench(without_pipeline)

bench(with_pipeline)

# 測試結果

without_pipeline has token 4.64443057954

with_pipeline has token 0.098383873589

python 調用lua腳本操作redis

s = self.conn.register_script(GET_COUNT_SCRIPT)

res = s(args=patterns)

GET_ALL_RID_SCRIPT = """

local cursor = "0"

local matchKey = ARGV[1]

local matchKeyPrefix = string.sub(matchKey,1,-2)

local ridList = {};

local done = false;

repeat

local result = redis.call("SCAN", cursor, "match", matchKey)

cursor = result[1];

for i, key in ipairs(result[2]) do

local rid = string.gsub(key,matchKeyPrefix,"");

table.insert(ridList,rid);

end

if cursor == "0" then

done = true;

end

until done

return ridList;

"""

s = self.conn.register_script(GET_ALL_RID_SCRIPT)

res = s(args=[match])

scan 指令

python調用lua腳本_python redis 關于pipline(),lua腳本和scan指令的初步使用

通過key '*' 查找所有key

python調用lua腳本_python redis 關于pipline(),lua腳本和scan指令的初步使用

無比對模式周遊

python調用lua腳本_python redis 關于pipline(),lua腳本和scan指令的初步使用

有比對模式周遊