第三十四课 memrcached

21.1 nosql介绍

NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面。

NoSQL概念

随着web2.0的快速发展,非关系型、分布式数据存储得到了快速的发展,它们不保证关系数据的ACID特性。NoSQL概念在2009年被提了出来。NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一词最早于1998年被用于一个轻量级的关系数据库的名字。) NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。在NoSQL概念提出之前,这些数据库就被用于各种系统当中,但是却很少用于web互联网应用。比如cdb、qdbm、bdb数据库。

传统关系数据库的瓶颈

传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简单,功能强大,同时也积累了大量的成功案例。在互联网领域,MySQL成为了绝对靠前的王者,毫不夸张的说,MySQL为互联网的发展做出了卓越的贡献。 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。 到了最近10年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领web领域的潮流。在初期,论坛的流量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程序,可以想象一般的论坛的流量有多大。

Memcached+MySQL

后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品。 Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端。当时,如果你去面试,你说你有Memcached经验,肯定会加分的。

Mysql主从读写分离

由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。

分表分库

随着web2.0的继续高速发展,在Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但是由于在互联网几乎没有成功案例,性能也不能满足互联网的要求,只是在高可靠性上提供了非常大的保证。

Mysql的扩展性瓶颈

在互联网,大部分的MySQL都应该是IO密集型的,事实上,如果你的MySQL是个CPU密集型的话,那么很可能你的MySQL设计得有性能问题,需要优化了。大数据量高并发环境下的MySQL应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的。虽然有像淘宝这样技术实力强大的公司开发了透明的中间件层来屏蔽开发者的复杂性,但是避免不了整个架构的复杂性。分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式。 MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。 关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。

NOSQL的优势

1、易扩展 NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。 2、大数据量,高性能 NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。 3、灵活的数据模型 NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。 4、高可用 NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。

总结

