Redis實現(xiàn)事物以及鎖的方法
一、什么是Redis事物
Redis事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執(zhí)行。事務在執(zhí)行的過程中,不會被其他客戶端發(fā)送來的命令請求所打斷。
作用:
串聯(lián)多個命令防止別的命令插隊。
二、Redis 事務命令
下表列出了 redis 事務的相關命令:
注意:加入事務的命令暫時進入到任務隊列中,并沒有立即執(zhí)行,只有執(zhí)行exec命令才開始執(zhí)行
三、命令行演示
演示事物的開始、執(zhí)行
127.0.0.1:6379> MULTI OK 127.0.0.1:6379(TX)> set name cabbage QUEUED 127.0.0.1:6379(TX)> set age 20 QUEUED 127.0.0.1:6379(TX)> EXEC 1) OK 2) OK 127.0.0.1:6379> keys * 1) "name" 2) "age"
演示事物的開始與取消:
127.0.0.1:6379> MULTI OK 127.0.0.1:6379(TX)> set name cabbage QUEUED 127.0.0.1:6379(TX)> set age 20 QUEUED 127.0.0.1:6379(TX)> DISCARD OK 127.0.0.1:6379> keys * (empty array)
演示事物的watch:
四、事物注意事項
指命令書寫格式有誤時
,整體事務中所有命令均不會執(zhí)行,包括那些語法正確的命令
指命令格式正確,但是無法正確的執(zhí)行時
,能夠正確運行的命令會執(zhí)行,運行錯誤的命令不會被執(zhí)行且對應的數(shù)據(jù)不會實現(xiàn)回滾。
五、事務三特性
單獨的隔離操作
事務中的所有命令都會序列化、按順序地執(zhí)行。事務在執(zhí)行的過程中,不會被其他客戶端發(fā)送來的命令請求所打斷。
沒有隔離級別的概念
隊列中的命令沒有提交之前都不會實際被執(zhí)行,因為事務提交前任何指令都不會被實際執(zhí)行
不保證原子性
事務中如果有一條命令執(zhí)行失敗,其后的命令仍然會被執(zhí)行,沒有回滾
六、分布式鎖
業(yè)務分析:
雖然redis是單線程的,但是多個客戶端對同一數(shù)據(jù)同時進行操作時,如何避免不被同時修改?
解決方案:
使用 expire 為鎖key添加時間限定,到時不釋放,則放棄鎖
命令行演示:
127.0.0.1:6379> set name cabbage OK 127.0.0.1:6379> setnx lock_time 1 (integer) 1 127.0.0.1:6379> EXPIRE lock_time 20 (integer) 1 127.0.0.1:6379> get name "cabbage"
通過這種方式,即使某個客戶端由于某種原因沒有手動釋放鎖,也不會造成死鎖。因為設置了鎖lock_time
的有效時間為20秒,當20秒過后,其它的客戶端就可以拿到鎖、實施業(yè)務操作、釋放鎖了。
到此這篇關于Redis實現(xiàn)事物以及鎖的方法的文章就介紹到這了,更多相關Redis 事物及鎖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
CentOS系統(tǒng)中Redis數(shù)據(jù)庫的安裝配置指南
Redis是一個基于主存存儲的數(shù)據(jù)庫,性能很強,這里我們就來看一下CentOS系統(tǒng)中Redis數(shù)據(jù)庫的安裝配置指南,包括將Redis作為系統(tǒng)服務運行的技巧等,需要的朋友可以參考下2016-06-06SpringSession通過Redis統(tǒng)計在線用戶數(shù)量的實現(xiàn)代碼
這篇文章主要介紹了SpringSession通過Redis統(tǒng)計在線用戶數(shù)量,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04redis發(fā)布訂閱_動力節(jié)點Java學院整理
這篇文章主要介紹了redis發(fā)布訂閱,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08