文档章节

NoSQL-memcached

ln97
 ln97
发布于 08/21 23:25
字数 3376
阅读 4
收藏 0

NoSQL介绍

NoSQL叫非关系型数据库。
而关系型数据库代表有MySQL。对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗费时间和资源,尤其是数据是需要从磁盘里去检索。
NoSQL数据库存储原理非常简单(典型的数据类型为k-v(key-value)),不存在繁杂的关系链,比如mysql查询的时候,需要找到对应的库、表(通常是多个表)以及字段。而NoSQL数据库直接差关键字和对应的值即可。

NoSQL 特点:
NoSQL数据可以存储在内存里,查询速度非常快
NoSQL因为没有复杂的数据结构,扩展非常容易,支持分布式
NoSQL在性能表现上虽然能优于关系型数据库,但是它并不能完全替代关系型数据库

常见NoSQL数据库

k-v(key-value)形式的:memcached、redis 适合储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。
文档数据库:mongodb 将数据以文档的形式储存。每个文档都是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储。
列存储 Hbase
图 Neo4J、Infinite Graph、OrientDB

Memcached介绍

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

官方站点:

http://www.memcached.org/

memcached 特点:

数据结构简单(k-v),数据存放在内存里。memcached 不支持持久化,数据落地。每当memcached服务重启或者重启服务器,数据就会丢失。但可以定时来备份来让数据落地
多线程
基于c/s架构,协议简单
基于libevent的事件处理
自主内存存储处理(slab allowcation)
数据过期方式:Lazy Expiration 和 LRU

memcached 数据流向

1.用户请求给web服务器,服务器通过php去db上查询数据,并反馈给用户。
2.当web服务器查到数据同时会把数据结果存储到memcached中。
3.当用户再次需要查询该数据,web就会直接从memcached中读取数据。

slab allocation

Slab Allocation的原理
将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。
Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。
Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。
因此,chunk为最小单位,Page又多个chunk组成,而Slab又由多个Page来组成。其中chunk大小是由Growth Factor因子来决定的。
Memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制chunk大小的差异。默认值为1.25。
通过memcached-tool命令查看指定Memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25

命令: memcached-tool IP:端口 display

memcached 数据过期方式

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

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

Memcached 安装

安装命令:

