memcached简介

一、memcached是什么

  • memcached是一个开源的、支持高性能、高并发的分布式内存缓存系统
  • mem+cache+daemon:分布式内存缓存守护进程
  • memcached是C/S架构,memcached是服务端,memcache是客户端

二、memcached的作用

2.1传统网站的问题

传统场景,多数web应用都将数据保存在数据库中,web服务器从中读取数据并在浏览器显示.但随着数据流的增大、访问的集中,数据库的负担就会出现加重、响应缓慢,导致网站打开延迟等问题

2.2memcached应用场景

2.2.1使用memcached的主要作用就是缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度,提高可扩展性

2.2.2使用memcached缓存session

三、memcached作为数据库前端缓存读数据流程

Web程序先读memcached,如果memcached有数据则直接返回给Web程序,如果没有数据再读数据库,数据库把数据返回给Web程序之后,Web程序先将数据存到memcached一份,再返回给用户,下一次直接读memcached

四、memcached更新数据流程

应用服务器先更新数据库,再通知memcached更新对应的数据

五、memcached的特性

1.协议简单

memcached协议实现简单,采用基于文本行的协议,能通过Telnet/nc等命令直接操作memcached

2.使用libevent作为事件处理通知机制

libevent将linux系统的epoll模型等事件处理功能封装成一个接口,确保服务器端的连接数增加也能发挥很好的性能

3.key/value键值数据类型

被缓存的数据以key/value键值对的形式存在.如:oldboy:123,key=oldboy、value=123

六、memcached内存管理机制

memcached抛弃了通过malloc分配内存用完通过free回收内存的机制,这种方式容易产生内存碎片

memcached现在使用slab内存管理机制

slab class:在memcached中,对元素的管理是以slab为单元进行管理的,每个slab对应一个或多个chunk,参考图一

chunk:存放元素的最小单元.用户数据item(key/value等)最终会保存在chunk中

page:大下固定为1MB

1.如图一图二所示,slab分配算法把每1MB大小的内存称为一个slab页,每次向系统申请一个slab页,然后再通过分割算法把这个slab页分割成若干了大小相同的chunk,再把这些chunk分配给用户使用

2.如图一所示,每个slab class的chunk大小是按照1.25倍增加的,即下一个slab class中chunk的大小是上一个的1.25倍,也可以自己通过-f设置

3.如图三所示,当用户发来存储请求时(key/value),memcached会计算该key/value的大小,看看属于哪个slab,确定slab后看看里面是否有空闲chunk放该key/value,如果有就直接存进去;如果没有就再向系统申请一个page(如果此时已经达到启动memcached时-m设置的内存使用上限,如果启动时设置了-M就报错,否则就按照LRU规则删除元素),申请后将该page分配各slab class,切割成若干个相同大小的chunk,然后分配一个用来存.

4.如图四所示,memcached的slab分配算法也有弊端,假如要存储的key/value是100bytes,如果被分到图四中128bytes的chunk中的时候就造成了28bytes的浪费 

七、memcached的懒惰删除对象机制 

当删除item对象时,一般不释放内存空间,而是标记删除.memcached再分配空间时会优先使用已经过期的key/value空间

八、元素什么时候被踢出

如果元素还没有失效,但是已经达到启动memcached时-m指定的内存使用上限,如果启动memcached时指定了-M参数就报错,否则就按照LRU规则将元素踢出

九、LRU算法规则是什么

如果已经达到启动memcached时-m指定的内存使用上限,如果启动memcached时指定了-M参数就报错,否则就按照LRU规则将元素踢出

LRU算法就是:memcached会查找LRU列表中尾部(最近最少使用)的一些元素,看它们是否已经失效,如果存在已经失效的元素,则将此元素占用的空间重用.如果找不到失效的元素,那么就踢出尾部还没有失效的元素

十、memcached启动参数

十一、各类缓存软件对比

十二、memcached支持的语言

许多语言都实现了连接memcached的客户端
Perl
PHP
Python
Ruby
C#
C/C++
Lua

memcached服务管理

一、安装memcached

安装memcached依赖包
[root@cache01 ~]# yum -y install libevent libevent-devel nc telnet
安装memcached
[root@cache01 ~]# yum -y install memcached

二、启动memcached

[root@cache01 ~]# memcached -m 16m -p 11211 -d -u root  -c 8192

三、通过Telnet操作memcached

