redis簡介及常見問題

簡介

redis全稱:Remote Dictionary Server。算法

Redis本質上是一個Key-Value類型的內存數據庫,很像memcached,整個數據庫通通加載在內存當中進行操做,按期經過異步操做把數據庫數據flush到硬盤上進行保存。數據庫

由於是純內存操做,Redis的性能很是出色,每秒能夠處理超過10萬次讀寫操做,是已知性能最快的Key-Value數據庫。讀的速度是110000次/s,寫的速度是81000次/s緩存

Redis的出色之處不只僅是性能,Redis最大的魅力是支持保存多種數據結構,此外單個value的最大限制是512MB,不像memcached只能保存1MB的數據.安全

所以Redis能夠用來實現不少有用的功能,比方說用他的List來作FIFO雙向鏈表,實現一個輕量級的高性能消息隊列服務,用他的Set能夠作高性能的tag系統等等。另外Redis也能夠對存入的Key-Value設置expire時間,所以也能夠被看成一 個功能增強版的memcached來用。服務器

特色

  • Redis是線程安全的(由於只有一個線程),其全部操做都是原子的,不會因併發產生數據異常網絡

  • Redis的速度很是快(由於使用非阻塞式IO,且大部分命令的算法時間複雜度都是O(1))數據結構

  • 使用高耗時的Redis命令是很危險的,會佔用惟一的一個線程的大量處理時間,致使全部的請求都被拖慢。(例如時間複雜度爲O(N)的KEYS命令,嚴格禁止在生產環境中使用)多線程

優勢

  • 高性能
  • 高併發

高性能

假如用戶第一次訪問數據庫中的某些數據。這個過程會比較慢,由於是從硬盤上讀取的。將該用戶訪問的數據存在緩存中,這樣下一次再訪問這些數據的時候就能夠直接從緩存中獲取了。操做緩存就是直接操做內存,因此速度至關快。若是數據庫中的對應數據改變以後,同步改變緩存中相應的數據便可!架構

高併發

直接操做緩存可以承受的請求是遠遠大於直接訪問數據庫的,因此咱們能夠考慮把數據庫中的部分數據轉移到緩存中去,這樣用戶的一部分請求會直接到緩存這裏而不用通過數據庫。

爲何要用 redis 而不用 map/guava 作緩存?

緩存分爲本地緩存和分佈式緩存。以 Java 爲例,使用自帶的 map 或者 guava 實現的是本地緩存,最主要的特色是輕量以及快速,生命週期隨着 jvm 的銷燬而結束,而且在多實例的狀況下,每一個實例都須要各自保存一份緩存,緩存不具備一致性。

使用 redis 或 memcached之類的稱爲分佈式緩存,在多實例的狀況下,各實例共用一份緩存數據,緩存具備一致性。缺點是須要保持redis或memcached服務的高可用,整個程序架構上較爲複雜。

redis 和 memcached 的區別

  • 1.redis支持更豐富的數據類型(支持更復雜的應用場景):Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。memcache支持簡單的數據類型,String。
  • 2.Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用,而Memecache把數據所有存在內存之中
  • 3.集羣模式:memcached沒有原生的集羣模式,須要依靠客戶端來實現往集羣中分片寫入數據;可是 redis 目前是原生支持 cluster 模式的.
  • 4.Memcached是多線程,非阻塞IO複用的網絡模型;Redis使用單線程的非阻塞 IO多路複用模型。

Redis快的緣由

一、Redis是純內存操做,須要的時候須要咱們手動持久化到硬盤中。

二、Redis是單線程,從而避開了多線程中上下文頻繁切換的操做。(單線程也會有它的缺點,也是Redis的噩夢:阻塞。若是執行一個命令過長,那麼會形成其餘命令的阻塞,對於Redis是十分致命的)

三、Redis數據結構簡單、對數據的操做也比較簡單。

四、使用底層模型不一樣,它們之間底層實現方式以及與客戶端之間通訊的應用協議不同,Redis直接本身構建了VM機制,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求.

五、使用非阻塞I/O多路複用模型

Redis是用」單線程-多路複用IO模型」來實現高性能的內存數據服務的,這種機制避免了使用鎖,可是同時這種機制在進行sunion之類的比較耗時的命令時會使redis的併發降低。由於是單一線程,因此同一時刻只有一個操做在進行,因此,耗時的命令會致使併發的降低,不僅是讀併發,寫併發也會降低。而單一線程也只能用到一個CPU核心,因此能夠在同一個多核的服務器中,能夠啓動多個實例,組成master-master或者master-slave的形式,耗時的讀命令能夠徹底在slave進行。

爲何redis是單線程

官方FAQ表示,由於Redis是基於內存的操做,CPU不是Redis的瓶頸,Redis的瓶頸最有多是機器內存的大小或者網絡帶寬。既然單線程容易實現,並且CPU不會成爲瓶頸,那就瓜熟蒂落地採用單線程的方案了(畢竟採用多線程會有不少麻煩!)。

這裏咱們一直在強調的單線程,只是在處理咱們的網絡請求的時候只有一個線程來處理,一個正式的Redis Server運行的時候確定是不止一個線程的,這裏須要你們明確的注意一下!例如Redis進行持久化的時候會以子進程或者子線程的方式執行.

爲何redis把全部數據都放到內存中?

   redis爲了達到最快的讀寫速度,將數據都讀到內存中,並經過異步的方式將數據寫入磁盤。若是不將數據放在內存中,磁盤IO速度會嚴重影響redis的性能。

相關文章
相關標籤/搜索