[root[@localhost](https://my.oschina.net/u/570656) ~]# yum install memcached -y

安装完成后 可直接启动服务

[root[@localhost](https://my.oschina.net/u/570656) ~]# systemctl start memcached
[root[@localhost](https://my.oschina.net/u/570656) ~]# ps uax | grep memcached
memcach+  1633  0.1  0.1 325564  1184 ?        Ssl  23:27   0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root      1640  0.0  0.0 112676   980 pts/0    S+   23:27   0:00 grep --color=auto memcached
[root[@localhost](https://my.oschina.net/u/570656) ~]# 

参数:

启动参数
-u 指定运行memcached服务的用户
-p 执行监听端口
-m 指定内存大小 单位M
-c 指定最大并发数

参数配置文件路径 /etc/sysconfig/memcached

查看参数

[root[@localhost](https://my.oschina.net/u/570656) ~]# vim /etc/sysconfig/memcached 
[root@localhost ~]# cat !$
cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
[root@localhost ~]# 

port -- 端口号    user -- 用户  maxconn -- 最大并发数   cachesize -- 分配内存大小

查看memcached状态

使用命令 memcached-tool 查看状态

[root@localhost ~]# 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        1633
            pointer_size          64
               reclaimed           0
            reserved_fds          20
           rusage_system    0.240511
             rusage_user    0.022373
                 threads           4
                    time  1533483172
       total_connections          11
             total_items           0
              touch_hits           0
            touch_misses           0
                  uptime         316
                 version      1.4.15
[root@localhost ~]# 

需要留意的是:
curr_items暂存的项目 
cmd_get表示总的get次数
get_hits表示get的总命中次数
命中率 = get_hits/cmd_get

可以使用nc命令来查看memcached状态

安装 nc 命令

[root@localhost ~]# yum install nc -y

查看状态

[root@localhost ~]# echo stats | nc 127.0.0.1 11211
STAT pid 1633
STAT uptime 562
STAT time 1533483418
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.034690
STAT rusage_system 0.254394
STAT curr_connections 10
STAT total_connections 12
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
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 13
STAT bytes_written 1024
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 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END
[root@localhost ~]# 

使用memstats命令查看memcached状态

安装包 libmemcached

[root@localhost ~]# yum install libmemcached -y

查看状态

[root@localhost ~]# memstat --servers=127.0.0.1:11211
Server: 127.0.0.1 (11211)
	 pid: 1633
	 uptime: 667
	 time: 1533483523
	 version: 1.4.15
	 libevent: 2.0.21-stable
	 pointer_size: 64
	 rusage_user: 0.042709
	 rusage_system: 0.266935
	 curr_connections: 10
	 total_connections: 13
	 connection_structures: 11
	 reserved_fds: 20
	 cmd_get: 0
	 cmd_set: 0
	 cmd_flush: 0
	 cmd_touch: 0
	 get_hits: 0
	 get_misses: 0
	 delete_misses: 0
	 delete_hits: 0
	 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: 30
	 bytes_written: 2068
	 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: 0
	 curr_items: 0
	 total_items: 0
	 expired_unfetched: 0
	 evicted_unfetched: 0
	 evictions: 0
	 reclaimed: 0
[root@localhost ~]# 

三种查看memcached状态的命令

memcached-tool IP:端口 stats
echo stats |nc IP 端口
memstat --servers=IP:端口

memcached命令行

telnet命令进入memcached

格式: telnet IP 端口

[root@localhost ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
ad
ERROR
^]
telnet> quit
Connection closed.
[root@localhost ~]# 

退出telnet 按 ctrl+】 再输入quit 即可退出   退格按 ctrl + 退格键

nc 进入 memcached

格式: nc IP 端口

[root@localhost ~]# nc 127.0.0.1 11211

memcached 语法规则

<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
\r\n 是 windows下的 enter键

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

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

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

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

<bytes> 需要存储的字节数,当用户希望存储空数据时可以为0

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

memcached命令操作演示

添加键
set key1 0 100 2
ab
STORED
获取键对应值
get key1
VALUE key1 0 2
ab
END
替换值
replace key1 0 1000 3
123
STORED
在获取查看一次
get key1
VALUE key1 0 3
123
END
删除键
delete key1
DELETED

memcached 数据导出和导入

由于memcached在重启服务或者重启机器就会把数据丢掉,因此需要把数据进行备份。

命令格式: memcached-tool  IP:端口 dump > 备份文件

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

[root@localhost ~]# cat date.txt 
add key1 0 1533486907 3
123
[root@localhost ~]# 

[root@localhost ~]# date -d @1533486907
2018年 08月 06日 星期一 00:35:07 CST
[root@localhost ~]# 

使用nc命令把数据导入

格式: nc  IP 端口 < 备份文件

[root@localhost ~]# nc 127.0.0.1 11211 < date.txt 
NOT_STORED
导入进去时 由于我数据未删除,所以数据一模一样,导入失败
[root@localhost ~]# nc 127.0.0.1 11211 < date.txt 
STORED
[root@localhost ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key1
VALUE key1 0 3
123
END
^]
telnet> quit
Connection closed.
[root@localhost ~]# 

php 连接memcached

下载安装memcached

[root@lantern src]# wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
[root@lantern src]# tar zxvf memcache-2.2.3.tgz 
[root@lantern src]# cd memcache-2.2.3
[root@lantern memcache-2.2.3]# ls
config9.m4  CREDITS      memcache_consistent_hash.c  memcache_queue.h          php_memcache.h
config.m4   example.php  memcache.dsp                memcache_session.c        README
config.w32  memcache.c   memcache_queue.c            memcache_standard_hash.c
[root@lantern memcache-2.2.3]# 

进入memcache目录 生成 configure文件

/usr/local/php-fpm/bin/phpizes用来生成configure文件
[root@abc 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@abc memcache-2.2.3]# 

这里有些机器会报一个如下错误
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

这个是 缺少autoconf 导致的
需要安装   yum install -y autoconf  即可

初始化

[root@abc memcache-2.2.3]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config 

编译安装

make && make install

[root@abc memcache-2.2.3]# make install
Installing shared extensions:     /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
[root@abc memcache-2.2.3]# 

查看模块

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

加载扩展模块

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

[root@abc memcache-2.2.3]# cat !$ | grep memcache.so
cat /usr/local/php-fpm/etc/php.ini | grep memcache.so
;extension=memcache.so
[root@abc memcache-2.2.3]# 
加入以上内容

查看加载的模块

[root@abc memcache-2.2.3]# /usr/local/php-fpm/bin/php -m | grep memcache
memcache
[root@abc memcache-2.2.3]# 

测试:

[root@abc memcache-2.2.3]#  curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
[root@abc memcache-2.2.3]# 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@abc memcache-2.2.3]# 

代码内容在 https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/1.php

[root@abc memcache-2.2.3]# /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@abc memcache-2.2.3]# 

memcached中存储session

编辑php.ini文件

[root@abc memcache-2.2.3]# vim /usr/local/php-fpm/etc/php.ini 
找到  session.save_handler = files   这行 并注释  
再输入以下2行内容
session.save_handler = memcache
session.save_path = "tcp://192.168.1.180:11211"

session.save_handler 定义session的存储类型 session.save_path 定义session的地址

或者编辑httpd.conf中对应的虚拟主机

[root@abc memcache-2.2.3]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
在 <VirtualHost *:80>里添加如下代码

php_value session.save_handler "memcache" 
php_value session.save_path "tcp://192.168.1.180:11211"

或者编辑php-fpm.conf

[root@abc memcache-2.2.3]# vim /usr/local/php-fpm/etc/php-fpm.d/test1.conf
[root@abc memcache-2.2.3]# cat !$
cat /usr/local/php-fpm/etc/php-fpm.d/test1.conf
php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.1.180:11211 "

[root@abc memcache-2.2.3]# 

测试:

下载一个PHP测试页面看memcached是否存储了session

[root@abc memcache-2.2.3]# wget http://study.lishiming.net/.mem_se.txt
代码内容在  https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/session.php

[root@abc memcache-2.2.3]# cp .mem_se.txt /data/wwwroot/abc.com/1.php 
[root@abc conf]# curl localhost/1.php
1532371530<br><br>1532371530<br><br>232ec253b915dddb4312cde7ef93e309 
[root@abc conf]# 

进入 memcached

get 232ec253b915dddb4312cde7ef93e309
VALUE ln16irtfbb24ollb29alemc763 0 37
TEST|i:1532371530;TEST3|i:1532371530;
END

可见memcached已经存储session

© 著作权归作者所有

ln97
粉丝 1
博文 35
码字总数 116118
作品 0
NoSQL开篇——为什么要使用NoSQL

http://nosql-database.org/ NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面。今年伊始,InfoQ中文站有幸邀请到凤凰网的...

mickelfeng
2013/02/04
0
1
NoSQL开篇——为什么要使用NoSQL

【编者按】NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面。今年伊始,InfoQ中文站有幸邀请到凤凰网的孙立先生,为大家分...

Mr&Cheng
2013/01/20
0
0
NoSQL数据库介绍、memcached安装

NoSQL数据库 什么是NoSQL数据库? 非关系型数据库就是NoSQL,关系型数据库代表MySQL; 关系型数据库,是需要吧数据存储到库、表、行、字段中,查询需要根据条件一行行的匹配,需要从磁盘中检...

若白衣
05/21
0
0
关系型数据库和NoSQL数据库

关系型数据库和NoSQL数据库 什么是NoSQL 大家有没有听说过“NoSQL”呢?近年,这个词极受关注。看到“NoSQL”这个词,大家可能会误以为是“No!SQL”的缩写,并深感愤怒:“SQL怎么会没有必要...

丈量大地
2014/03/11
0
1
nosql介绍 memrcached介绍 安装memcached 查看memcached状态

21.1NoSQL介绍 什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常...

lyy549745
08/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
2
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
113
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
4
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部