NoSQL——Memcached

什么是NoSQL

 非关系型数据库就是NoSQL,关系型数据库表明MySQL  php

对于关系型数据库来讲,是须要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量很是大的时候就很耗费时间和资源,尤为是数据是须要从磁盘里去检索  mysql

NoSQL数据库存储原理很是简单(典型的数据类型为k-v),不存在繁杂的关系链,好比mysql查询的时候,须要找到对应的库、表(一般是多个表)以及字段。  linux

NoSQL数据能够存储在内存里,查询速度很是快  git

NoSQL在性能表现上虽然能优于关系型数据库,可是它并不能彻底替代关系型数据库  web

NoSQL由于没有复杂的数据结构,扩展很是容易,支持分布式redis

常见NoSQL数据库

k-v形式的:memcached、redis 适合储存用户信息,好比会话、配置文件、参数、购物车等等。这些信息通常都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。  算法

文档数据库:mongodb   将数据以文档的形式储存。每一个文档都是一系列数据项的集合。每一个数据项都有一个名称与对应的值,值既能够是简单的数据类型,如字符串、数字和日期等;也能够是复杂的类型,若有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性能够是不一样的,数据可使用XML、JSON或者JSONB等多种形式存储。  sql

列存储 Hbase  mongodb

图  Neo4J、Infinite Graph、OrientDB数据库

——————————————————————————————————————

Memcached介绍

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

官方站点 http://www.memcached.org/  数据结构简单(k-v),数据存放在内存里  

多线程  

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

基于libevent的事件处理  

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

数据过时方式:Lazy Expiration 和 LRU

Memcached的数据流向

Slab allocation    

Slab Allocation的原理  

将分配的内存分割成各类尺寸的块(chunk), 并把尺寸相同的块分红组(chunk的集合),每一个chunk集合被称为slab。  Memcached的内存分配以Page为单位,Page默认值为1M,能够在启动时经过-I参数来指定。  

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

Slab allocation    

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获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

Memcached安装

yum install -y memcached libmemcached libevent  
systemctl start memcached

ps aux |grep memcache

netstat -lntp

vim /etc/sysconfig/memcached 能够配置参数

 

好比加上监听的ip,能够把OPTIONS="" 改成OPTIONS="127.0.0.1"  其中-m指定memcached分配内存  

-c指定最大并发数  

-u指定运行memcached服务的用户

查看Memcached运行状态

memcached-tool 127.0.0.1:11211 stats  

或者echo stats |nc 127.0.0.1 11211

须要安装nc工具 yum install -y nc  

若安装libmemcached后,可使用命令  

memstat --servers=127.0.0.1:11211 查看memcached服务状态

[root@cc01 ~]# 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        1641
            pointer_size          64
               reclaimed           0
            reserved_fds          20
           rusage_system    0.004952
             rusage_user    0.014857
                 threads           4
                    time  1541729369
       total_connections          11
             total_items           0
              touch_hits           0
            touch_misses           0
                  uptime        1101
                 version      1.4.15

Memcached命令行

yum install -y telnet

telnet 127.0.0.1 11211

[root@cc01 ~]# 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
12
STORED
set key1 0 30 3
12
123
CLIENT_ERROR bad data chunk
ERROR
set key1 0 20 3
abc
STORED
get key1
VALUE key1 0 3
abc
END

Memcached语法规则

<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
 注:\r\n在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>须要存储的内容,输入完成后,最后客户端须要加上\r\n(直接点击Enter)做为结束标志。

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

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
./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添加一行extension=memcache.so
检查/usr/local/php/bin/php-fpm -m
下载测试脚本 
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放到某个虚拟主机根目录下面,在浏览器访问,便可看到效果
最终能够看到数据以下:
 [0] => aaa
 [1] => bbb
 [2] => ccc
 [3] => ddd

Memcached中存储session

本实例是在lamp/lnmp环境下实现
编辑php.ini添加两行
session.save_handler = memcache session.save_path = "tcp://192.168.0.9:11211"  
或者httpd.conf中对应的虚拟主机中添加
php_value session.save_handler "memcache" php_value session.save_path "tcp://192.168.0.9:11211"  
或者php-fpm.conf对应的pool中添加
php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.0.9:11211 "

测试:

wget http://study.lishiming.net/.mem_se.txt
mv .mem_se.txt  /usr/local/apache2/htdocs/session.php
其中session.php内容能够参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/session.php
curl localhost/session.php 
相似于1443702394<br><br>1443702394<br><br>i44nunao0g3o7vf2su0hnc5440
telnet 127.0.0.1 11211
get i44nunao0g3o7vf2su0hnc5440

相关文章
相关标签/搜索