1、memcached是什么
memcached 是以 LiveJournal 旗下 Danga?Interactive 公司的 Brad?Fitzpatric 為首開發的一款軟件,是一款高性能key/value數據緩存
2、memcached程序的應用場景
場景一:數據庫前端緩存

說明:
* 數據庫常常是網站系統的瓶頸,數據庫訪問量大,常常會造成網站訪問不了
* 由于每次執行查詢(SQL)語句,都要進行一系列復雜的I/O操作,影響系統性能
* 假如每次都取得相同的數據,每次讓數據庫執行復雜的SQL語句,數據庫如果會說話,肯定會發牢騷,你都問了這么多遍了,難道還記不住嗎?
由于memcached是基于分布式的緩存系統,可獨立于網站應用本身。我們可以把SQL語句當成key,執行SQL語句獲取到的值當作Value值。當第二次發起SQL語句,應用程序會先查詢memcached,如果沒有,應用程序在查詢數據庫,然后存儲到memcached中
場景二:服務器間數據(session)共享
當后端有多臺應用程序(APP)服務器的時候,由于memcached是分布式內存對象緩存系統,不管是哪臺服務器產生的session都可以存儲在memcached中,其他服務器也可以讀取到
案例:基于php使用memcache存儲session
* 在php.ini中全局設置
session.save_handler = memcache
session.save_path = "tcp://192.168.20.136:11211"
* 在程序文件中添加(index.php)
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");
如果采用php-memcached的擴展引擎,則需要如下配置
ini_set("session.save_handler", "memcached"); // 是memcached不是memcache
ini_set("session.save_path", "127.0.0.1:11211"); // 不要tcp:
3、memcached的特點
* 協議簡單
memcached 的服務器客戶端通信并不使用復雜的 XML 等格式,而使用簡單的基于文本行的協議。因此,通過 telnet 也能在 memcached 上保存數據、取得數據。下面是例子。
$?telnet?localhost?11211
Trying?127.0.0.1...
Connected?to?localhost.localdomain?(127.0.0.1).
Escape?character?is?'^]'.
set?foo?0?0?3?????(保存命令)
bar???????????????(數據)
STORED????????????(結果)
get?foo???????????(取得命令)
VALUE?foo?0?3?????(數據)
bar???????????????(數據)
* 基于libevent的事件處理
libevent 是個程序庫,它將 Linux 的 epoll、BSD 類操作系統的 kqueue 等事件處理功能封裝成統一的接口。即使對服務器的連接數增加,也能發揮 O(1)的性能
* 內置內存存儲方式
為了提高性能,memcached中保存的數據都存儲在memcached內置的內存存儲空間中,由于數據僅存在內存中,因此當重啟memcached或重啟操作系統后,會導致全部緩存數據消失,另外,會基于LRU算法自動刪除不適用的緩存。因此memcached不適用存儲需要持久化的數據
* memcached不互相通信的分布式
memcached 盡管是“分布式”緩存服務器,但服務器端并沒有分布式功能。各個 memcached 不會互相通信以共享信息。那么,怎樣進行分布式呢?這完全取決于客戶端的實現。
* memcached 支持許多平臺
4、memcached的常用命令
~~~
[admin@node7 ~]$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set mykey 0 60 5 (set命令,設定一個key,緩存時間60秒)
louis
STORED
get mykey (get命令獲取)
VALUE mykey 0 5
louis
END
add testkey 0 60 5 (add命令追加一個key)
alexs
STORED
replace testkey 0 60 5 (replace修改key的值)
louis
STORED
get testkey
VALUE testkey 0 5
louis
END
append testkey 0 60 10 (append命令追加key的值)
louisalexs
STORED
get testkey
VALUE testkey 0 15
louislouisalexs
END
delete testkey (delete刪除key)
DELETED
stats (stats命令查看狀態)
STAT pid 27619
STAT uptime 76269
STAT time 1519362991
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 3.322436
STAT rusage_system 1.245913
STAT curr_connections 10
STAT total_connections 11
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 5
STAT cmd_set 6
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 3
STAT get_misses 2
STAT delete_misses 2
STAT delete_hits 1
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 315
STAT bytes_written 198
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 6
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 1
END
~~~
~~~
通過nc操作管理memcached服務
[root@node7 ~]# printf "get key003\r\n"|nc localhost 11211
VALUE key003 0 10
oldboy0982
END
[root@node7 ~]# printf "set mykey01 0 60 10\r\noldboy0982\r\n"|nc localhost 11211
STORED
[root@node7 ~]# printf "get mykey01\r\n"|nc localhost 11211
VALUE mykey01 0 10
oldboy0982
END
~~~