lua redis 的去重佇列

2021-09-29 18:53:10 字數 1645 閱讀 9310

因為redis 對lua 指令碼是執行的,所以我們的思路是 list + set ,來保證佇列去重。lua 指令碼如下:

script_push = `

local q = keys[1]

local q_set = keys[1] .. "_set"

local v = redis.call("sadd", q_set, ar**[1])

if v == 1

then

return redis.call("rpush", q, ar**[1]) and 1

else

return 0

end`

script_pop = `

local q = keys[1]

local q_set = keys[1] .. "_set"

local v = redis.call("lpop", q)

if v ~= ""

then

redis.call("srem", q_set, v)

endreturn v

`

在push 任務之前,先看任務是否在set 中,在pop之後,立刻從set中刪除,因為lua 指令碼的原子性,所以,能起到去重的作用。

在python 中呼叫的方式如下:    

import redis

script_push = '''

local q = keys[1]

local q_set = keys[1] .. "_set"

local v = redis.call("sadd", q_set, ar**[1])

if v == 1

then

return redis.call("rpush", q, ar**[1]) and 1

else

return 0

end'''

script_pop = '''

local q = keys[1]

local q_set = keys[1] .. "_set"

local v = redis.call("lpop", q)

if v ~= ""

then

redis.call("srem", q_set, v)

endreturn v

'''pool = redis.connectionpool(host='localhost', port=6379, db=0)

r = redis.redis(connection_pool=pool)

script1 = r.register_script(script_push)

script2 = r.register_script(script_pop)

print r.get("mykey")

print script1( keys=["mykey"], args = [1,0] )

print r.get("mykey"), "ok"

print r.get("mykey")

print script2( keys=["mykey"], args = [1] )

print r.get("mykey")

golang 等其他語言,使用方式一樣,沒什麼好說的。

count去重和distinct去重

有兩種去重方法 1 select count distinct id from a 這個是將所有值都放入到記憶體中,key為列值,通過hash算出有多少個key就是多少行。2 select count 1 from select 1 from a group by id a,這個是通過group b...

JS陣列去重,物件去重

例項1根據indexof去重,indexof的好處就是返回的是首次出現的位置,這樣後面即使出現的值一樣,也只能返回第一次出現的索引,當然這個只適用於簡單的陣列 物件陣列去重 const objarr const obj const newobjarr for let i 0 i objarr.len...

lambda 物件去重 lambda去重

lambda去重使用collectingandthen方法 list 物件中,如果根據object的單個屬性進行過濾去重,則 list userlist users.stream collect collectors.collectingandthen collectors.tocollection...