NoSQL数据库的出现,弥补了关系数据(比如MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。 MySQL和NoSQL都有各自的特点和使用的应用场景,两者的紧密结合将会给web2.0的数据库发展带来新的思路。让关系数据库关注在关系上,NoSQL关注在存储上。

21.2 memrcached介绍

Memcached是国外社区网站LiveJournal团队开发,目的是为了通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能。

特点:

不支持落地。 一旦重启服务,将会丢失; 如果数据重要,可以把数据保存到磁盘,重启以后再导入到memcached里。 数据结构简单(k-v),数据存放在内存里

• 多线程

• 基于c/s架构,协议简单

• 基于libevent的事件处理

• 自主内存存储处理(slab allowcation)

• 数据过期方式:Lazy Expiration 和 LRU

Memcached的数据流向

Slab allocation

Slabs 包含了多个page

pages 包含了多个chunks

chunks 属于最小的单元

Slab Allocation的原理

• 将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。

• Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过 -I 参数来指定。

• Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。

Growth factor(增长因子)

• Memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制chunk大小的差异。默认值为1.25。

通过

memcached-tool

命令查看指定Memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25

命令:

# memcached-tool 127.0.0.1:11211 display

Memcached的数据过期方式

•Lazy Expiration (懒惰的方式)

Memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,Memcached不会在过期监视上耗费CPU时间。

• LRU

Memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当内存空间不足时(无法从slab class获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

21.3 安装memcached

基于libevent,如果没有安装会在yum的时候一同安装

yum install -y memcached libmemcached libevent
systemctl start memcached
vim /etc/sysconfig/memcached 可以配置参数

比如加上监听的ip,可以把OPTIONS="" 改为OPTIONS="127.0.0.1"
其中-m指定memcached分配内存

-c指定最大并发数 -u指定运行memcached服务的用户 -l 监听IP

21.4 查看memcachedq状态

memcached自带的查看状态的工具

memcached-tool 127.0.0.1:11211  stats
[root@aminglinux-02 ~]# memcached-tool 127.0.0.1:11211  stats
#127.0.0.1:11211   Field       Value
         accepting_conns           1
               auth_cmds           0
             auth_errors           0
                   bytes           0
              bytes_read           7
           bytes_written           0
              cas_badval           0
                cas_hits           0
              cas_misses           0
               cmd_flush           0
                 cmd_get           0
                 cmd_set           0
               cmd_touch           0
             conn_yields           0
   connection_structures          11
        curr_connections          10
              curr_items           0
               decr_hits           0
             decr_misses           0
             delete_hits           0
           delete_misses           0
       evicted_unfetched           0
               evictions           0
       expired_unfetched           0
                get_hits           0
              get_misses           0
              hash_bytes      524288
       hash_is_expanding           0
        hash_power_level          16
               incr_hits           0
             incr_misses           0
                libevent 2.0.21-stable
          limit_maxbytes    67108864
     listen_disabled_num           0
                     pid        2724
            pointer_size          64
               reclaimed           0
            reserved_fds          20
           rusage_system    0.001455
             rusage_user    0.001455
                 threads           4
                    time  1508042446
       total_connections          11
             total_items           0
              touch_hits           0
            touch_misses           0
                  uptime           3
                 version      1.4.15

需要关注

get_hits:表示获取数据成功的次数。 curr_items:表示当前缓存中存放的所有缓存对象的数量。不包括目前已经从缓存中删除的对象。 平常关注的是 get_hist/curr_items 得出的结果,计算出命中率数值,命中率的目的,是要确认,memcached缓存了数据,而且还有请求,如果光缓存却没有请求,那么做这个缓存也就没有意义了。。 cmd_set:累积保存数据的数量,或者echo stats |nc 127.0.0.1 11211

需要安装nc工具:yum install -y nc 这个查看到的结果和 memcached-tool的结果一致

若安装libmemcached后,可以使用命令

memstat --servers=127.0.0.1:11211

查看memcached服务状态,这个可以用于查看远程memcache机器的结果,查看到的结果和memcached-tool的结果很像.

21.5 memcached命令行

进入数据库

说明: 使用telnet命令进入数据库

[root@root-01 ~]# telnet 127.0.0.1 11211
-bash: telnet: 未找到命令


# yum安装telnet命令
[root@root-01 ~]# yum install -y telnet


#成功进入数据库
[root@root-01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

存储数据

说明:使用set 创建数据

[root@root-01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

set key2 0 30 2
wh
STORED


set key1 0 30 3
wt
wrt
CLIENT_ERROR bad data chunk
ERROR

特别说明:定义了三个字节,那么要入3个字节,否则会报错

set key1 0 20 3
qwe
STORED


注:key2 --> 库名;  30 --> 单位是秒,表示过期时间;  2 --> 定义几个字节

查看存储是否成功

说明: 如果get没有数据出来,说明数据已经过期了,这就是过期时间,如果不想数据过期可以设置为0

get key1
END

如果数据没有过期的话,那么get就可以查看存储的数据

[root@root-01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

set key3 1 100 4
wuwu
STORED

get key3
VALUE key3 1 4
wuwu
END

Memcached语法规则

  1. <command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n 说明:\r\n在Windows下是Enter键

  2. <command name> 可以是set、add、replace set表示按照相应的<key>存储该数据,没有的时候增加,有的时候覆盖 add表示按照相应<key>添加该数据,但是如果该<key>已经存在,则会操作失败. replace表示按照相应的<key>替换数据,但是如果该<key>不存在,则会操作失败.

  3. <key>客户端需要保存数据的key

  4. <flags>是一个16位的无符号的整数(以十进制的方式表示). 该标志将和需要存储的数据一起存储,并在客户端get数据时返回. 客户端可以将此标志用做特殊用途,此标志对服务器来说是不透明的.

  5. <exptime>为过期的时间 若为0表示存储的数据永远不过期(但可被服务器算法:LRU等替换). 如果非0(Unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)

  6. <bytes>需要存储的内容,输入完成后,最后客户端需要加上\r\n(直接点击Enter)作为结束标志.

替换数据 --replace

#创建key4,过期时间为1000秒,5个字节
set key4 1 1000 5
Anwut
STORED

#查看是否创建成功
get key4
VALUE key4 1 5
Anwut
END

#把key4过期时间替换成0永不过期,10个字节
replace key4 1 0 10
1234567890
STORED


get key4
VALUE key4 1 10
1234567890
END

删除值--delete

#删除key4的值
delete key4
DELETED

#使用get查看,key4就没任何的数值
get key4
END

退出memcached方式

^] --> Ctrl+] 

telnet> quit
Connection closed.

21.6 memcached数据导出和导入

memcached数据导出的目的?

当重启服务器或者重启Memcached服务的时候,内在内存的数据会消失, 所以当重启Memcached服务时需要先把数据导出来, 启动完之后再把数据导回去,以保证数据不丢失.

写入几条数据,目的是为了学习做实验

[root@root-01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set name 1 0 6          
annawu
STORED
set key6 1 0 3
wqd
STORED
set name 1 0 4
dong
STORED
^]
telnet> quit
Connection closed.

查看memcached状态

说明:之前做的过操作使用memstat命令可以看到

[root@root-01 ~]# memstat --servers=127.0.0.1:11211
Server: 127.0.0.1 (11211)
	 pid: 2180
	 uptime: 39939
	 time: 1507661325
	 version: 1.4.15
	 libevent: 2.0.21-stable
	 pointer_size: 64
	 rusage_user: 1.113442
	 rusage_system: 1.263668
	 curr_connections: 10
	 total_connections: 17
	 connection_structures: 11
	 reserved_fds: 20
	 cmd_get: 9                       //查看了有9个项目
	 cmd_set: 10                      //创建了10个项目
	 cmd_flush: 0
	 cmd_touch: 0
	 get_hits: 4
	 get_misses: 5
	 delete_misses: 0
	 delete_hits: 1                  //删除了一个项目
	 incr_misses: 0
	 incr_hits: 0
	 decr_misses: 0
	 decr_hits: 0
	 cas_misses: 0
	 cas_hits: 0
	 cas_badval: 0
	 touch_hits: 0
	 touch_misses: 0
	 auth_cmds: 0
	 auth_errors: 0
	 bytes_read: 430
	 bytes_written: 3464
	 limit_maxbytes: 67108864
	 accepting_conns: 1
	 listen_disabled_num: 0
	 threads: 4
	 conn_yields: 0
	 hash_power_level: 16
	 hash_bytes: 524288
	 hash_is_expanding: 0
	 bytes: 145
	 curr_items: 2
	 total_items: 8
	 expired_unfetched: 1
	 evicted_unfetched: 0
	 evictions: 0
	 reclaimed: 1

导出数据

[root@root-01 ~]# memcached-tool 127.0.0.1:11211 dump > data.txt
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 2
Dumping bucket 1 - 2 total items

重启Memcached服务

[root@root-01 ~]# systemctl restart memcached

导入数据

[root@root-01 ~]# nc 127.0.0.1 11211 < data.txt
STORED
STORED

注:成功导入了两个数据


#查看是否导入成功
[root@root-01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get name
END
get key6
END
^]
telnet> quit
Connection closed.

[root@root-01 ~]# cat data.txt 
add key6 1 1507621386 3
wqd
add name 1 1507621386 4
dong

说明:进入数据库查看数据,结果是get不到,是因为data.txt的数据有一个时间戳已经过期.

修改data.txt文件数据的时间戳

说明:修改为1个小时后的时间戳

[root@root-01 ~]# date -d "+1 hour" +%s
1507707396
[root@root-01 ~]# vim data.txt 

add key6 1 1507707396
add key6 1 1507707396 3
wqd
add name 1 1507707396 4
dong

重新导入数据

说明: 现在更改了过期的时间戳,就可以查数据.

#重启Memcached服务
[root@root-01 ~]# systemctl restart memcached

#导入数据
[root@root-01 ~]# nc 127.0.0.1 11211 < data.txt
STORED
STORED

#进入数据库查看数据
[root@root-01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

get name
VALUE name 1 4
dong
END

get key6
VALUE key6 1 3
wqd
END

21.7 php连接memcached

说明:虽然可以使用telnet连接,但是在网站里面(LNMP架构),如何PHP去连接memcached呢? Memcached它总得要有自己的客户端吧. 在前面编译PHP,PHP是支持连接MySQL的,如何PHP不支持连接MySQL的话,是不可能做到搭建Discuz论坛(查看帖子或发帖子),可以做到安装Discuz论坛(查看帖子或发帖子),是因为PHP和MySQL是可以连接的. 同理PHP也需要连接Memcached,所以在PHP的模块里面需要Memcache这样的一个模块,它作为PHP连接Memcached的一个中间件,如果没有这个模块的话,PHP也是无法连接Memcached的.

安装php的memcached扩展

[root@root-01 ~]# cd /usr/local/src

#下载
[root@root-01 src]# wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz

#解压
[root@root-01 src]# tar -zxvf memcache-2.2.3.tgz 
package.xml
memcache-2.2.3/config.m4
memcache-2.2.3/config9.m4
memcache-2.2.3/config.w32
memcache-2.2.3/CREDITS
memcache-2.2.3/example.php
memcache-2.2.3/memcache.c
memcache-2.2.3/memcache_queue.c
memcache-2.2.3/memcache_session.c
memcache-2.2.3/memcache_standard_hash.c
memcache-2.2.3/memcache_consistent_hash.c
memcache-2.2.3/memcache.dsp
memcache-2.2.3/php_memcache.h
memcache-2.2.3/memcache_queue.h
memcache-2.2.3/README

#进入memcached目录
[root@root-01 src]# cd memcache-2.2.3

[root@root-01 memcache-2.2.3]# ls
config9.m4  config.w32  example.php  memcache_consistent_hash.c  memcache_queue.c  memcache_session.c        php_memcache.h
config.m4   CREDITS     memcache.c   memcache.dsp                memcache_queue.h  memcache_standard_hash.c  README


#生成configure文件
[root@root-01 memcache-2.2.3]# /usr/local/php-fpm/bin/phpize 
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226

[root@root-01 memcache-2.2.3]# ls
acinclude.m4    config.guess  configure.in  ltmain.sh                   memcache_queue.c          mkinstalldirs
aclocal.m4      config.h.in   config.w32    Makefile.global             memcache_queue.h          php_memcache.h
autom4te.cache  config.m4     CREDITS       memcache.c                  memcache_session.c        README
build           config.sub    example.php   memcache_consistent_hash.c  memcache_standard_hash.c  run-tests.php
config9.m4      configure     install-sh    memcache.dsp                missing

#编译
[root@root-01 memcache-2.2.3]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
[root@root-01 memcache-2.2.3]# echo $?
0

#make
[root@root-01 memcache-2.2.3]# make && make install


#make之后会在/usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/这里生成一个Memcache.so的文件

[root@root-01 memcache-2.2.3]# ls /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
memcache.so  opcache.a  opcache.so

编辑/usr/local/php-fpm/etc/php.ini

[root@root-01 memcache-2.2.3]# vim /usr/local/php-fpm/etc/php.ini

添加:
extension=memcache.so

查看php模块可以看到有memcache的模块

[root@root-01 memcache-2.2.3]# /usr/local/php-fpm/sbin/php-fpm -m
[PHP Modules]
cgi-fcgi
Core
ctype
curl
date
dom
ereg
fileinfo
filter
ftp
gd
hash
iconv
json
libxml
mbstring
==memcache==
mysql
mysqli
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
soap
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

测试php是否支持memcache这个扩展

说明:下载测试脚本

[root@root-01 ~]# curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2> /dev/null
[root@root-01 ~]# cat 1.php
<?php
//连接Memcache Memcache
$mem = new Memcache;
$mem->connect("localhost", 11211);
//保存数据
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br>";
//替换数据
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";
//保存数组数据
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";
//清除所有数据
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
//关闭连接
$mem->close();
?>

测试

说明: 测试成功.

[root@root-01 ~]# /usr/local/php-fpm/bin/php 1.php
Get key1 value: This is first value<br>Get key1 value: This is replace value<br>Get key2 value: Array
(
    [0] => aaa
    [1] => bbb
    [2] => ccc
    [3] => ddd
)
<br>Get key1 value: <br>Get key2 value: <br>[root@root-01 ~]#

21.8 memcached中存储sessions

说明:memcached中存储session一般用在负载均衡,比如是lnmp架构,这多web服务器,在用户登录的时候就遇到一个问题,第一次登录在A服务器上,第二次在B服务器上,这时候呢,就无法让某一个用户他的登录状态始终在某服务器上. 如果我们使用的是nginx代理的话,可以使用IP_HASH, 但如果是使用LVS,那么就无法让某一个用户他的登录状态始终在某服务器上. 但有个方发让session不再存到磁盘上,而是存到memcached里面去,而memcached可以作为一个公共的服务器,那它访问的时候使用其中某个内网IP,而不是127.0.0.1.把session存到memcached里面,需要在php-fpm.conf配置文件里定义.

打开php.ini配置文件

本实例是在lamp/lnmp环境下实现
编辑php.ini添加两行(待测试)
session.save_handler = memcache
session.save_path = "tcp://192.168.122.130:11211"
或者httpd.conf中对应的虚拟主机中添加
php_value session.save_handler "memcache"
php_value session.save_path "tcp://192.168.122.130:11211"
或者php-fpm.conf对应的pool中添加
php_value[session.save_handler] = memcache
php_value[session.save_path] = "tcp://192.168.122.130:11211 "
上述ip地址为本机

下载测试文件

wget http://study.lishiming.net/.mem_se.txt
将其移动到虚拟主机目录中:
mv /root/.mem_se.txt /data/wwwroot/www.111.com

cp .mem_se.txt 1.php
在php-fpm.conf对应的pool中添加:

vim /usr/local/php-fpm/etc/php-fpm.conf

添加:
php_value[session.save_handler] = memcache
php_value[session.save_path] = "tcp://192.168.122.130:11211"

注:如上要是有专门的memcache服务器,这儿就需要配置独立memcache的地址。

/etc/init.d/php-fpm restart

测试

[root@yt-01 www.111.com]# curl localhost/1.php
1507648188<br><br>1507648188<br><br>41026no8snqjq81phrl7ukovc6
[root@yt-01 www.111.com]# curl localhost/1.php
1507648268<br><br>1507648268<br><br>e2apbv2kkibntt4r59llfj52r1
[root@yt-01 www.111.com]# curl localhost/1.php
1507648269<br><br>1507648269<br><br>4mjm7v7thjldh413kuebcbjbe0
[root@yt-01 www.111.com]# curl localhost/1.php
1507648270<br><br>1507648270<br><br>1if2vpeut27r1siebjlv87ik92
登录 查看值:
[root@yt-01 www.111.com]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get i7vddchc2jdjpedsvck2tppra2
VALUE i7vddchc2jdjpedsvck2tppra2 0 37
TEST|i:1507648271;TEST3|i:1507648271;
END
如上使用get 去查看一个值! 可以查询到相关的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值