十分钟学会memcache,比你想象的要简单

转发:https://baijiahao.baidu.com/s?id=1588816843517136163&wfr=spider&for=pc

一、核心优化概述

什么是优化,以更小的资源支持更大负载网站的运行,以小博大。

思路:尽量减少用户的等待时间,节省系统资源开销,节省宽带使用。

优化什么地方?有三个方面:

①、Memcache内存缓存技术、②、静态化技术、③、mysql优化

二、Memcache

内存缓存技术:memcache是实现php语言 对内存进行操作的中间介质。

memcache与redis的区别和联系

redis支持比较多的数据类型(String/list/set/sortset/hash),redis支持集合计算的(set类型支持),每个key最大数据存储量为1G,redis是新兴的内存缓存技术,对各方面支持不完善,支持持久化操作。

memcache:老牌的内存缓存技术,对相关领域支持比较丰富,window和linux都可以使用,各种框架(tp/yii等等)都可以支持,session的信息可以非常方便的保存到该memcache中,每个key保存的数据量最大为1M,支持的数据类型比较单一,就是String类型,不支持持久化。

两者的相同之处在于把数据保存在内存中。

注意:以上的区别必须要知道哦,在进行第三方优化的时候,就可以根据实际情况来定了!

安装memcache

1、复制服务器端文件到运行目录

复制memcached.exe文件到运行目录(如:H:/memcached.exe)

启动memcache服务

前台方式memcache启动服务

默认是前台启动,Ctrl+C可以结束该前台进程。

此时,进程里边已经有memcache服务:

memcache相关参数设置:

通过具体参数设置启动memcache的格式:

给memcache设置开机启动项服务

设置开机启动项服务:

生成开机启动项服务:

通过命名方式启动服务:

php中安装memcache扩展

复制如图文件到php扩展目录:

修改php.ini,使其开启memcache扩展:

之后重启apache即可。php开启memcache扩展成功

php对memcache的使用

memcache在php中就是一个操作类,具体使用:实例化对象、对象调用成员的过程。

php中连接memcache服务器:

php中memcache的使用,其数据模型与redis一致,为 key - value。

在php中给memcache设置一个key,名称为“weather”

对weather 的key再进行查询操作:

key的名字:该key的名字的组成部分与redis比较相似,基本键盘可以输入的信息都可以作为key的名字部分,key的长度最大是250字节。

有效期事宜:$me -> set(key, value, 是否压缩, 有效期 秒);

有效期设置有两种方式:

A. 时间差设置:从当前的时间点项后顺延指定秒的时间就到期(过期)

$me -> set(key, value, 是否压缩, 120); //向后120秒到期,该方式有限制:最多的时间差就是30天(2592000秒)

B. 时间戳设置:从1970-1-1 0:0:0 到现在经过的秒数,$me -> set(key, value, 是否压缩, time()+120); //向后120秒到期

时间差方式的有效期最大为30天:

(如果需要设置key的有效期时间大于30天的,就必须使用“时间戳”方式设置)

各种数据类型的存储:php的数据类型:标量类型:int string boolean float 复合类型:array object resource null

memcache存储标量类型数据,把他们都转化为”String字符串”类型存储。

存储复合类型数据,直接“原型”存储。

标量类型的存储:

标量类型信息在memcache中都变为“String字符串”类型信息

复合类型信息存储:在memcache中直接是“原型”存储。

原型存储对资源的消耗比较大,为了节省资源,可以把复合类型信息都变为字符串形式进行存储,这样就需要对复合信息进行 序列化 操作: serialize() unserialize()

压缩选项

$me -> set(key, value, 是否压缩0/1, 有效期 秒);

是否压缩的特点:压缩:内存空间节省、运行速度稍慢。未压缩:内存空间占据少多、运行速度快。

压缩原理是zlib技术:

zlib---->php----->memcache

其他相关操作方法可以参考对应的文档,这里就不加以赘述了!直接进入重点

总结:

1. memcache安装和开启服务使用:开启服务:① 前台开启 ② 设置开机启动项服务

2. 给php开放memcache扩展:① 复制扩展文件php_memcache.dll、② php.ini 打开扩展参数

3. php里边操作memcache:① 实例化对象、② 对象连接服务器、③ 对象调用相关方法实现具体操作

set(key,value,压缩,有效期) ,get() delete() connect()

终端操作memcache

连接memcache:利用协议 telnet(远程连接协议),实现对memcache的操作。

利用终端操作memcache

查看memcache的状态:

分布式部署memcache

分布式:把原先有一台memcache服务器做的工作,现在分摊到多台memcache执行。这样会降低memcache的工作负载。

例如:一台memcache需要存储100w的key,如果有5个服务器,则每个服务器存储20w的可以。

该分布式与redis的主从模式比较相似,但是他们不一样

redis:其为主从模式,一个redis负责数据写入,其他多个redis负责数据读取

memcache:其不是主从模式,该分布式是平均分摊工作,每个子服务器之间都是平级的,每个服务器都要执行数据的写入、读取操作。

下图为memcache中分布式的示意图:

从图中可以看到,memcache本身有算法,可以保证数据“平均”地存储在不同的服务器里边,php语言和各个服务器之间也通过该算法衔接,进一步讲,php内部的实现与之前的代码风格保持一致即可。

memcache分布式具体实现类型:

① 在一个服务器里边,开启多个memcache服务

② 买多个服务器,每个服务器里边安装一个memcache服务

使用分布式:开启多个memcache服务:

注意:memcache集群使用的时候,key的设置和获取,他们的服务器顺序必须严格一致,否则数据的使用有错误。

数据读取失败:

缓存失效

超过有效期:具体是通过“懒惰”机制删除该过期数据,与过期session的删除类似。

过期session删除机制:session是以文件形式保存的硬盘中,如果有的session文件已经过期了,则该session文件不会立即被删除,而是后期其他用户访问网站使用session的同时会有一定的几率触发删除过期的session文件。

memcache的过期数据删除也是懒惰机制实现,如果有一个key过期了,其本身不会马上被删除,而是我们调用get方法获取数据的同时会删除该过期的数据。

缓存空间耗尽

如果存储的数据超过memcache最大的存储限制(默认是64M),此时还继续存入数据,则会把最近不常使用的key就删除了。该机制名称为LRU(least recently use)优先删除最近很好使用的key。

该LRU机制可以根据实际情况禁用,如果继续使用满载的memcache则系统要报错。

(开启服务的同时可以设置-M参数,禁用LRU机制)

session存入memcache

session可以存入mysql数据库中。

需求:一个大型的网站开发完毕,内部涉及的服务器一般是有多个组成的,多台服务器彼此之间需要共享session信息,这样就要求session势必要存入mysql或memcache中。

session的信息以文件形式存储在服务器内部,不能实现多个服务器共享,只有存入的mysql或memcache中才可以实现数据共享。

mysql或memcache可以实现多个服务器彼此之间共享session信息。

具体使用:php.ini里边有session存储的方式和保存位置设置参数:

session信息存储到memcache的key的名称为session_id():

在终端里边把session信息给获得出来:

分布式集群设置:

memcache案例

网站有一个页面,内部需要获得许多数据信息,该数据信息在短时间内不发生变化,为了降低mysql的负载,就把这些数据获得出来存入到memacache中过去,供后续访问。

第一次使用,缓存没有数据,就从mysql数据库获得数据,提供给用户,同时把数据存储给缓存供后续使用

第二次(后续)使用,缓存有数据,就直接提供使用即可。

最后再谈与redis的区别:

redis分布式:主从模式

memcache分布式:把key平均分配到各个服务器,addServer(主机名,端口);

注意:key的设置和读取的多个memcache的加载顺序要保持一致

分布式类型:① 一台服务器多个服务、② 多台服务器多个服务

