75.Memcached
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了75.Memcached相关的知识,希望对你有一定的参考价值。
一、什么是NoSQL
- 非关系型数据库就是NoSQL,关系型数据库代表mysql
- 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗费时间和资源,尤其是数据是需要从磁盘里去检索
- NoSQL数据库存储原理非常简单(典型的数据类型为k-v),不存在繁杂的关系链,比如mysql查询的时候,需要找到对应的库、表(通常是多个表)以及字段。
- NoSQL数据可以存储在内存里,查询速度非常快
- NoSQL在性能表现上虽然能优于关系型数据库,但是它并不能完全替代关系型数据库
- NoSQL因为没有复杂的数据结构,扩展非常容易,支持分布式
二、常见NoSQL数据库
- k-v形式的:memcached、redis 适合储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。
- 文档数据库:mongodb 将数据以文档的形式储存。每个文档都是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储。
- 列存储 Hbase
- 图 Neo4J、Infinite Graph、OrientDB
三、Memcached介绍
- Memcached是国外社区网站LiveJournal团队开发,目的是为了通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能。
- 官方站点?http://www.memcached.org/?
- 数据结构简单(k-v),数据存放在内存里
- 多线程
- 基于c/s架构,协议简单
- 基于libevent的事件处理
- 自主内存存储处理(slab allowcation)
- 将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。
- Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。
- Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。
- Memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制chunk大小的差异。默认值为1.25。
- 通过memcached-tool命令查看指定Memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25
- 命令:# memcached-tool 127.0.0.1:11211 display
- 数据过期方式:Lazy Expiration 和?LRU
- Memcached的数据过期方式
- Lazy Expiration?
Memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,Memcached不会在过期监视上耗费CPU时间。 - LRU
Memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当内存空间不足时(无法从slab class获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。
- Lazy Expiration?
四、Memcached的数据流向,安装
-
安装
yum install -y memcached libmemcached libevent systemctl start memcached
- vim /etc/sysconfig/memcached 可以配置参数
比如加上监听的ip,可以把OPTIONS="" 改为OPTIONS="127.0.0.1"
其中-m指定memcached分配内存(默认是M)
-c指定最大并发数
-u指定运行memcached服务的用户 - 如果需要修改配置,就用命令行启动
/usr/bin/memcached -u memcached -p 11211 -m 64-c 1024 或者是 vi /etc/sysconfig/memcached
- vim /etc/sysconfig/memcached 可以配置参数
- 查看Memcached运行状态
memcached-tool 127.0.0.1:11211 stats
或者
echo stats |nc 127.0.0.1 11211
需要安装nc工具
yum install -y nc
rpm -qf `which nc`
若安装libmemcached后,可以使用命令
memstat --servers=127.0.0.1:11211
查看memcached服务状态
在memcached中,运行state命令可以查看memcached服务的状态信息,其中cmd_get表示总的get次数,get_hits表示get的总命中次数,命中率 = get_hits/cmd_ge
总结,查看状态三种方法
memcached-tool 127.0.0.1:11211 stats
echo stats |nc 127.0.0.1 11211
memstat --servers=127.0.0.1:11211
-
Memcached语法规则
<command name> <key> <flags> <exptime> <bytes> <data block>
注: 在windows下是Enter键- <command name> 可以是set, add, replace
- set表示按照相应的<key>存储该数据,没有的时候增加,有的时候覆盖
- add表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败
- replace表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败。
- <key> 客户端需要保存数据的key
- <flags> 是一个16位的无符号的整数(以十进制的方式表示)。该标志将和需要存储的数据一起存储,并在客户端get数据时返回。客户端可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
- <exptime> 为过期的时间。若为0表示存储的数据永远不过期(但可被服务器算法:LRU 等替换)。如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
- <bytes> 需要存储的字节数,当用户希望存储空数据时<bytes>可以为0
- <data block>需要存储的内容,输入完成后,最后客户端需要加上 (直接点击Enter)作为结束标志。
- Memcached命令行
telnet 127.0.0.1 11211 #进入memcached
set key2 0 30 2 #30(过期时间30s,如果是0就表示永不过期,2两个字节)
ab
STORED
get key2
VALUE key2 0 2
ab
END - Memcached数据示例
set key3 1 100 4
abcd
STORED
get key3
VALUE key3 1 4
abcd
END
replace key3 1 200 5
abcdx
STORED
get key3
VALUE key3 1 5
abcdx
END
delete key3
DELETED
get key3
END
ctrl + } 退出
quit 退出 telnet
-
Memcached数据导出和导入
导出:memcached-tool 127.0.0.1:11211 dump > data.txt
cat data.txt
导入:nc 127.0.0.1 11211 < data.txt
若nc命令不存在,yum install nc
注意:导出的数据是带有一个时间戳的,这个时间戳就是该条数据过期的时间点,如果当前时间已经超过该时间戳,那么是导入不进去的 - PHP连接Memcached
先安装php的memcache扩展cd /usr/local/src/ wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz tar zxf memcache-2.2.3.tgz cd memcache-2.2.3 /usr/local/php-fpm/bin/phpize
遇到问题
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
解决方法:yum install -y m4 autoconf
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make && make install
安装完后会有类似这样的提示:Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
然后修改php.ini添加一行
vi /usr/local/php-fpm/etc/php.ini
extension=memcache.so
检查
/usr/local/php-fpm/bin/php -m
/etc/init.d/php-fpm restart
- PHP连接Memcached
下载测试脚本curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
1.php内容也可以参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/1.php
执行脚本/usr/local/php-fpm/bin/php 1.php
或者将1.php放到某个虚拟主机根目录下面,在浏览器访问,即可看到效果
- Memcached中存储session?
本实例是在lamp/lnmp环境下实现vim /usr/local/php-fpm/etc/php.ini
搜索session
如图,路径为file,即保存在本地,默认的session存放在/tmp
cd /usr/local/src
wget http://study.lishiming.net/.mem_se.txt
mv .mem_se.txt /data/wwwroot/default/session.php
其中session.php内容可以参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/session.php
curl localhost/session.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.127.133:11211 "
/etc/init.d/php-fpm restart
rm -rf /tmp/sess*
curl localhost/session.php
memcached-tool 127.0.0.1:11211 dump > data.txt
cat data.txt
以上是关于75.Memcached的主要内容,如果未能解决你的问题,请参考以下文章