memcached大名鼎鼎,數據庫有壓力時都會請此君來緩解緩解。因常遇到些問題,讀些文章,隨筆做些記錄。整理后,有此文。
memcached是什么?
web應用數據保存在RDBMS中(絕大多數是mysql).從數據庫讀取數據,隨著訪問量增大,出現數據庫負擔很重,反應很慢的問題。memcached就是解決此問題而生。他將數據緩存到內存中,提高讀寫數據的能力。
memcached有何特點?
兩點:第一,分布式;第二, 緩存。
如何理解分布式
memcached是分布式內存緩存服務器,但服務器端是不互相通信的。簡而言之,他的分布式取決于客戶端的實現。那么,如何解決如下問題,有三臺memcached服務器,如何將key=>value類型的數據存放到memcached中?
方法有兩種: 余數計算法和圓點計數法(官方名稱,一致性算法).
先看余數計算法.先將memcached服務器標號1,2,3.計算key的hash值。然后初以服務器數量3,得到的余數(如2),則將數據放到2上。
此法優點方法簡單,易于分散數據。但問題是,如果增加了一臺memcached服務器,key的hash值除以的余數就變了,勢必要重組整個緩存數據,代價不小。所以,看下圓點解決之道。
圓點法是基于Consistent Hashing的思想。簡單的說,先得出memcached服務器的哈希值,配置到一個0-2的32次方的圓上。然后同樣計算出key的哈希值,映射到相同的圓上。從映射的位置開始順時針查找,將數據保存到找到的第一個服務器上。這樣在增加新的memcached服務器的時候,可以最大限度的減少鍵的重組。
php中Consistent Hashing的實現
memcache客戶端的實現:
1 | 在php.ini中添加memcache.hash_strategy = consistent |
memcached客戶端的實現:
1 | $mc = new Memcached(); |
2 | $mc ->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT); |
3 | $mc ->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true); |
php客戶端memcached vs memcache
怎樣區別,也沒徹底明白。memcached是基于libmemcached庫,版本比memcache要新,支持更多的memcached協議,性能應該優于memcache.
memcached的安裝
1 | sudo apt-get install memcached |
2 | yum install libevent lievent-devel memcached |
自行編譯也可。
memcached的啟動
memcached -d -m 1024 -l localhost -p 11711
-p 使用的tcp端口
-m 最大內存使用。默認64M
-d 作為daemon在后臺啟動
memcached數據操作
1 | $mc = new memcached(); |
2 | $key = 'test' ; |
3 | $mc ->add( $key , 'okok' ); //增加數據 |
4 | $mc ->get( $key ); //獲取數據 |
5 | $mc ->replace( $key , 'iii' ); //替換數據 |
6 | $mc -> delete ( $key ); //刪除數據 |
7 | $mc ->increment( 'count' ,19); //原子操作 |
8 | ... |
memcached的刪除機制LRU
內存總有用完的時候,數據也有過期過滿的時候。如何刪除數據呢? memcached使用LRU(Least Recently Used).即最近最少使用的記錄被刪除。所以,當分配的內存不足時候,memcached會將最近不被使用的記錄空間分配給新的記錄。-M參數可以禁掉此功能。當然,不建議使用。
新聞熱點
疑難解答