[root@MySQL ~]# telnet 127.0.0.1 11211   #连接memcached
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set key 0 0 10 #添加key
oldboy #添加value STORED #添加完成 get key #通过key获取的value
VALUE key 0 10
oldboy #这就是通过上边的key获取的value
END #获取完成 delete key #通过key删除value
DELETED #删除成功 get key #获取value
END stats #查看memcached内部的状态
STAT pid 2686
STAT uptime 532
STAT time 1478130192
STAT version 1.4.4
STAT pointer_size 64
STAT rusage_user 0.118981
STAT rusage_system 0.177972
STAT curr_connections 10
STAT total_connections 13
STAT connection_structures 11
STAT cmd_get 2 #获取了几次
STAT cmd_set 1 #添加了几次
STAT cmd_flush 0
STAT get_hits 1 #命中了几次
STAT get_misses 1 #未命中几次
STAT delete_misses 0
STAT delete_hits 1
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 auth_cmds 0
STAT auth_errors 0
STAT bytes_read 1104
STAT bytes_written 69
STAT limit_maxbytes 16777216
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 0
STAT curr_items 0
STAT total_items 1 #几个数据
STAT evictions 0

四、配置memcached作为LNMP环境session会话存储

4.1测试php连接memcached

4.1.1环境说明

lnmp 192.168.0.93 lnmp
memcached 192.168.0.95 memcached

4.1.2环境准备:

  • LNMP环境搭建好,这里省略
  • 必须能访问phpinfo界面

4.1.3memcached服务器端

启动memcached
[root@memcached ~]# memcached -m 16m -p 11211 -d -u root -c 8192

4.1.4LNMP端

