带你走进memcache,老牌内存缓存技术
一.核心优化概述
什么是优化:以更小的资源支持更大负载网站的运行,以小博大。
思路:尽量减少用户等待时间,节省系统资源开销,节省带宽使用。
优化什么地方?有三方面: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,老牌内存缓存技术的更多相关文章
- 图片_ _图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- 图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个问题曾经让我觉得很烦恼,后来终于得到了解决, 那么现在就让我和大家一起分享一下吧. 这篇博文要讲的图片缓存机制,我接触到的有两 ...
- 转 图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- 【转】图片缓存之内存缓存技术LruCache、软引用 比较
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- 五分钟学后端技术:如何学习Redis、memcache等常用缓存技术
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类 ...
- Memcached内存缓存技术
Memcached是什么,有什么作用? Memcached是一个开源的.高性能的内存缓存软件,从名称上看Mem就是内存的意思,而Cache就是缓存的意思. Memcached通过在事先规划好的内存空间 ...
- 一文带你理解TDengine中的缓存技术
作者 | 王明明,涛思数据软件工程师 小 T 导读:在计算机系统中,缓存是一种常用的技术,既有硬件缓存,比如我们经常听到的 CPU L2 高速缓存,也有软件缓存,比如很多系统里把 Redis 当做数据 ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- 基于.net的通用内存缓存模型组件
谈到缓存,我们自然而然就会想到缓存的好处,比如: 降低高并发数据读取的系统压力:静态数据访问.动态数据访问 存储预处理数据,提升系统响应速度和TPS 降低高并发数据写入的系统压力 提升系统可用性,后台 ...
随机推荐
- 第六章 Sleuth--链路追踪
修整了2天,我们继续接着上篇 第五章 Gateway–服务网关 继续来讲SpringCloud Alibaba全家桶中的 Sleuth 链路追踪 组件 喜欢记得点关注哦 6.1 链路追踪介绍 在大型系 ...
- s2-061 漏洞复现
0x00 漏洞简介 Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架.Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执 ...
- Windows7里面怎么实现FTP服务功能
1.安装FTP服务 点击:计算机 -->属性 --> 控制面板主页 --> 程序 --> 打开或关闭Windows功能 2. 调出管理工具 操作: 鼠标点击工具栏,选择属性,选 ...
- 【命令】htop命令
一.Htop的使用简介 大家可能对top监控软件比较熟悉,今天我为大家介绍另外一个监控软件Htop,姑且称之为top的增强版,相比top其有着很多自身的优势.如下: 两者相比起来,top比较繁琐 默认 ...
- python初学者-水仙花数简单算法
输出"水仙花数".所谓水仙花是指一个3位数的十进制数,其各位数字的立方和等于该数本身.例如:153是水仙花数. 用for循环实现水仙花数的计算图如下所示: 1 for i in r ...
- 《单元测试之道》Java版学习日志
在软件工程这门课程中,首先谈单元测试的概念,单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确.通常而言,一个单元测试是用于判断某个特定条件或某个特定函数的行为.我们 ...
- Abp小试牛刀之 图片上传
图片上传是很常见的功能,里面有些固定的操作也可以沉淀下来. 本文记录使用Abp vNext做图片上传的姿势. 本文的技术核心与Abp无关,Abp只是手段! 目标 上传图片----->预览图片-- ...
- [leetcode]24. Swap Nodes in Pairs交换链表的节点
感觉这个题后台的运行程序有问题,一开始自己想的是反转链表那道题的方法,只是隔一个节点执行一次,但是没有通过,TLE了,但是很奇怪,并没有死循环,就是最后返回的时候超时. 最后的思路就是很简单的进行交换 ...
- JAVA的一些笔记
/*一般函数与构造函数的区别 构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化 一般函数:对象创建时,需要函数功能时才调用 构造函数:一个对象对象创建时,只调用一次 一般函数:对象创 ...
- break continue学习
1.break和continue必须使用在循环或者switch语句中 2.当break语句单独存在时.后面不要定义其他语句,因为后面的语句无法执行到 3.break跳出当前所在循环 4.break跳出 ...