1、memcached是什么
memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件,是一款高性能key/value数据缓存
2、memcached程序的应用场景
场景一:数据库前端缓存
![](https://box.kancloud.cn/9b8ceb3ce6988e9b74215ec182352999_549x414.png)
说明:
* 数据库常常是网站系统的瓶颈,数据库访问量大,常常会造成网站访问不了
* 由于每次执行查询(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
~~~