热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NoSQL——memcached

2019独角兽企业重金招聘Python工程师标准NoSQL——memcached一、NoSQL介绍前期一直用的数据库mysql,属于关系型数据库。现介绍一款非关

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

NoSQL——memcached

一、NoSQL介绍

前期一直用的数据库mysql,属于关系型数据库。现介绍一款非关系型数据库——NoSQL;NoSQL=Not Only SQL,意为“不仅仅是SQL”,即非关系型数据库。

  • 对于关系型数据库(mysql)来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗费时间和资源,尤其是数据是需要从磁盘里去检索。
  • NoSQL数据库存储原理非常简单(典型的数据类型为k-v),不存在繁杂的关系链,比如mysql查询的时候,需要找到对应的库、表(通常是多个表)以及字段。
  • NoSQL数据可以存储在内存里,查询速度非常快;
  • NoSQL在性能表现上虽然能优于关系型数据库,但是它并不能完全替代关系型数据库;
  • NoSQL因为没有复杂的数据结构,扩展非常容易,支持分布式;
  • NoSQL特点
    • 易扩展;
    • 大数据量,高性能;
    • 多样灵活的数据模型。

1.1 系型数据库和非关系型数据库

  • 关系型数据库:

例如京东或者淘宝这些大型电商平台,有着很庞大的数据结构体系,有用户表,商品表,用户信息,商品信息,等当产生一个订单的时候,或者查询数据,是哪个用户,在什么时间,购买了哪些商品,当调取一个用户在某个时间买了什么东西的时候这些数据是存在一定的关联的。

  • 非关系型数据库:

NoSQL的存在就是不需要这些错综复杂的理念,一个key对应一个value。例如一个用户下对应着他的采购订单。且数据全部存在闪存中。不需要再次从磁盘中调取。

NoSQL是不可以替代Mysql独立存在的。例如现实运维环境中,我们一台WEB安装了一个Discuz,随着访问量的增加,数据库扛不住那么大的压力;怎么办呢?我们设置一个NoSQL,当用户读取完毕后会直接放在NoSQL中,当用户再次读取的时候,会直接从缓存中读取,不需要再次从数据库中读取。帖子的ID就类似于Key,帖子的内容就类似于Value。

NoSQL因为没有复杂的数据结构,扩展非常容易,支持分布式。所以扩展也比较容易。如果你的A服务器受到瓶颈,增加服务器让让其继续缓存呗,因为不像关系型数据库需要互相关联,NoSQL直接横向扩展即可!

mysql的话只有前面说到的主主,主从,多主多从针对从进行负载均衡。要么就是分库分表,前提是关联的数据库不可以分开,不关联的数据库可以分开。

1.2 常见NoSQL数据库

  • k-v形式的:memcached、redis

适合储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。

  • 文档数据库:mongodb

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

  • 列存储: Hbase

  • 图存储: Neo4J、Infinite Graph、OrientDB

二、Memcached介绍

2.1 Memcached概念及特点

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

  • 数据结构简单(k-v),数据存放在内存里
  • 多线程
  • 基于c/s架构,协议简单(你需要先启动一个服务,然后用这个服务进行通信??)
  • 基于libevent的事件处理
  • 自主内存存储处理(slab allowcation)
  • 数据过期方式:Lazy Expiration 和 LRU
  • Memcached的数据流向

2.2 Memcached的数据流向

常规作业流程是:用户发起请求给NGINX,然后再次调用PHP,PHP和mysql打交道,当用户PHP获取到请求转给NGINX,NGINX再次把请求数据交给用户。

如果并发量很大,请求mysql的队列比较多,耗费资源,时间。

因此如图,增加一个缓存层Memcached。这样访问过的数据全部丢在缓存中,当再次请求这个数据的时候就直接从Memcached读取,少数据库访问次数,以提高动态web应用的速度、提高可扩展性。

2.3 Slab allocation

其原理为:

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

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

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

2.4 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

2.5 Memcached的数据过期方式

Memcached的数据过期方式,有两种形式:

- Lazy Expiration

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

- LRU

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

三、安装memcached

安装、启动memcached

[root@ying01 ~]# yum install -y memcached [root@ying01 ~]# systemctl start memcached

查看端口、以及进程