redis: 可以存储稍微复杂的数据(list、set、sortset、hash)用于集合计算

memcache: 支持领域比较多(win系统和linux系统都可以使用、各种框架支持使用、允许把session信息存入memcache中)一般存储的信息比较简单,例如字符串型信息,就可以使用memcache

基础篇---memcache的更多相关文章

  1. 转:基础篇|PHP如何解决网站大流量和高并发

    基础篇 高并发架构基础概念和优化思路 高并发架构相关概念 并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程 ...

  2. C#多线程之基础篇3

    在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...

  3. 一步步学习javascript基础篇(0):开篇索引

    索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...

  4. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  5. ABP框架实践基础篇之开发UI层

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...

  6. C#多线程之基础篇2

    在上一篇C#多线程之基础篇1中,我们主要讲述了如何创建线程.中止线程.线程等待以及终止线程的相关知识,在本篇中我们继续讲述有关线程的一些知识. 五.确定线程的状态 在这一节中,我们将讲述如何查看一个线 ...

  7. C#多线程之基础篇1

    在多线程这一系列文章中,我们将讲述C#语言中多线程的相关知识,在多线程(基础篇)中我们将学习以下知识点: 创建线程 中止线程 线程等待 终止线程 确定线程的状态 线程优先级 前台线程和后台线程 向线程 ...

  8. iOS系列 基础篇 03 探究应用生命周期

    iOS系列 基础篇 03 探究应用生命周期 目录: 1. 非运行状态 - 应用启动场景 2. 点击Home键 - 应用退出场景 3. 挂起重新运行场景 4. 内存清除 - 应用终止场景 5. 结尾 本 ...

  9. iOS系列 基础篇 04 探究视图生命周期

    iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...

随机推荐

  1. JAVA- 数据库连接池原理

    第一次Java程序要在MySQL中执行一条语句,那么就必须建立一个Connection对象,代表了与MySQL数据库的连接通过直接发送你要执行的SQL语句之后,就会调用Connection.close ...

  2. js中innerText/value/innerHTML三个属性的区别

    在做一个两个窗口之间的简单信息交互时遇见了一点问题,导致信息无法正常的传递. 最后发现问题是在innerText和value这两个属性上,先简单的总结记录一下几个相似的属性的作用: 1.innerTe ...

  3. codeforces 628B B. New Skateboard (数论)

    B. New Skateboard time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  4. 《java编程思想》:字符串

    1.String对象是不可变的,String类中每个看起来会修改String值的方法,实际上都是创建了一个新的String对象,来包含修改后的内容,所以在对String修改后,想打印新的值,可以直接打 ...

  5. 微信菜单加emoji图标

    1.https://icomoon.io/app/#/select----------------选择图标后进入 2. 笑脸表情可选择更多图标,左侧e901,是“字体码” 3.将图片复制件自定义菜单编 ...

  6. 【集成学习】lightgbm参数介绍(sklearn)

    #  XGBoost和LightGBM部分参数对比表: lightgbm.sklearn参数介绍(官网)

  7. 跨平台的WebRTC客户端框架:OpenWebRTC

    Webrtc的ios框架编译 http://www.th7.cn/Program/IOS/201502/390418.shtml WebRTC in WebKit : http://www.webrt ...

  8. uoj problem 21 缩进优化

    题目: 小O是一个热爱短代码的选手.在缩代码方面,他是一位身经百战的老手.世界各地的OJ上,很多题的最短解答排行榜都有他的身影.这令他感到十分愉悦. 最近,他突然发现,很多时候自己的程序明明看起来比别 ...

  9. [转]基于phantomJS实现web性能监控

    1.web性能监控背景描述 上期分享的<Web性能监控自动化探索之路–初识WebPageTest>从依赖webpagetest的角度给出了做性能日常检查的方案,但由于依赖结构相对复杂我们需 ...

  10. bzoj 2648 SJY摆棋子 —— K-D树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 学习资料:https://blog.csdn.net/zhl30041839/arti ...