首頁 >資料庫 >Redis >Redis的事務及樂觀鎖的應用

Redis的事務及樂觀鎖的應用

齐天大圣
齐天大圣原創
2020-05-15 12:16:381800瀏覽

相信phper都或多或少知道事務,在某些場景中也會常用到事務。例如購買了一個產品,需要向訂單表插入一條數據,還要修改用戶表的餘額欄位等等。這兩個操作必須是一起成功,或是都失敗,否則就會產生數據不一致的情況。

Redis中也支援事務的特性。雖然沒有傳統關係型資料庫的事務功能那麼強大,但它的使用非常簡單。

交易

MULTI

multi標誌個一個交易的開始。隨後的指令將在執行EXEC時作為一個原子執行。

DISCARD

Discard 指令用於取消事務,放棄執行事務區塊內的所有指令。

EXEC

exec指令用來執行所有交易區塊內的指令

介紹了上面三個指令後,我們來完成一個小功能,用戶關注:

例如A用戶關注了B,那麼需要在A的關注表中添加B,此外B的粉絲表中要添加A;這兩個操作要作為一個原子來執行的。

實作程式碼如下:

$redis->multi()
    ->sadd('like:A', 'B')
    ->sadd('fans:B', 'A')
    ->exec();

是不是使用起來非常簡單。

樂觀鎖定

首先來介紹下什麼是樂觀鎖,以及它對應的悲觀鎖。

悲觀鎖:想法很悲觀啦,對自己的男朋友不放心,只要自己和男朋友在一起時,任何人都接觸不了他男朋友。 Mysql中的行鎖、表鎖等,都屬於悲觀鎖。

樂觀鎖:很樂觀很天真,對自己的男朋友放心,自己和男朋友在一起時,有其他朋友找她男朋友聊天時,她不會阻止。但每次兩人在一起時,她都會對男友最近的狀態做評定,判斷他是否有問題。沒有問題才會繼續和他在一起,否則就拜拜。

下面有一個場景:Redis存放著token,但是這個token是要隔一段時間就需要更新的。悲觀鎖的作為是,修改前我就要將它鎖定,這個時候其他任何請求都不能修改他,直到我修改完成後,才會解除鎖定。樂觀鎖的作法則是,修改的時候不會鎖定,但修改前我會觀察它的狀態,如果他沒有被修改,那麼我就做修改,如果狀態改變了,那麼我就不做修改的操作。 、

Redis中如何使用樂觀鎖的呢?

Redis中提供了一個指令Watch,標記所有指定的key 被監視起來,在事務中有條件的執行。

下面是偽代碼:

$redis->watch('token');

$redis->multi()
    ->set('token','sfwefawfwefa323')
    ->exec();

樂觀鎖和悲觀鎖都有自己的使用場景,大家可以自行查閱相關訊息,這裡就不多贅述了。

以上是Redis的事務及樂觀鎖的應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn