1. 程式人生 > >memcached 快取命中率

memcached 快取命中率

快取命中率的介紹

命中:可以直接通過快取獲取到需要的資料。

不命中:無法直接通過快取獲取到想要的資料,需要再次查詢資料庫或者執行其它的操作。原因可能是由於快取中根本不存在,或者快取已經過期。

通常來講,快取的命中率越高則表示使用快取的收益越高,應用的效能越好(響應時間越短、吞吐量越高),抗併發的能力越強。

由此可見,在高併發的網際網路系統中,快取的命中率是至關重要的指標。

如何監控快取的命中率

在memcached中,執行state命令可以檢視memcached服務的狀態資訊,其中cmd_get表示總的get次數,get_hits表示get的總命中次數,命中率 = get_hits/cmd_get。

當然,我們也可以通過一些開源的第三方工具對整個memcached叢集進行監控,顯示會更直觀。比較典型的包括:zabbix、MemAdmin等。

如圖:MemAdmin對memcached服務的命中率情況的監控統計

 

同理,在Redis中可以執行info命令檢視redis服務的狀態資訊,其中keyspace_hits為總的命中中次數,keyspace_misses為總的miss次數,命中率=keyspace_hits/(keyspace_hits+keyspace_misses)。

開源工具Redis-star能以圖表方式直觀redis服務相關資訊,同時,zabbix也提供了相關的外掛對redis服務進行監控。

影響快取命中率的幾個因素

之前的章節中我們提到了快取命中率的重要性,下面分析下影響快取命中率的幾個因素。

  1. 業務場景和業務需求

快取適合“讀多寫少”的業務場景,反之,使用快取的意義其實並不大,命中率會很低。

業務需求決定了對時效性的要求,直接影響到快取的過期時間和更新策略。時效性要求越低,就越適合快取。在相同key和相同請求數的情況下,快取時間越長,命中率會越高。

網際網路應用的大多數業務場景下都是很適合使用快取的。

  1. 快取的設計(粒度和策略)

通常情況下,快取的粒度越小,命中率會越高。舉個實際的例子說明:

當快取單個物件的時候(例如:單個使用者資訊),只有當該物件對應的資料發生變化時,我們才需要更新快取或者讓移除快取。而當快取一個集合的時候(例如:所有使用者資料),其中任何一個物件對應的資料發生變化時,都需要更新或移除快取。

還有另一種情況,假設其他地方也需要獲取該物件對應的資料時(比如其他地方也需要獲取單個使用者資訊),如果快取的是單個物件,則可以直接命中快取,反之,則無法直接命中。這樣更加靈活,快取命中率會更高。

此外,快取的更新/過期策略也直接影響到快取的命中率。當資料發生變化時,直接更新快取的值會比移除快取(或者讓快取過期)的命中率更高,當然,系統複雜度也會更高。

  1. 快取容量和基礎設施

快取的容量有限,則容易引起快取失效和被淘汰(目前多數的快取框架或中介軟體都採用了LRU演算法)。同時,快取的技術選型也是至關重要的,比如採用應用內建的本地快取就比較容易出現單機瓶頸,而採用分散式快取則畢竟容易擴充套件。所以需要做好系統容量規劃,並考慮是否可擴充套件。此外,不同的快取框架或中介軟體,其效率和穩定性也是存在差異的。

  1. 其他因素

當快取節點發生故障時,需要避免快取失效並最大程度降低影響,這種特殊情況也是架構師需要考慮的。業內比較典型的做法就是通過一致性Hash演算法,或者通過節點冗餘的方式。

有些朋友可能會有這樣的理解誤區:既然業務需求對資料時效性要求很高,而快取時間又會影響到快取命中率,那麼系統就別使用快取了。其實這忽略了一個重要因素--併發。通常來講,在相同快取時間和key的情況下,併發越高,快取的收益會越高,即便快取時間很短。

提高快取命中率的方法

從架構師的角度,需要應用盡可能的通過快取直接獲取資料,並避免快取失效。這也是比較考驗架構師能力的,需要在業務需求,快取粒度,快取策略,技術選型等各個方面去通盤考慮並做權衡。儘可能的聚焦在高頻訪問且時效性要求不高的熱點業務上,通過快取預載入(預熱)、增加儲存容量、調整快取粒度、更新快取等手段來提高命中率。

對於時效性很高(或快取空間有限),內容跨度很大(或訪問很隨機),並且訪問量不高的應用來說快取命中率可能長期很低,可能預熱後的快取還沒來得被訪問就已經過期了。

相關推薦

memcached 快取命中率

