Redis中使用lua指令碼

2021-10-23 11:35:30 字數 1554 閱讀 3036

公司中的爬蟲專案作為乙個接盤來的專案,專案中大致流程是,把要抓取的資料匯入到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指令碼。

先上**:

# 通過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

no bb, just show me the code. 下次再見,再見來不及握手,主要還是我下班了

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...