安装memcache客户端
[root@lnmp02 tools]# tar -zxvf memcache-2.2.7
[root@lnmp02 ~]# cd memcache-2.2.7
[root@lnmp02 memcache-2.2.7]# /application/php/bin/phpize
[root@lnmp02 memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir
[root@lnmp02 memcache-2.2.7]#make
[root@lnmp02 memcache-2.2.7]#make install
在php.ini配置memcache
[root@lnmp02 memcache-2.2.7]#vim /application/php/lib/php.ini #编辑配置文件添加以下两行
extension_dir= "/application/php/lib/php/extensions/no-debug-non-zts-20090626/"
extension= memcache.so
重启nginx和php-fpm
[root@lnmp02 memcache-2.2.7]#/application/nginx/sbin/nginx -s reload
[root@lnmp02 memcache-2.2.7]#pkill php-fpm
[root@lnmp02 memcache-2.2.7]#ps -ef|grep php-fpm
[root@lnmp02 memcache-2.2.7]#/application/php/sbin/php-fpm
测试php是否安装memcached
windows端访问blog.etiantian.org/test.php(phpinfo界面)是否有memcache选项
编写php连接memcache访问程序
[root@lnmp02 blog]# cd /application/nginx/conf/extra/blog.conf
[root@lnmp02 blog]# vim memcache.php
<?php
$mem = new Memcache;
$mem->connect("192.168.0.95", 11211); $mem->set('key1', 'This is first value', 0, 3600);
$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();
?>
测试php是否能连接memcached

[root@lnmp02 memcache-2.2.7]#curl blog.etiantian.org/memcache.php
Get key1 value: This is first value
Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
Get key1 value:
Get key2 value:

4.2配置memcached为session共享

4.2.1LNMP端

修改php.ini配置文件为memcache存储session会话
[root@lnmp ~]# vim /application/php/lib/php.ini #修改以下内容
session.save_handler = memcache
session.save_path = "tcp://192.168.0.95:11211"
重启php-
fpm
pkill php-fpm
[root@lnmp ~]# /application/php/sbin/php-fpm

4.2.2测试

用客户端浏览器打开http://blog.etiantian.org/test.php(phpinfo界面)

4.2.3所有web服务端想实现session共享怎么办

在所有web服务器的php.ini加上memcache存储

Linux学习系列之memcached的更多相关文章

  1. Linux学习系列八:操作网口

    一些相对高性能的单片机会带以太网接口,网口在MCU里算是比较复杂的外设了,因为它涉及到网络协议栈,通常情况下网络协议栈会运行在一个RTOS中,所以对普通单片机开发者来说网口使用起来相对难度较大一些.在 ...

  2. Linux学习系列之Linux入门(二)Vim学习

    第二篇 Vim学习 主要内容: 基本命令: 插件扩展: 参考资料: vim是一个命令控制的文本编辑器,可以完成几乎我们想要做的所有工作,除了Emacs几乎没有其他的工具能和它匹敌.官方网站是:http ...

  3. Linux学习系列之一:在centos 7.5上安装nginx 以及简单配置

    说到Linux我们都知道那是相当相当得重要得啊,在计算机这个行业,开发运维都是离不开它得.我作为一个准毕业生,智商可能不太够,只能自己笨鸟先飞,自己操作起来咯.俗话说的好,好记性不如难笔头嘛.而且ng ...

  4. linux学习系列一

    1. 基本命令(注意参数的大小写) 学习linux如果使用的是windows 建议使用一个很好用的工具git,下载安装即可使用linux下的命令来操作windows 1.1目录及文件 注意/ 有表示根 ...

  5. Linux学习系列之Linux入门(一)linux安装与入门

    第一篇:安装并配置Linux开发环境 一.安装linux: 主要安装Linux的发行版,到目前为之,主要的发行版有: 比较常用的是Ubuntu.redhat和centOS,主要的安装方法详细: Ubu ...

  6. Linux学习笔记总结--memcached配置

    Memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调用到 ...

  7. Linux学习系列之Nginx调优实战

    Nginx配置文件性能微调 全局的配置 user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofi ...

  8. Linux学习系列——零基础开始

    第一部分 Linux基础命令 1.查看系统信息命令 2.Linux内核版本 3.修改环境变量

  9. linux学习系列三

    1. 账户与账户安全 账户和组是操作系统的基本概念,linux的组有基本组和附加组之分,一个用户只可以加入到一个基本组中国,但是可以加入到多个附加组中.创建用户时,系统默认会自动创建同名的组,并设置用 ...

随机推荐

  1. Java加密简介

    加密算法: 1.对称加密 DES   AES 2.非对称加密 RSA 3.散列函数算法加密 (单项加密)::MD5.SHA.Mac 4.数字签名算法:RSA.DSA 其中,前三种主要完成数据的加解密: ...

  2. dd - 转换和拷贝文件

    摘要 dd [--help] [--version] [if=file] [of=file] [ibs=bytes] [obs=bytes] [bs=bytes] [cbs=bytes] [skip= ...

  3. basename - 从文件名中剥离目录和后缀

    总览 (SYNOPSIS) basename NAME [SUFFIX] basename OPTION 描述 (DESCRIPTION) 显示 去掉 目录成分 后的 NAME. 如果 指定了 SUF ...

  4. CAD参数绘制椭圆(网页版)

    在CAD设计时,需要绘制椭圆,用户可以设置椭圆的基本属性. 主要用到函数说明: _DMxDrawX::DrawEllipse 绘制椭圆.详细说明如下: 参数 说明 DOUBLE dCenterX 椭圆 ...

  5. C# 如何发送Http请求

    HttpSender是一个用于发送Http消息的轻量C#库,使用非常简单,只需要一两行代码,就能完成Http请求的发送 使用 Nuget,搜索 HttpSender 就能找到这个库 这个库的命名空间是 ...

  6. ssd遇到的bug

    从训练一开始就loss为0: 最开始以为是在生成train.lmdb前没有对label_map进行修改,发现并不是这个问题 1.训练的命令是:python ./examples/ssd/ssd_pas ...

  7. 打印出A到Z的所有字符,使用char和int转换

    public class Demo14{ //A到Z的所有字符,使用char和int转换 public static void main(String[] args) { for(int i = 65 ...

  8. iOS工具】rvm、Ruby环境和CocoaPods安装使用及相关报错问题解决

    〇.前言 <p>在iOS开发中 CocoaPods作为库依赖管理工具就是一把利器. 有了 CocoaPods则无需再通过拖 第三方库及第三方库所依赖的 framework静态库到项目中等麻 ...

  9. [PyTorch] rnn,lstm,gru中输入输出维度

    本文中的RNN泛指LSTM,GRU等等 CNN中和RNN中batchSize的默认位置是不同的. CNN中:batchsize的位置是position 0. RNN中:batchsize的位置是pos ...

  10. Discuz 论坛修改admin账户密码

    打开Navicat for MySQL 找到数据表 pre_ucenter_members 把密码修改为123456789 password:047099adb883dc19616dae0ef2adc ...