快取命中率的介紹 命中:可以直接通過快取獲取到需要的資料。 不命中:無法直接通過快取獲取到想要的資料,需要再次查詢資料庫或者執行其它的操作。原因可能是由於快取中根本不存在,或者快取已經過期。 通常來講,快取的命中率越高則表示使用快取的收益越高,應用的效能越好(響應時

輕量級 memcached快取代理 twemproxy實踐

本文內容腦圖如下: 文章共 533字,閱讀大約需要 2分鐘 ! 概 述 twemproxy(nutcracker) 是 Twitter開源的輕量級 memcached / redis 代理伺服器,本質就是一個叢集管理工具,主要用來彌補 Redis和 Memcac

手動清除memcached快取

軟體版本 memcached-1.4.5 memcache-3.0.5 php-5.2.11   1、查 memcache 狀態 /usr/bin/perl /usr/local/src/memcached-1.4.5/scripts/memcached-tool lo

memcached快取yum安裝

memcached快取應用yum安裝LAMP 系統環境: 192.168.80.100 memcached-1.5.9.tar.gz libevent-2.1.8-stable.tar.gz 192.168.80.101 yum安裝LAMP memcache-2.2.7.tgz 關閉

關於快取命中率的幾個關鍵問題!

一、快取命中率的介紹 命中:可以直接通過快取獲取到需要的資料。 不命中:無法直接通過快取獲取到想要的資料,需要再次查詢資料庫或者執行其它的操作。原因可能是由於快取中根本不存在,或者快取已經過期。 通常來講,快取的命中率越高則表示使用快取的收益越高,應用的效能越好(響應時

MemCached快取操作

  Web專案在執行時,通常需要從資料庫中進行讀寫。隨著操作資料量的增大,以及訪問量的集中,資料庫的負載增加,資料庫響應變慢,網站訪問速度變慢的情況。Memcached就是用來解決這些問題的。   Memcached是一個開源的高效能的分散式快取系統。主要用於減輕資料庫負載,加速Web應用訪

memcached快取伺服器一致性雜湊分佈部署類

class FlexHash{ private $server_list = array(); private $is_sort = false; public function add_server($server) { $hash = mhas

Oracle資料庫的快取命中率

資料庫快取(Block Buffer)對於Oracle資料庫的運轉和效能起著非常關鍵的作用,它佔據Oracle資料庫SGA(系統共享記憶體區)的主要部分。 Oracle資料庫通過使用LRU演算法,將最近訪問的資料塊存放到快取中,從而使對磁碟資料的訪問效率最大優化到接近於記憶體訪問的速度。 由於資

在php中操作memcached快取進行增刪改查資料

<?php //建立一個memcache物件例項 $memcache = new Memcache; if(!$memcache->connect("127.0.0.1",11211)){ die('連線失敗'); } if($memcache

淺談CPU三級快取快取命中率

CPU: CPU快取(Cache Memory)是位於CPU與記憶體之間的臨時儲存器,它的容量比記憶體小的多但是交換速度卻比記憶體要快得多。快取的出現主要是 為瞭解決CPU運算速度與記憶體讀寫速度不匹配的矛盾,因為CPU運算速度要比記憶體讀寫速度快很多,這樣會使CP

memcached 快取引數的詳解

http://bbs.csdn.net/topics/390379625 protected static MemCachedClient mcc = new MemCachedClient();     protected static MemCached memCached = new MemCa

應對Memcached快取失效,導致高併發查詢DB的幾種思路

最近看到nginx的合併回源,這個和下面的思路有點像。不過nginx的思路還是在控制快取失效時的併發請求,而不是當快取快要失效時,及時地更新快取。 nginx合併回源,參考:http://blog.csdn.net/brainkick/article/details/857

Nginx的session一致性問題——memcached快取session共享

HTTP協議是無狀態的,即你連續訪問某個網頁100次和訪問1次對伺服器來說是沒有區別對待的,因為它記不住你。那麼,在一些場合,確實需要伺服器記住當前使用者怎麼辦?比如使用者登入郵箱後,接下來要收郵件、寫郵件,總不能每次操作都讓使用者輸入使用者名稱和密碼吧,為了解決這個問題,

在Java中使用Memcached快取技術-win7-64位下

在Java中使用Memcached快取技術。至於Memcached是什麼,原理等可以自行百度。這裡只給出在win7 64位怎麼安裝Memcached的服務和在Java 中使用Memcached的例子。 參考文件連結:原作者 需要安裝的軟體和jar包下載連結如下: 1

在Django中使用memcached快取

安裝步驟: 下載安裝包:wget http://memcached.org/latest 進入安裝包所在的目錄,然後解壓:tar -zxvf memcached-1.x.x.tar.gz 進入安裝包:cd memcached-1.x.x 輸入命令:./configure &

Mysql快取命中率

歡迎關注本人公眾號 MySQL快取命中率,網上說法不一,下面我說下我的看法,大家輕拍: 總的select查詢數等於com_select(沒命中) + qcache_hits(命中) + 解析錯誤的查詢。 再來看看Com_select變數: [sql] vi

memcached快取失效時的高併發訪問問題解決

memcached一般用於在訪問一些效能相對低下的資料介面時(如資料庫),為了保證這些資料介面的穩定性,加上memcached以減少訪問次數,保證這些資料介面的健壯性。一般memcached的資料都是定時失效的,當資料失效時一般會再次去訪問取資料介面,然後將其更新至m

mysql狀態檢視 QPS/TPS/快取命中率檢視

最近在看mysql,看到QPS,就想知道怎麼檢視的,看了下面這篇文章,覺得正是我需要的,留下來備用。 執行中的mysql狀態檢視 對正在執行的mysql進行監控,其中一個方式就是檢視mysql執行狀態。  (1)QPS(每秒Query量)  QPS =

nginx快取命中率統計(proxy_cache)

一.對nginx快取命中率的統計的配置: nginx 提供了變數$upstream-cache-status 來顯示快取的命中狀態,我們可以再nginx.conf配置中新增一個http響應頭來顯示這一狀態,可以達到類似squid的效果,如下: location  ~*

淺談分散式鎖--基於快取(Redis,memcached,tair)實現篇

淺談分散式鎖--基於快取(Redis,memcached,tair)實現篇: 一、Redis分散式鎖 1、Redis實現分散式鎖的原理:     1.利用setnx命令,即只有在某個key不存在情況才能set成功該key,這樣就達到了多個程序併發去set