在Redis中,SETIFABSENT
命令用于在鍵不存在時(shí)將其設(shè)置為指定的值。但是,Redis本身并沒(méi)有提供內(nèi)置的方法來(lái)監(jiān)控SETIFABSENT
命令的執(zhí)行狀態(tài)。要實(shí)現(xiàn)這個(gè)功能,你可以使用Redis的發(fā)布/訂閱(Pub/Sub)機(jī)制或者通過(guò)跟蹤命令執(zhí)行的時(shí)間戳來(lái)實(shí)現(xiàn)。
方法一:使用發(fā)布/訂閱(Pub/Sub)機(jī)制
PUBLISH command_status "SETIFABSENT"
SETIFABSENT
命令時(shí),都向同一個(gè)頻道發(fā)布一條消息,包含命令的詳細(xì)信息。import redis
r = redis.Redis()
def set_if_absent(key, value):
result = r.set(key, value, ex=None, nx=True)
if result:
# 發(fā)布命令執(zhí)行狀態(tài)
r.publish("command_status", f"SETIFABSENT {key} {value}")
return result
command_status
頻道,以便在命令執(zhí)行時(shí)接收通知。def subscribe_to_commands():
pubsub = r.pubsub()
pubsub.subscribe("command_status")
print("Listening for command status...")
for message in pubsub.listen():
if message['type'] == 'message':
data = message['data'].decode('utf-8')
print(f"Command executed: {data}")
方法二:跟蹤命令執(zhí)行的時(shí)間戳
SETIFABSENT
命令之前,記錄當(dāng)前時(shí)間戳。import time
timestamp = time.time()
SETIFABSENT
命令之后,檢查時(shí)間戳是否發(fā)生變化。如果時(shí)間戳發(fā)生變化,說(shuō)明命令已經(jīng)執(zhí)行。result = r.set(key, value, ex=None, nx=True)
if result:
# 檢查時(shí)間戳是否發(fā)生變化
if time.time() != timestamp:
print("SETIFABSENT command executed")
else:
print("SETIFABSENT command did not execute")
請(qǐng)注意,這兩種方法都需要你修改應(yīng)用程序代碼。如果你希望在Redis服務(wù)器端監(jiān)控命令執(zhí)行狀態(tài),你可能需要考慮使用Redis的Lua腳本或者擴(kuò)展功能。