[root@ying01 ~]# netstat -lntp |grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 1326/memcached
tcp6 0 0 :::11211 :::* LISTEN 1326/memcached
[root@ying01 ~]# ps aux |grep memcache
memcach+ 1326 0.0 0.3 325604 3244 ? Ssl 11:44 0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root 1338 0.0 0.0 112720 984 pts/0 S+ 11:46 0:00 grep --color=auto memcache
[root@ying01 ~]#

上面进程中,可以看到默认的启动信息

/usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024

此为默认启动设置:p 端口 m 64M -c 指定最大并发数 -u指定运行memcached服务的用户

可以更改其默认设置:

  • 修改默认文件

[root@ying01 ~]# vim /etc/sysconfig/memcachedPORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="127.0.0.1" //更改为监控ip

  • 命令行启动

[root@ying01 ~]# /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024

四、查看memcached状态

用命令 memcached-tool 127.0.0.1:11211 stats

[root@ying01 ~]# memcached-tool 127.0.0.1:11211 stats |head -5
#127.0.0.1:11211 Field Valueaccepting_conns 1auth_cmds 0auth_errors 0bytes 0

还可以用此命令:echo stats |nc 127.0.0.1 11211

[root@ying01 ~]# yum install -y nc //主要安装nc[root@ying01 ~]# echo stats |nc 127.0.0.1 11211 | head -5
STAT pid 1326
STAT uptime 924
STAT time 1534910395
STAT version 1.4.15
STAT libevent 2.0.21-stable

此命令也可以: memstat --servers=127.0.0.1:11211

[root@ying01 ~]# yum install -y libmemcached //若没有安装,请安装[root@ying01 ~]# memstat --servers=127.0.0.1:11211 |head -5
Server: 127.0.0.1 (11211)pid: 1326uptime: 992time: 1534910463version: 1.4.15

五、Memcached语法应用

5.1 Memcached命令行

Memcached类似于mysql一样,同样支持类似于mysql中创建一个库,创建一个表,插入一个表,查看表数据等。

首先需要安装 telnet 命令

[root@ying01 ~]# yum install -y telnet

连接 Memcached,进行一些操作:

[root@ying01 ~]# 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 //设置 key2 数值,30秒过期,2字节
12 //此时输入任意2字节
STORED //系统表示已储存
get key2 //查看key2的内容
VALUE key2 0 2
12
END
get key2 //再次查看key2,已经没有数值,因为过期时间为30秒
END

简单释义:

手动存储一个数据: set key2 0 30 2

其中key2 代表着 key值

  • 0代表着 flags 标记
  • 30代表着 过期时间
  • 2代表着 2个字节

5.2 Memcached语法规则

Memcached语法标准格式:

\r\n \r\n

  • 注:\r\n在windows下是Enter键
  • 可以是set, add, replace
    • set表示按照相应的存储该数据,没有的时候增加,有的时候覆盖
    • add表示按照相应的添加该数据,但是如果该已经存在则会操作失败
    • replace表示按照相应的替换数据,但是如果该不存在则操作失败。
  • 客户端需要保存数据的key
  • 是一个16位的无符号的整数(以十进制的方式表示)。该标志将和需要存储的数据一起存储,并在客户端get数据时返回。客户端可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
  • 为过期的时间。若为0表示存储的数据永远不过期(但可被服务器算法:LRU 等替换)。如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
  • 需要存储的字节数,当用户希望存储空数据时可以为0
  • 需要存储的内容,输入完成后,最后客户端需要加上\r\n(直接点击Enter)作为结束标志。

演示以上命令 注意:在telnet模式下,使用“Ctrl + Backspace键删除”

set key5 1 60 3 //存储一个3字节值
www
STORED
get key5 //查询key5的值
VALUE key5 1 3
www
END
replace key5 1 200 6 //替换key5的值
www123
STORED
get key5 //查询替换后的值
VALUE key5 1 6
www123
END
delete key5 //删除key5的值
DELETED
get key5
END

六、Memcached数据导出和导入

memcached命令删除 : Ctrl + Backspace

memcached退出 : ctrl+] 然后 quit

set ok 1 0 5
^]
telnet> quit
Connection closed.
[root@ying01 ~]#

