選擇Redis作為分布式快取

2021-07-04 02:35:21 字數 2189 閱讀 7728

高校平台專案中分布式快取使用的是

redis,

在以前也曾經使用過

memcached

,但使用

memcached

和mysql

配合遇到過一些問題。

當然實際中

mysql

是適合海量資料儲存的,然後通過

memcached

將一些常用的資料進行快取,加快訪問速度。似乎是比較完美的,但是隨著資料,訪問量等不斷的增長。會出現一些問題。

首先當資料量不斷的增大的時候,資料庫的訪問會出現瓶頸,這時候不可避免的就會進行切表,拆表的,

memcached

也需要不斷的跟著擴容.這樣擴容和維護工作佔據大量的開發時間.這時候還導致了乙個問題就是

memcached

和mysql

的資料一致性的問題,

memcached

資料命中率低或者

down

機,大量的訪問就會穿透到資料庫,這時候

mysql

可能會無法支撐。

這時候如何選擇乙個

nosql

資料庫作為分布式快取使用變得非常重要。梳理一下

nosql

資料庫的作用會對如何選擇非常重要。總體上這些nosql主要用於解決以下幾種問題。

1,少量資料儲存,高速讀寫訪問。此類產品通過資料全部in-mem

ory的方式來保證高速訪問,同時提供資料落地的功能,實際這正是redis最主要的適用場景。

2,海量資料儲存,分布式系統支援,資料一致性保證,方便的集群節點新增/刪除。

面對這些不同型別的nosql產品,我們需要根據我們的業務場景選擇最合適的產品。

redis適用場景,如何正確的使用

前面剛說過

redis

最適合所有資料

in-mem

ory的場景,雖然redis也提供持久化功能,但實際更多的是乙個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎redis更像乙個加強版的memcached,那麼何時使用memcached,何時使用redis呢?

redis與memcached的比較 1

,memcached是多執行緒,非阻塞io復用的網路模型,分為監聽主線程和worker子執行緒,監聽執行緒監聽網路連線,接受請求後,將連線描述字pipe傳遞給worker執行緒,進行讀寫io, 網路層使用libevent封裝的事件庫,多執行緒模型可以發揮多核作用,但是引入了cachecoherency和鎖的問題,比如,memcached最常用的stats命令,實際memcached所有操作都要對這個全域性變數加鎖,進行計數等工作,帶來了效能損耗。redis使用單執行緒的io復用模型,自己封裝了乙個簡單的aeevent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有io操作來說,單執行緒可以將速度優勢發揮到最大,但是redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單執行緒模型實際會嚴重影響整體吞吐量,cpu計算過程中,整個io排程都是被阻塞住的。 2

,memcached使用預分配的記憶體池的方式,使用slab和大小不同的chunk來管理記憶體,item根據大小選擇合適的chunk儲存,記憶體池的方式可以省去申請/釋放記憶體的開銷,並且能減小記憶體碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在記憶體仍然有很大空間時,新的資料也可能會被剔除。redis使用現場申請記憶體的方式來儲存資料,並且很少使用free-list等方式來優化記憶體分配,會在一定程度上存在記憶體碎片,redis跟據儲存命令引數,會把帶過期時間的資料單獨存放在一起,並把它們稱為臨時資料,非臨時資料是永遠不會被剔除的,即便物理記憶體不夠,導致swap也不會剔除任何非臨時資料(但會嘗試剔除部分臨時資料),這點上redis更適合作為儲存而不是cache。 3

,memcached提供了cas命令,可以保證多個併發訪問操作同乙份資料的一致性問題。 redis沒有提供cas命令,並不能保證這點,不過redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。 4

根據以上比較不難看出,當我們不希望資料被踢出,或者需要除key/value之外的更多資料型別時,或者需要落地功能時,使用redis比使用memcached更合適。

總結:redis使用最佳方式是全部資料in-memory。

redis更多場景是作為memcached的替代者來使用。

當需要除key/value之外的更多資料型別支援時,使用redis更合適。

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

Redis 分布式快取

1 官網 3 菜鳥教程 4 redis的集群教程 5 史上最全redis高可用技術解決方案大全 一 redis的特點?redis 本質上是乙個 key value 型別的記憶體資料庫,很像 memcached,整個 資料庫統統載入在記憶體當中進行操作,定期通過非同步操作把資料庫資料 flush 到硬...

Redis作為分布式鎖

當在分布式模型下,資料只有乙份 或有限制 此時需要利用鎖的技術控制某一時刻修改資料的程序數。資料庫樂觀鎖 基於redis的分布式鎖 基於zookeeper的分布式鎖。一 加鎖 主要需要是否存在鎖,超時鎖釋放,不能被其他執行緒釋放鎖 所以進本命令可以使用 set key id ex 30 nx 原子操...

Redis分布式快取簡介

一 什麼是redis redis是乙個開源的,基於記憶體儲存的資料伺服器。可以用來充當資料庫,快取記憶體和訊息佇列 redis支援很多的資料結構,包括字串 雜湊表 列表 集合 有序集合,位圖 hyperloglogs等。redis突出的乙個特性是效能容量高。儲存在redis中的資料是持久化的,斷電或...