http://m.wtbis.cn/doc/webman/db/redis.html
中只有 pipeline 的使用方法,
如果想使用事務(wù)保證操作的原子性,該怎么用呢?
可以嘗試編寫lua腳本
謝謝,好像這樣可以:
$key = 'Dingding_send_message';
$contents = Redis::eval(<<<'LUA'
local content = redis.call("get", KEYS[1])
redis.call("del", KEYS[1])
return content
LUA, 1, $key);
場(chǎng)景是這樣的:
有多個(gè)redis消費(fèi)隊(duì)列同時(shí)運(yùn)行,接受一個(gè)字符串$msg,我需要把$msg存到Redis里,如果之前已經(jīng)存了,就append。
另一個(gè)自定義進(jìn)程,每5分鐘運(yùn)行一次,檢查Redis中的字符串是否存在,如存在則將$msg通過(guò)釘釘發(fā)出去,同時(shí)在Redis中刪除字符串。
問(wèn)題是現(xiàn)在沒法用Redis事務(wù),我擔(dān)心自定義進(jìn)程刪除Redis的時(shí)候,消費(fèi)隊(duì)列正好新增。
這種場(chǎng)景,有更好的解決方案嗎?
$key = 'Dingding_send_message';
$contents = Redis::eval(<<<'LUA'
local content = redis.call("get", KEYS[1])
redis.call("del", KEYS[1])
return content
LUA, 1, $key);
也可以結(jié)合redis list來(lái)管理 lpush + rpop
//消息入列
$redis->lPush('Dingding_send_message', $msg);
//定時(shí)任務(wù)進(jìn)行出列
while ($msg = $redis->rPop('Dingding_send_message')) {
sendToDingDing($msg); //發(fā)送到釘釘
}