mysql關係型資料庫資料儲存的問題
1,效能瓶頸 磁碟io效能低下
2,擴充套件瓶頸 資料關係複雜,擴充套件性差,不利於搭建集群維護
3,資料增多會讓查詢速度變慢
所以為了減少磁碟io次數,和資料之間的關係,就有了乙個新的概念 nosql
nosql (not-only sql) 非關係型資料庫 ,基於記憶體結構,資料之間沒有關係。作為關係型資料庫的補充,應對現在基於海量使用者和海量資料的的資料處理問題。
比如電商場景下 會把熱點和活動期間需要高頻訪問的資料快取到redis當中,
redis是乙個開源的可基於記憶體、分布式、可選永續性的鍵值對(key-value)儲存資料庫儲存系統
redis的特點
1 高效能 , 記憶體儲存不走 io 在大資料量下也可以實現高效能執行 官方提供測試資料,50個併發執行100000個請求,讀110000 次/s,寫81000次/s
2 資料結構豐富 支援的資料型別有 string(字串) hash(雜湊) list(列表) set (集合) zset(sorted set:有序集合)。
3 原子性 核心讀寫部分是單執行緒 排隊執行 對應的操作便具有了原子性,避免多執行緒帶來的複雜性和不安全型
4 高可用,redis 從3.0開始支援集群,可多主多從 ,單個節點故障,其他機器可迅速頂替,保證集群的高可用
5 可持久化,支援把資料持久化到硬碟中,以免遇到重啟或者故障後可以從硬碟中恢復
實際上redis每種資料結構都有自己底層的內部編碼實現,而且是多種實現,例如list資料介面就包含了linkedlist和ziplist兩種內部編碼,同時有些內部編碼可以作為多種外部資料結構的內部實現,可以通過object encoding 命令查詢內部編碼 如 object encoding hello;
應用場景
1,快取,查詢頻率較高,不經常變得資料
2,即時資訊,臨時型的,經常變化的
3,session共享,可使用者解決分布式中session共享的問題 時效性訊息,佇列訊息等
redis 的刪除策略和淘汰策略
刪除策略是指已經過期的資料怎麼刪除
1,定時刪除 節省記憶體cpu壓力大 , 不分時間段 到時間即刪除過期資料 即使cpu效能使用過高時也會執行 占用cpu資源
2,懶惰刪除 節約cpu效能記憶體壓力大, 資料到達過期時間,不做處理。等下次訪問該資料時,我們需要判斷,如果未過期,返回資料。發現已過期,則刪除,返回不存在。
3,定期刪除 定期隨機刪除 , 使用固定的cpu資源 隨機抽查 當前一場抽查刪除很多資料時會再次抽查當前資料。週期性抽查儲存空間(隨機抽查,重點抽查)
淘汰機制是指當記憶體不夠時淘汰掉一些資料以騰出記憶體空間,淘汰的可能是還未過期的資料
redis
在執行每個指令前,都要呼叫freememoryifneeded()
檢測記憶體是否充足,如果不能滿足新加入資料的最低儲存大小,redis
要刪除一些資料為新的資料騰出一些記憶體空間,此為逐出演算法。
可以選擇執行淘汰策略 長時間不用的、用的次數少的、快要過去過期的或者隨機淘汰,也可也全盤刪除獲取不進行淘汰
面試可能會問道的redis常見的問題和解決方案
1 快取預熱,提前把需要用到的熱點資料快取到redis 避免大請求打到mysql類的關係型資料庫上
2 快取穿透 當大量請求來查詢沒有的資料
,請求到達redis 發現沒有命中,然後請求到達了mysql
比如大量請求來查詢id的-1 的資料 那mysql資料的id都是從0開自增,當然就沒有資料 這個時候就要排查問題 ,可能存在黑客攻擊等問題,可以在介面處做基礎校驗,使用者校驗、id做基礎校驗,id<=0的直接攔截
如果是相同的請求請求很多次,那麼可以選擇把固定的key快取到redis,對應的value為null,
如果是 每次請求引數
不同,那可以快取所有的不存在的key,記憶體壓力過大淘汰機制會把有效資料淘汰。level1
的方案已經不能解決。也可以使用布隆過濾器等過濾每次請求,不存在的資料會無法通過布隆過濾器,可以使用不超過1g的記憶體,儲存超過百億的資料量。
3 快取雪崩 短時內大量的熱點key同時過期 然後大量請求到mysql,造成mysql壓力變大 如**做活動是大量的快取熱點資訊過期 然後使用者請求直接打到mysql
解決方法 錯峰設定熱帶資料的過期時間,採用不同的固定時間+-隨機時間,避免同時失效的情況, 或者讓快取永不失效,之後再修改,還可以通過加互斥鎖。
4 快取擊穿, 某個熱點key過期 導致大量請求到mysql, 解決方法 監控超熱資料 適當延長過期時間,或者設定長期有效,之後再修改,還可以通過加互斥鎖
。完全基於記憶體,絕大部分請求是純粹的記憶體操作,執行效率高 採用單執行緒,單執行緒也能處理高併發請求,想多核也可啟動多例項
單執行緒反而避免了多執行緒的頻繁上下文切換問題,預防了多執行緒可能產生的競爭問題。
核心是基於非阻塞的 io 多路復用機制。
Redis相關知識(二)
redis 事務的本質是通過multi exec watch等一組命令的集合。事務支援一次執行多個命令,乙個事務中所有命令都會被序列化。在事務執行過程,會按照順序序列化執行佇列中的命令,其他客戶端提交的命令請求不會插入到事務執行命令序列中。事務開始 multi 命令入隊 事務執行 exec 原子性是...
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 ...