🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
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 ~~~