前言
常用的sql資料庫的資料都是存在磁碟中的,雖然在資料庫底層也做了對應的快取來減少資料庫的io壓力,但由於資料庫的快取一般是針對查詢的內容,而且粒度也比較小,一般只有表中的資料沒有發生變動的時候,資料庫的快取才會產生作用,但這並不能減少業務邏輯對資料庫的增刪改操作的io壓力,因此快取技術應運而生,該技術實現了對熱點資料的快取記憶體,可以大大緩解後端資料庫的壓力。
主流應用架構
客戶端在對資料庫發起請求時,先到快取層檢視是否有所需的資料,如果快取層存有客戶端所需的資料,則直接從快取層返回,否則進行穿透查詢,對資料庫進行查詢,如果在資料庫中查詢到該資料,則將該資料回寫到快取層,以便下次客戶端再次查詢能夠直接從快取層獲取資料。
快取中介軟體 -- memcache和redis的區別
為什麼redis能這麼快
redis的效率很高,官方給出的資料是100000+qps(query per second),這是因為:
1.redis完全基於記憶體,絕大部分請求是純粹的記憶體操作,執行效率高。2.redis使用單程序單執行緒模型的(k,v)資料庫,將資料儲存在記憶體中,訪問均不會受到硬碟io的限制,因此其執行速度極快,另外單執行緒也能處理高併發請求,還可以避免頻繁上下文切換和鎖的競爭,如果想要多核執行也可以啟動多個例項。
3.資料結構簡單,對資料操作也簡單,redis不使用表,不會強制使用者對各個關係進行關聯,不會有複雜的關係限制,其儲存結構就是鍵值對,類似於hashmap,hashmap最大的優點就是訪問的時間複雜度為o(1)。
注:redis採用的i/o多路復用函式:epoll/kqueue/evport/select選用策略:1.因地制宜,優先選擇時間複雜度為o(1)的i/o多路復用函式作為底層實現。
2.由於select要遍歷每乙個io,所以其時間複雜度為o(n),通常被作為保底方案。
3.基於react設計模式監聽i/o事件。
注:如果重複寫入key相同的鍵值對,後寫入的會將之前寫入的覆蓋。
hash
string元素組成的字典,適用於儲存物件。
列表,按照string元素插入順序排序。其順序為後進先出。由於其具有棧的特性,所以可以實現如「最新訊息排行榜」這類的功能。
string元素組成的無序集合,通過雜湊表實現(增刪改查時間複雜度為o(1)),不允許重複。
另外,當我們使用smembers遍歷set中的元素時,其順序也是不確定的,是通過hash運算過後的結果。redis還對集合提供了求交集、並集、差集等操作,可以實現如同共同關注,共同好友等功能。
sorted set
通過分數來為集合中的成員進行從小到大的排序。
從海量key裡查詢出某乙個固定字首的key
如何通過redis實現分布式鎖
用法:expire key seconds
如何實現非同步佇列
redis持久化
redis資料的恢復
pineline
pipeline和linux的管道類似,它可以讓redis批量執行指令。
redis基於請求/響應模型,單個請求處理需要一一應答。如果需要同時執行大量命令,則每條命令都需要等待上一條命令執行完畢後才能繼續執行,這中間不僅僅多了rtt,還多次使用了系統io。pipeline由於可以批量執行指令,所以可以節省多次io和請求響應往返的時間。但是如果指令之間存在依賴關係,則建議分批傳送指令。
redis的同步機制
redis集群
結語
redis 模糊刪除key
由於在我們的專案中使用spring cached和redis結合的方式對一部分資料做資料庫快取,當快取和資料庫資料不一致時 由於手動改資料庫引起 就得清空資料庫的快取,這就涉及到redis迷糊匹配刪除資料的情況發生。redis keys命令支援模式匹配,但是del命令不支援模式匹配,有時候需要根據一...
redis 刪除所有key
刪除所有key,可以使用redis的flushdb和flushall命令 刪除當前資料庫中的所有key flushdb 刪除所有資料庫中的key flushall 如果要訪問 redis 中特定的資料庫,使用下面的命令 下面的命令指定資料序號為0,即預設資料庫 redis cli n 0 keys ...
redis 刪除所有key
刪除所有key,可以使用redis的flushdb和flushall命令 刪除當前資料庫中的所有key flushdb 刪除所有資料庫中的key flushall 如果要訪問 redis 中特定的資料庫,使用下面的命令 下面的命令指定資料序號為0,即預設資料庫 redis cli n 0 keys ...