回覆列表
  • 1 # JAVA前線

    1 儲存位置比較Guava是本地記憶體,Redis和Memcached是分散式快取需要遠端訪問。從提升效能角度,我們要把資料放到離使用者更近的地方,所以優先考慮Guava使用。2 儲存空間比較本地記憶體雖然離使用者更近,訪問速度也更快,但是儲存空間有限,儲存空間上限就是單臺伺服器記憶體上限,還要考慮其它功能使用記憶體情況和系統本身記憶體開銷。所以當需要快取的資料太多時,考慮分散式快取,因為分散式快取可以橫向擴充套件例,增加儲存空間。3 持久化特性比較我們一般使用本地記憶體時僅僅用來提升效能,不儲存持久化資料。Redis提供持久化儲存功能,Memcached不提供持久化功能。4 儲存資料型別比較Redis提供非常豐富儲存型別,提供String,List,Set,Hash等資料型別,Memcached儲存只能儲存比較簡單資料型別。5 其它特性比較Memcached快取物件大小不要大於1M,而且key長度不要大於250字元,如果大於250個字元那麼先進行MD5(key)再儲存。敬請關注

    請點選關注按鈕【IT徐胖子】會持續為大家奉獻網際網路和技術乾貨內容,感謝支援

  • 2 # java架構筆記

    關於快取的分類

    堆快取:JAVA堆記憶體快取,不需要序列化/反序列化,是最快的快取。但是,如果快取資料較大時,GC時間會變長,並且儲存容量受限於堆大小。一般用來儲存較熱資料。

    堆外快取:堆外記憶體快取,可以降低GC的影響。對比堆快取,不會被堆大小限制,只受機器物理記憶體大小限制。但是,讀寫資料時,需要序列化/反序列化。所以,相較堆快取,效能較差。

    分散式快取:即將資料儲存在遠端服務中,解決快取資料的單機容量、一致性問題。

    Guava、Memcached、Redis

    Guava是屬於堆內/堆外快取,本質上是屬於本地快取。一般用來儲存較熱、可以高延遲的問題快取。

    Redis與Memcache快取介紹與對比

    1. 資料結構

    Redis支援多種資料結構,並且查詢效能極高,可以達到log2^N的查詢速度。

    Memcache只支援key/value儲存,不支援其他資料結構。

    2. 執行緒模型

    Redis使用單執行緒,Memcache使用多執行緒。所以Redis只支援單執行緒請求,一個Redis程序只使用單核,所有命令序列執行,併發情況下不需要考慮資料一致性。但是可以透過多個Redis程序使用多核。而Memcache可以充分發揮多核優勢,單例項吞吐量極高,可以達到幾十萬QPS。

    3. 持久化

    Redis提供了二種持久化方式:

    RDB持久化方式能夠在指定的時間間隔能對你的資料進行快照儲存。AOF持久化方式記錄每次對伺服器寫的操作,當伺服器重啟的時候會重新執行這些命令來恢復原始的資料,AOF命令以redis協議追加儲存每次寫的操作到檔案末尾.Redis還能對AOF檔案進行後臺重寫,使得AOF檔案的體積不至於過大。

    Memcache並不提供持久化機制,快取的資料都是臨時的。但是可以透過第三方來提供持久化。

    4. 高可用

    Redis支援主從節點複製,還支援Sentinel、Cluster等高可用叢集方案。

    Memcache不支援高可用模型,但是可使用第三方,如megagent代理。當一個例項宕機時,可以連線另外一個例項。

    5. 對佇列的支援

    Redis本身支援lpush/rpop/brpop、lpushrprop(安全佇列)、publish/subscribe/psubscribe等佇列與釋出訂閱模式。

    Memcache不支援佇列,但是可以透過如MemcacheQ來實現。

    6. 資料淘汰機制

    Redis資料淘汰策略:

    noeviction:返回錯誤當記憶體限制達到並且客戶端嘗試執行會讓更多記憶體被使用的命令(大部分的寫入指令,但DEL和幾個例外)allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新新增的資料有空間存放。volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限於在過期集合的鍵,使得新新增的資料有空間存放。allkeys-random: 回收隨機的鍵使得新新增的資料有空間存放。volatile-random: 回收隨機的鍵使得新新增的資料有空間存放,但僅限於在過期集合的鍵。volatile-ttl: 回收在過期集合的鍵,並且優先回收存活時間(TTL)較短的鍵,使得新新增的資料有空間存放。volatile-lfu:從所有配置了過期時間的鍵中驅逐使用頻率最少的鍵allkeys-lfu:從所有鍵中驅逐使用頻率最少的鍵

    如果沒有鍵滿足回收的前提條件的話,策略volatile-lru, volatile-random以及volatile-ttl就和noeviction 差不多了。

    7. 記憶體分配

    Redis的記憶體管理主要透過原始碼中zmalloc.h和zmalloc.c兩個檔案來實現的。Redis為了方便記憶體的管理,在分配一塊記憶體之 後,會將這塊記憶體的大小存入記憶體塊的頭部。如圖 5所示,real_ptr是redis呼叫malloc後返回的指標。redis將記憶體塊的大小size存入頭部,size所佔據的記憶體大小是已知的,為 size_t型別的長度,然後返回ret_ptr。當需要釋放記憶體的時候,ret_ptr被傳給記憶體管理程式。透過ret_ptr,程式可以很容易的算出 real_ptr的值,然後將real_ptr傳給free釋放記憶體。

    Redis透過定義一個數組來記錄所有的記憶體分配情況,這個陣列的長度為ZMALLOC_MAX_ALLOC_STAT。陣列的每一個元素代表當前 程式所分配的記憶體塊的個數,且記憶體塊的大小為該元素的下標。在原始碼中,這個陣列為zmalloc_allocations。 zmalloc_allocations[16]代表已經分配的長度為16bytes的記憶體塊的個數。zmalloc.c中有一個靜態變數 used_memory用來記錄當前分配的記憶體總大小。所以,總的來看,Redis採用的是包裝的mallc/free,相較於Memcached的記憶體 管理方法來說,要簡單很多。

    Memcache採用slab table的方式分配記憶體,首先將可得記憶體按照不同大小分類,在使用時根據需求查詢接近於需求大小的塊分配的機制減少記憶體碎片,但是這依賴於合理的配置。

    綜上:

    Redis和Memcache本質上都是基於k/v實現的快取,但是Memcache正如其名,依賴於記憶體,不支援資料的持久化,伺服器關閉後資料丟失。而Redis在很多方面具備資料庫的特徵,或者說就是一個數據庫系統,可以透過RDB快照或者AOF日誌將資料持久化到磁碟,支援master-slave機制的資料備份;

    在儲存小於100k的資料,Redis具有效能上的優勢,而資料量大於100k,Memcache效能更好;

    Redis只支援單執行緒請求,一個Redis程序只使用單核,所有命令序列執行,併發情況下不需要考慮資料一致性。但是可以透過多個Redis程序使用多核。而Memcache可以充分發揮多核優勢,單例項吞吐量極高,可以達到幾十萬QPS;

    在記憶體利用率上Memcache更高,但如果Redis使用hash結構做k/v儲存,由於其組合式的壓縮,記憶體利用率會高於Memcache;

    支援資料型別上,Memcache只支援k/v型別的資料,而Redis還支援list,set,zset,hash等資料結構,並且Redis支援伺服器端的資料操作,而Memcache需要將資料拿到客戶端進行修改再set回去,大大增加了網路IO和資料的體積,如果需要快取能進行更復雜的資料結構和操作,那麼Redis更適合

    所以,在超高併發的模組中,使用多級快取來提高訪問速度。

    越靠近使用者的快取能提升越快的訪問速度。

  • 3 # 會點程式碼的大叔

    簡單來說,Redis 就是一個數據庫。

    不同於傳統資料庫將資料儲存在磁碟中,Redis 將資料存在記憶體中,所以它也經常被叫做記憶體資料庫;同時 Redis 儲存也被叫做 NoSQL 資料庫、非關係型資料庫。

    因為 Redis 將資料儲存在記憶體中,所以讀寫速度會非常快,因此 Redis 被廣泛應用做快取或其他需要高速讀寫的場景。

    為什麼要使用 Redis

    軟體架構中引入 Redis ,是因為它“又快又強”。

    1. 快,是指效能高

    計算機硬體的速度由低到高:硬碟-網路-記憶體-CPU;

    在傳統的資料庫中,如果第一次訪問資料庫中的某條資料,通常是比較慢的,因為資料庫需要從硬碟上讀取資料;而 Redis 中的資料儲存在了記憶體中,所以速度會比從磁碟中讀取資料快得多。

    所以我們經常把 Redis 當做快取:第一次從資料庫中讀取資料,並放入 Redis ,後面直接訪問 Redis 就可以了。

    2. 強,是指高併發場景下的穩定性(高可用)

    在高併發的場景下,Redis 能夠承受的訪問極限,是遠遠大於資料庫的,所以我們可以考慮把需要高併發讀的資料放到 Redis 中;

    比如秒殺功能,短短几秒內可能就會有數十萬筆的訪問,如果直接操作資料庫的話,資料庫可能瞬間就被擊垮了。

    哪些場景不適合放入 Redis

    當然,也不是說所有的場景、所有的資料都適合放進 Redis 中,通常我們需要考慮以下幾點:

    資料查詢的命中率高麼?如果快取的命中率很低,沒有必要放入到 Redis 中;資料讀寫操作多麼?如果資料會被頻繁寫入(增、改、刪),設定寫操作次數大於讀操作次數,那麼也沒有必要使用 Redis ;業務資料大小如何?如果要儲存檔案,那完全沒有必要放入到 Redis 中。本地快取 or Redis

    快取分為本地快取和分散式快取:

    1. 本地快取

    比如 Guava、Ehcache,甚至把快取儲存到 Map 中,這些都是本地快取;

    本地快取的特點是輕量、實現簡單,生命週期隨著 JVM 的銷燬而結束;但是如果程式存在多個例項(程式部署多套),每個例項中的快取不具有一致性。

    2. 分散式快取

    Redis 被稱作分散式快取,如果程式存在多個例項,各個例項可以共用 Redis 中的快取資料,但同時因為引入了 Redis ,那麼需要保證 Redis 的高可用,架構上更為複雜。

    Redis or Memcached

    Memcached 也經常被用作快取,也是分散式快取的一種,那麼它和 Redis 有什麼區別呢?

    Redis 支援更豐富的資料型別,Memcache 支援簡單的資料型別String;

    Redis 支援資料的持久化,可以將記憶體中的資料儲存到硬碟中,重啟之後把資料載入到記憶體中,而 Memcache 只是把資料儲存在記憶體中 ;

    Redis 目前支援叢集模式,而 Memcached 沒有原生的叢集模式,需要使用方自己實現;

    Redis 使用單執行緒的多路 IO 複用模型(Redis 在最新的 6.0 版本中開始支援多執行緒);Memcached 使用的是多非阻塞IO複用的網路模型。

    最後再強調一點,是否要引入 Redis?使用本地快取還是分散式快取?都需從專案的實際情況出發;Redis 豐富的資料型別和對持久化的支援,會更加適合我們的專案。

  • 4 # 生活咖啡

    當資料量達到一定程度的時候,使用快取來提高訪問速度是自然而然的事情,雖然大多數資料庫本身也會有查詢快取,但那個跟我們常使用的memcached和redis是有區別的。資料庫的查詢快取是對同一條查詢語句產生的快取,就是如果同一條查詢語句的話,資料庫將不會再去執行查詢,而是直接從其快取中讀取。而redis與memcached中的快取其實是這之上的一層,還沒有到與資料庫打交道的地方。

    其中memcached與redis都採用的是key-value的儲存方式,但是redis中value的型別要比memcached中要豐富得多,其不僅僅支援string,還支援Hash、List、Set、SortSet,並且其支援的大小容量最大為1G,遠遠大於memcached中的1M。

    memchched是多執行緒、非阻塞IO複用的網路模型

    其分為監聽主執行緒和worker子執行緒。多執行緒模型可以發揮作用,能夠充分利用系統的多核。

    Redis採用的是單執行緒,非阻塞IO複用的網路模型

    單純只有IO操作,單執行緒可以將速度發揮到最大。Redis也提供了一些簡單的計算,比如排序、聚合等,對於這些操作,單線模型會嚴重影響整體吞吐量,在CPU計算過程中,整個IO排程都是被阻塞住的。

    在記憶體管理方面:

    memcached使用預分配的記憶體池的方式

    redis使用現場申請記憶體的方式來儲存資料

    對比而言,memcached比redis產生的記憶體碎片要少,並且其採用預分配的方式,省去了申請記憶體和釋放記憶體的開銷,但其會有一定程度的空間浪費。並且其與redis有一點不同的是,當記憶體用完時,memcached會剔除掉一些資料,而redis不會,redis會將那些很久沒用到的資料持久化到硬碟上。redis同時還提供了持久化和複製的功能

    資料一致性問題

    memcached使用了cas,保證併發訪問同一份資料的問題

    redis使用事務功能,保證命令的原子性

    若在memcached中使用cas命令,需要從memcached服務商透過gets命令獲取令牌(TOKEN),意思就是同一時間只有一個命令能夠獲取到TOKEN,進而修改資料。

    總結:

    當儲存的資料不能夠被剔除時,使用redis更為合適

    當要使用的資料型別不僅僅是key-value時,也是使用redis更為合適

    其餘情況更適合使用memcached

  • 中秋節和大豐收的關聯?
  • Python如此流行的原因有哪些?