通过查看其状态,可以看到set 、 get 等操作数据

[root@ying01 ~]# memstat --servers=127.0.0.1:11211 //查看状态,里面有记录的cmd_get: 4cmd_set: 6cmd_flush: 0cmd_touch: 0get_hits: 1get_misses: 1delete_misses: 3delete_hits: 0

查看内容,结果消失了,说明过期了;

[root@ying01 ~]# memcached-tool 127.0.0.1:11211 dump
Dumping memcache contentsNumber of buckets: 0Number of items :

此时再次进入memcached,创建数据,再查看

[root@ying01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set name 1 200 5 //设置过期时间200s
12345
STORED
get name
VALUE name 1 5
12345
END
^]
telnet> quit
Connection closed.
[root@ying01 ~]# memcached-tool 127.0.0.1:11211 dump
Dumping memcache contentsNumber of buckets: 1Number of items : 1
Dumping bucket 1 - 1 total items
add name 1 1534913629 5
12345

导出数据

[root@ying01 ~]# memcached-tool 127.0.0.1:11211 dump > data.txt
Dumping memcache contentsNumber of buckets: 1Number of items : 1
Dumping bucket 1 - 1 total items[root@ying01 ~]# ls data.txt
data.txt
[root@ying01 ~]# cat data.txt
add name 1 1534913629 5
12345

导出数据

[root@ying01 ~]# nc 127.0.0.1 11211 STORED

**注意:**导出的数据是带有一个时间戳的,这个时间戳就是该条数据过期的时间点,如果当前时间已经超过该时间戳,那么是导入不进去的。

七、 php连接memcached

7.1 安装memcache扩展

下载memcache包、解压

[root@xavi ~]# cd /usr/local/src
[root@xavi src]# wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
[root@ying01 src]# tar zxf memcache-2.2.3.tgz
[root@ying01 src]# cd memcache-2.2.3
[root@ying01 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@ying01 memcache-2.2.3]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config[root@ying01 memcache-2.2.3]# make[root@ying01 memcache-2.2.3]# make install

查看 生成so文件

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

7.2 在php.ini加载memcache

在php.ini添加此语句,让调用此扩展模块

[root@ying01 memcache-2.2.3]# vim /usr/local/php-fpm/etc/php.iniextension="memcache.so" //添加此语句

查看其是否存在

[root@ying01 memcache-2.2.3]# /usr/local/php-fpm/sbin/php-fpm -m
[PHP Modules]
cgi-fcgi
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
hash
iconv
json
libxml
mbstring
mcrypt
memcache //模块已经在 PHP Modules 里面
mysql

7.3 测试

查看1.php内容

[root@ying01 memcache-2.2.3]# curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null //下载 写入
[root@ying01 memcache-2.2.3]# cat 1.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 ."
";
//替换数据
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "
";
//保存数组数据
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "
";
//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "
";
//清除所有数据
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "
";
//关闭连接
$mem->close();
?>

执行此php

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

Get key1 value:
Get key2 value:
[root@ying01 memcache-2.2.3]#

八、memcached中存储session

应用场景:为LNMP架构下做的负载均衡。

假如第一次登录是在A服务器上,第二次登录是在B服务器上,假如使用的是nginx代理upstream可以使用ip_hash;如果使用LVS呢?

解决方法是:把session不存在服务器的磁盘上,而是存在memcached上去。memcached作为一个公共的服务器,任何web服务器都可以连接!

[root@ying01 ~]# wget http://study.lishiming.net/.mem_se.txt //下载此存session的脚本[root@ying01 ~]# vim .mem_se.txtsession_start();
if (!isset($_SESSION['TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION['TEST3'] = time();
print $_SESSION['TEST'];
print "

";
print $_SESSION['TEST3'];
print "

";
print session_id();
?>


转:https://my.oschina.net/u/3851633/blog/1931990



推荐阅读
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • 缓存 分布式锁 Redis
    分布式锁现在Redis基本上没家公司都在使用,只是各自使用的场景不以,但Redis最出名的还是做为缓存服务器,提搞服务器的的吞吐量,下面我们来围绕这个作为缓存做一个总结今天的目标其 ... [详细]
  • LVS-DR直接路由实现负载均衡示例
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
author-avatar
落渊绝夜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有