公司中的爬蟲專案作為乙個接盤來的專案,專案中大致流程是,把要抓取的資料匯入到redis中,然後不斷pop再去抓取。為了避免redis中的資料丟失,大哥採取的是先pop再將拿到的資料通過set的形式在redis中記錄下來。
先上**:redis_client = redis.redis(
"127.0.0.1"
, decode_responses=
true
) queue_name =
"test_queue"
data_key =
"grab_data"
data = redis_client.lpop(queue_name)
if data is
none
:return
redis_client.
set(data_key, data)
這樣的操作看上去沒有問題,但,有可能因為網路或者人為等原因,在pop之後還沒有來的及去觸發set命令。
所以為了保證這兩個操作能夠缺一不可(原子性)
, 由此想到了redis中使用lua指令碼。
no bb, just show me the code. 下次再見,再見來不及握手,主要還是我下班了# 通過lua指令碼將pop和set合併為乙個原子操作
lua_script =
"""local value = redis.call('lpop', ar**[1])
if value then
redis.call('set', ar**[2], value)
endreturn value
"""lua_result =
none
defpop_redis_queue
(redis_client, queue_name, data_key)
:"""
從redis的佇列中pop出乙個值, 並且將pop到的值通過set的方式存起來
:param redis_client: redis操作物件
:param queue_name: 佇列名稱
:data_key: 用於暫時儲存獲取值的key
:return: 1. 當data_key對用的value不為空時, 直接返回它的value
2. 當#佇列的長度大於0時, 返回隊首元素
3. 當#佇列的長度為0時, 返回none
"""# 先看是否有未處理的資料
value = redis_client.get(data_key)
if value:
return
str(value)
global lua_result
ifnot lua_result:
lua_result = redis_client.register_script(lua_script)
data = lua_result(args=
[queue_name, data_key]
, client=redis_client)
return data
Redis使用lua指令碼
版本 自2.6.0起可用。時間複雜度 取決於執行的指令碼。使用lua指令碼的好處 命令格式 eval script numkeys key key arg arg 說明 簡單例項 127.0.0.1 6379 eval return ar 1 0 100 100 127.0.0.1 6379 eva...
Redis使用lua指令碼
版本 自2.6.0起可用。時間複雜度 取決於執行的指令碼。使用lua指令碼的好處 命令格式 copy eval script numkeys key key arg arg 說明 簡單例項 copy 127.0.0.1 6379 eval return ar 1 0 100 100 127.0.0....
Lua指令碼中使用Unicode
如何在lua指令碼中使用unicode是本文要介紹的內容,主要是來學習unicode在lua指令碼中如何使用,具體內容來看本文詳細內容講解。說說最近的幾個事情 1 project採用lua,ui模組肯定是要徹底使用utf 16的,可是lua不支援,怎麼辦?最後好像是寫了userdata,可以將mul...