問題整理---Redis事務/分佈式鎖/主從複製

(1)介紹

傳統的關係型數據庫,如Mysql是指出ACID的,但是由於Redis不支持回滾操作,原子性支持不完整,一致性當然也不會支持了,Redis僅支持隔離性,對於持久性,Redis是支持AOF和RDB兩種方式的,但由於會影響性能,默認情況是不支持的。

Redis事務的實現需要用到 MULTI  EXEC 兩個命令,事務開始的時候先向Redis服務器發送 MULTI 命令,然後依次發送需要在本次事務中處理的命令,放入隊列中,最後再發送 EXEC 命令,一次性批量執行所有命令。

(2)事務中錯誤的處理方式(不回滾)

一般錯誤有兩種:語法錯誤和運行錯誤

1、語法錯誤指的是命令書寫錯誤和參數錯誤等

這種情況需要區分Redis的版本,Redis 2.6.5之前的版本會忽略錯誤的命令,執行其他正確的命令(不回滾),2.6.5之後的版本會忽略這個事務中的所有命令,都不執行(原子性的保證)

2、運行錯誤指的是運行時出現的錯誤,比如用不匹配的關鍵字操作;

這種錯誤一般在運行前是不會被發現的,因此如果遇見了,就會跳過錯誤命令繼續執行。

(3)不保證原子性的官方解釋

  1. Redis 操作失敗的原因只可能是語法錯誤或者錯誤的數據庫類型操作,這些都是在開發層面能發現的問題不會進入到生產環境,因此不需要回滾。
  2. Redis 內部設計推崇簡單和高性能,因此不需要回滾能力。

(4)多線程下的事務處理

WATCH關鍵字(事務監控)

MySQL採用的是悲觀鎖操作,一個線程獲取了鎖,其他線程就能在操作了,智能進入隊列中等待獲取鎖。

而redis採用的是樂觀鎖,被WATCH監控的一個或多個鍵,一旦有一個鍵被修改,後面的事務就不再執行,知道EXEC監控才結束。優點就是響應時間快

被WATCH監控的鍵,能夠知道是否被修改過,如修改過,後面的事務都不會被執行。

例如:一個KEY被WATCH修飾後,一個線程A執行對KEY事務操作,在沒有EXEC前,另一個線程B先對KEY進行了修改,線程A就就不會執行該事務。

(5)使用案例---秒殺搶購系統

https://blog.csdn.net/qq1013598664/article/details/70183908

1、使用watch,採用樂觀鎖
2、不使用悲觀鎖,因爲等待時間非常長,響應慢
3、不使用隊列,因爲併發量會讓隊列內存瞬間升高


Redis分佈式鎖

(1)單機情況

一般在單機情況下,都是使用java jvm 或者api自帶的鎖實現併發訪問的問題

(2)分佈式情況

1.採用setnx()

注意問題:

  • 要try finally 釋放鎖
  • 要設置鎖過期時間(防止宕機,出現死鎖情況)
  • 要將鎖過期時間和setnx()操作爲原子方法

2.redLock

即使上面的情況解決了分佈式併發,但如果是高併發情況,運行未結束,但是鎖已經過期了,其他線程將獲取到鎖,但原來的線程執行完會釋放鎖,這時候釋放的是其他線程的鎖,就出現了鎖失效的問題,這種情況在高併發的時候會發生,解決辦法就是在setnx時,將value設置爲當前線程專屬的值 uuid,這樣,只可以釋放自己的鎖,就不會釋放其他線程的鎖了。

但這種仍然存在問題,就是本線程未執行完,其他線程又獲取鎖了,就不能解決高併發了,因此當鎖要失效的時候,可以爲鎖進行續命,方法是開啓一個內部線程,每10秒判斷釋放鎖還有效,如果有,將鎖有效值重新設置爲30秒。

3.Redission

上面的方式雖然能有效,但是存在要自己寫線程,可能會出現錯誤,使用Redission,方便的解決上面的所有問題,很簡單。


主從複製

(1)介紹

  也就是我們所說的主從複製,主機數據更新後根據配置和策略,自動同步到備機的master/slaver機制,Master以寫爲主,Slave以讀爲主

(2)作用

讀寫分離    容災恢復

(3)


 Redismemcache有什麼區別 什麼情況下選memcache

(1)支持的數據結構:redis支持更多的數據結構,memcache僅支持key-value因此需要獲取到進行修改後再set進去,磁盤io會加大;

(2)持久性:redis支持持久性,memcache不支持;

(3)一致性問題:memcache提供了cas命令,可以保證多個併發訪問操作同一份數據的一致性問題。 Redis沒有提供cas 命令,並不能保證這點,不過Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。

(4)備份:Redis支持數據的備份,即master-slave模式的數據備份。memcache可以使用一致性hash做分佈式

(5)大小:redis最大可以達到1GB,而memcache只有1MB

redis:數據量較小的更性能操作和運算上。

memcache:用於在動態系統中減少數據庫負載,提升性能;做緩存,提高性能(適合讀多寫少,對於數據量比較大,可以採用sharding)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章