Redis用途
1.緩存
Redis提供了鍵值過期時間設置, 並且也提供了靈活控制最大內存和內存溢出后的淘汰策略。 可以這么說, 一個合理的緩存設計能夠為一個網站的穩定保駕護航。
2.排行榜系統
Redis提供了列表和有序集合數據結構, 合理地使用這些數據結構可以很方便地構建各種排行榜系統。
3.計數器應用
Redis適用於高並發的遞增、遞減功能
遞增指令:incr(默認從0開始)
遞減指令:decr(默認從0開始,遞減會出現負數,這點跟memcache不一樣,mc到0)
4.社交網絡
贊/踩、 粉絲、 共同好友/喜好、推送、下拉刷新等是社交網站的必備功能,由於社交網站訪問量通常比較大,而且傳統的關系型數據不太適合保存這種類型的數據,
Redis提供的數據結構可以相對比較容易地實現這些功能。
5.消息隊列系統
Redis提供了發布訂閱功能和阻塞隊列的功能,雖然和專業的消息隊列比還不夠足夠強大, 但是對於一般的消息隊列功能基本可以滿足。
6.共享Session
7.限速
但是為了短信接口不被頻繁訪問, 會限制用戶每分鍾獲取驗證碼的頻率, 例如一分鍾不能超過5次。
一些網站限制一個IP地址不能在一秒鍾之內訪問超過n次也可以采用類似的思路。
API的理解和使用
Redis發展歷程中提供了move、 dump+restore、 migrate三組遷移鍵的方法。
Redis默認配置中是有16個數據庫,推薦使用0號數據庫?
假設databases=16, select0操作將切換到第一個數據庫, select15選擇最后一個數據庫, 但是0號數據庫和15號數據庫之間的數據沒有任何關聯, 甚至可以存在相同的鍵。
Redis3.0中已經逐漸弱化這個功能, 例如Redis的分布式實現Redis Cluster只允許使用0號數據庫, 只不過為了向下兼容老版本的數據庫功能,該功能沒有完全廢棄掉。
Redis是單線程的。 如果使用多個數據庫, 那么這些數據庫仍然是使用一個CPU, 彼此之間還是會受到影響的。
多數據庫的使用方式, 會讓調試和運維不同業務的數據庫變的困難,假如有一個慢查詢存在, 依然會影響其他數據庫, 這樣會使得別的業務方定位問題非常的困難。
部分Redis的客戶端根本就不支持這種方式。 即使支持, 在開發的時候來回切換數字形式的數據庫, 很容易弄亂。
筆者建議如果要使用多個數據庫功能, 完全可以在一台機器上部署多個Redis實例, 彼此用端口來做區分, 因為現代計算機或者服務器通常是有多個CPU的。
這樣既保證了業務之間不會受到影響,又合理地使用了CPU資源。
scan命令可以解決keys命令可能帶來的阻塞問題, 同時Redis還提供了hscan、 sscan、 zscan漸進式地遍歷hash、 set、 zset。
小功能大用處
Redis提供了簡單的事務, 之所以說它簡單, 主要是因為它不支持事務中的回滾特性。
客戶端
持久化
Redis提供了兩種持久化方式: RDB和AOF。
RDB持久化是把當前進程數據生成快照保存到硬盤的過程, 觸發RDB持久化過程分為手動觸發和自動觸發。
手動觸發分別對應save和bgsave命令:save命令: 阻塞當前Redis服務器, 直到RDB過程完成為止, 對於內存比較大的實例會造成長時間阻塞, 線上環境不建議使用。
bgsave命令: Redis進程執行fork操作創建子進程, RDB持久化過程由子進程負責, 完成后自動結束。 阻塞只發生在fork階段, 一般時間很短。
顯然bgsave命令是針對save阻塞問題做的優化。 因此Redis內部所有的涉及RDB的操作都采用bgsave的方式, 而save命令已經廢棄。
針對RDB不適合實時持久化的問題, Redis提供了AOF持久化方式來解決。
AOF( append only file) 持久化: 以獨立日志的方式記錄每次寫命令,重啟時再重新執行AOF文件中的命令達到恢復數據的目的。
AOF的主要作用是解決了數據持久化的實時性, 目前已經是Redis持久化的主流方式。
開啟AOF功能需要設置配置: appendonly yes, 默認不開啟。
Redis單線程架構導致無法充分利用CPU多核特性, 通常的做法是在一台機器上部署多個Redis實例。
復制
拓撲
Redis的噩夢: 阻塞
內存
哨兵
集群
Redis Cluster是Redis的分布式解決方案, 在3.0版本正式推出, 有效地解決了Redis分布式方面的需求。 當遇到單機內存、 並發、 流量等瓶頸時, 可以采用Cluster架構方案達到負載均衡的目的。
1.節點取余分區
2.一致性哈希分區
3.虛擬槽分區
緩存設計
緩存穿透
緩存穿透是指查詢一個根本不存在的數據, 緩存層和存儲層都不會命中。(攻擊者利用大量不存在的驗證ID進行請求,導致了緩存穿透,引起后端數據庫壓力驟增而崩潰。)
有效地解決緩存穿透
有很多種方法可以有效地解決緩存穿透問題,最常見的則是采用布隆過濾器,將所有可能存在的數據哈希到一個足夠大的bitmap中,
一個一定不存在的數據會被這個bitmap攔截掉,從而避免了對底層存儲系統的查詢壓力。另外也有一個更為簡單粗暴的方法(我們采用的就是這種),
如果一個查詢返回的數據為空(不管是數 據不存在,還是系統故障),我們仍然把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鍾。
雪崩優化
Redis監控運維雲平台CacheCloud
其他
批量操作命令可以有效提高開發效率
批量設置值
mset key value [key value ...]
批量獲取值
mget key [key ...]
redis怎樣更新值而不重置過期時間
TimeSpan spanTimeoutLeft = redisExpertCodesCacher.KeyTimeToLive(loginHelper.UserName);//獲得key目前的剩余過期時間 bool b = redisExpertCodesCacher.SetAddExpertCode(loginHelper.UserName, q, spanTimeoutLeft);//使用Set存儲 是否需要判斷學者代碼是否存在?如果不存在則添加