一、redis是什么
Redis(全稱:Remote Dictionary Server 遠程字典服務)是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日志型、Key-Value nosql 數據庫,並提供多種語言的API。
二、redis的應用場景
1、緩存
緩存現在幾乎是所有中大型網站都在用的必殺技,合理的利用緩存不僅能夠提升網站訪問速度,還能大大降低數據庫的壓力。Redis提供了鍵過期功能,也提供了靈活的鍵淘汰策略,所以,現在Redis用在緩存的場合非常多。
2、排行榜
很多網站都有排行榜應用的,如京東的月度銷量榜單、商品按時間的上新排行榜等。Redis提供的有序集合數據類構能實現各種復雜的排行榜應用。
3、計數器
什么是計數器,如電商網站商品的瀏覽量、視頻網站視頻的播放數等。為了保證數據實時效,每次瀏覽都得給+1,並發量高時如果每次都請求數據庫操作無疑是種挑戰和壓力。
Redis提供的incr命令來實現計數器功能,內存操作,性能非常好,非常適用於這些計數場景。
4、分布式會話
集群模式下,在應用不多的情況下一般使用容器自帶的session復制功能就能滿足,當應用增多相對復雜的系統中,一般都會搭建以Redis等內存數據庫為中心的session服務,session不再由容器管理,而是由session服務及內存數據庫管理。
5、分布式鎖
在很多互聯網公司中都使用了分布式技術,分布式技術帶來的技術挑戰是對同一個資源的並發訪問,如全局ID、減庫存、秒殺等場景,並發量不大的場景可以使用數據庫的悲觀鎖、樂觀鎖來實現,但在並發量高的場合中,利用數據庫鎖來控制資源的並發訪問是不太理想的,大大影響了數據庫的性能。可以利用Redis的setnx功能來編寫分布式的鎖,如果設置返回1說明獲取鎖成功,否則獲取鎖失敗,實際應用中要考慮的細節要更多。
6、 社交網絡
點贊、踩、關注/被關注、共同好友等是社交網站的基本功能,社交網站的訪問量通常來說比較大,而且傳統的關系數據庫類型不適合存儲這種類型的數據,Redis提供的哈希、集合等數據結構能很方便的的實現這些功能。
7、最新列表
Redis列表結構,LPUSH可以在列表頭部插入一個內容ID作為關鍵字,LTRIM可用來限制列表的數量,這樣列表永遠為N個ID,無需查詢最新的列表,直接根據ID去到對應的內容頁即可。
8、消息系統(不推薦使用)
消息隊列是大型網站必用中間件,如ActiveMQ、RabbitMQ、Kafka等流行的消息隊列中間件,主要用於業務解耦、流量削峰及異步處理實時性低的業務。Redis提供了發布/訂閱及阻塞隊列功能,能實現一個簡單的消息隊列系統。
三、redis的優點和缺點
優點:
(1)速度快,因為數據存在內存中,類似於 HashMap,HashMap 的優勢就是查找和操作的時間復雜度都是 O1)
(2)支持豐富數據類型,支持 string,list,set,Zset,hash 等
(3)支持事務,操作都是原子性,所謂的原子性就是對數據的更改要么全部執行,要么全部不執行
(4)豐富的特性:可用於緩存,消息,按 key 設置過期時間,過期后將會自動刪除,支持數據的持久化,支持數據的備份,即master-slave模式的數據備份。
缺點:
(1)由於 Redis 是內存數據庫,所以,單台機器,存儲的數據量,跟機器本身的內存大小。雖然 Redis 本身有 Key 過期策略,但是還是需要提前預估和節約內存。如果內存增長過快,需要定期刪除數據。
(2)redis是單線程的,單台服務器無法充分利用多核服務器的CPU。
四、redis為什么快?
1、完全基於內存,絕大部分請求是純粹的內存操作,非常快速。數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間復雜度都是O(1);
2、數據結構簡單,對數據操作也簡單,Redis中的數據結構是專門進行設計的;
3、采用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的性能消耗;
4、使用多路I/O復用模型,非阻塞IO;
5、使用底層模型不同,它們之間底層實現方式以及與客戶端之間通信的應用協議不一樣,Redis直接自己構建了VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求;