国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

webman redis 中如何啟用事務(wù)?

roczyl

http://www.wtbis.cn/doc/webman/db/redis.html
中只有 pipeline 的使用方法,
如果想使用事務(wù)保證操作的原子性,該怎么用呢?

439 4 2
4個回答

胡桃

無法啟用

  • roczyl 2025-03-03
            $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);
  • 胡桃 2025-03-04

    這不是事務(wù),只是一個原子性的指令,ACID 特性只保證了 A。

    而且 Redis 官方在 7.0 之后推出了 Functions 替代 Eval Scripts.

  • roczyl 2025-03-04

    嗯。實(shí)際上我只要保證在讀取和刪除之間不要插入新的數(shù)據(jù)就行。這個可以滿足我的要求。

timeless-zyg

可以嘗試編寫lua腳本

roczyl

場景是這樣的:
有多個redis消費(fèi)隊列同時運(yùn)行,接受一個字符串$msg,我需要把$msg存到Redis里,如果之前已經(jīng)存了,就append。
另一個自定義進(jìn)程,每5分鐘運(yùn)行一次,檢查Redis中的字符串是否存在,如存在則將$msg通過釘釘發(fā)出去,同時在Redis中刪除字符串。
問題是現(xiàn)在沒法用Redis事務(wù),我擔(dān)心自定義進(jìn)程刪除Redis的時候,消費(fèi)隊列正好新增。
這種場景,有更好的解決方案嗎?

  • roczyl 2025-03-03
            $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);
shiroi

也可以結(jié)合redis list來管理 lpush + rpop

//消息入列
$redis->lPush('Dingding_send_message', $msg);

//定時任務(wù)進(jìn)行出列
while ($msg = $redis->rPop('Dingding_send_message')) {
    sendToDingDing($msg); //發(fā)送到釘釘
}
  • roczyl 2025-03-04

    有30個進(jìn)程在1分鐘之內(nèi)往Redis中放數(shù)據(jù),也許其中幾個會失敗,我大概在1分鐘以后,將這30個都拿出來拼成一個字符串發(fā)送到釘釘。

  • roczyl 2025-03-04

    用你這種一個個發(fā)的話,實(shí)際上我就沒必要這樣做了,收到信息就發(fā)掉就行了。

??