redis 事務的本質是通過multi、exec、watch等一組命令的集合。事務支援一次執行多個命令,乙個事務中所有命令都會被序列化。在事務執行過程,會按照順序序列化執行佇列中的命令,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
事務開始 multi
命令入隊
事務執行 exec
原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
事務前後資料的完整性必須保持一致。
多個事務併發執行時,乙個事務的執行不應影響其他事務的執行
永續性是指乙個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響
redis 是單程序程式,並且它保證在執行事務時,不會對事務進行中斷,事務可以執行直到執行完所有事務佇列中的命令為止。因此,redis 的事務是總是帶有隔離性的。
redis中,單條命令是原子性執行的,但事務不保證原子性,且沒有回滾。事務中任意命令執行失敗,其餘的命令仍會被執行。
redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶端對redis的連線並不存在競爭關係redis中可以使用setnx命令實現分布式鎖。
當且僅當 key 不存在,將 key 的值設為 value。若給定的 key 已經存在,則 setnx 不做任何動作
setnx 是『set if not exists』(如果不存在,則 set)的簡寫。
返回值:設定成功,返回 1 。設定失敗,返回 0
使用setnx完成同步鎖的流程及事項如下:
使用setnx命令獲取鎖,若返回0(key已存在,鎖已存在)則獲取失敗,反之獲取成功
為了防止獲取鎖後程式出現異常,導致其他執行緒/程序呼叫setnx命令總是返回0而進入死鎖狀態,需要為該key設定乙個「合理」的過期時間
釋放鎖,使用del命令將鎖資料刪除
redis 官方站提出了一種權威的基於 redis 實現分布式鎖的方式名叫 redlock,此種方式比原先的單節點的方法更安全。它可以保證以下特性:
安全特性:互斥訪問,即永遠只有乙個 client 能拿到鎖
避免死鎖:最終 client 都可能拿到鎖,不會出現死鎖的情況,即使原本鎖住某資源的 client crash 了或者出現了網路分割槽
容錯性:只要大部分 redis 節點存活就可以正常提供服務
快取雪崩是指快取同一時間大面積的失效,所以,後面的請求都會落到資料庫上,造成資料庫短時間內承受大量請求而崩掉。
解決方案
快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。
一般併發量不是特別多的時候,使用最多的解決方案是加鎖排隊。
給每乙個快取資料增加相應的快取標記,記錄快取的是否失效,如果快取標記失效,則更新資料快取。
快取穿透是指快取和資料庫中都沒有的資料,導致所有的請求都落到資料庫上,造成資料庫短時間內承受大量請求而崩掉。
解決方案
介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id<=0的直接攔截;
從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key-value對寫為key-null,快取有效時間可以設定短點,如30秒(設定太長會導致正常情況也沒法使用)。這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊
採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的 bitmap 中,乙個一定不存在的資料會被這個 bitmap 攔截掉,從而避免了對底層儲存系統的查詢壓力
快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。和快取雪崩不同的是,快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫。
解決方案
設定熱點資料永遠不過期。
加互斥鎖,互斥鎖
兩者都是非關係型記憶體鍵值資料庫,現在公司一般都是用 redis 來實現快取,而且 redis 自身也越來越強大了!redis 與 memcached 主要有以下不同:
(1) memcached所有的值均是簡單的字串,redis作為其替代者,支援更為豐富的資料型別
(2) redis的速度比memcached快很多
(3) redis可以持久化其資料
一般來說,就是如果你的系統不是嚴格要求快取+資料庫必須一致性的話,快取可以稍微的跟資料庫偶爾有不一致的情況,最好不要做這個方案,讀請求和寫請求序列化,串到乙個記憶體佇列裡去,這樣就可以保證一定不會出現不一致的情況
序列化之後,就會導致系統的吞吐量會大幅度的降低,用比正常情況下多幾倍的機器去支撐線上的乙個請求。
還有一種方式就是可能會暫時產生不一致的情況,但是發生的機率特別小,就是先更新資料庫,然後再刪除快取。
redis 相關知識
mysql關係型資料庫資料儲存的問題 1,效能瓶頸 磁碟io效能低下 2,擴充套件瓶頸 資料關係複雜,擴充套件性差,不利於搭建集群維護 3,資料增多會讓查詢速度變慢 所以為了減少磁碟io次數,和資料之間的關係,就有了乙個新的概念 nosql nosql not only sql 非關係型資料庫 基於...
redis的相關知識
pom.xml 加入 org.springframework.datagroupid spring data redisartifactid 1.6.0.releaseversion dependency redis.clientsgroupid jedisartifactid 2.7.3versi...
Redis相關基本知識
1 redis預設16個庫 配置檔案內容如下 set the number of databases.the default database is db 0,you can select a different one on a per connection basis using select ...