Memcache技术精华

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群

基本介绍下memcache

它是一个一个高性能的分布式内存对象缓存系统。

端口号 11211

目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、

需要频繁访问数据库的网站访问速度提升效果十分显著

根据一个sql取出的数据,把sql取出的数据,给缓存到memcache里面,

当下次再操作该sql语句的时候,则直接从memcache里面获取


memcache客户端mc和服务器端ms可以单独安装在任何独立server上。

跟mysql比较一下

 

 它是一个c/s架构

mysql的数据是存在磁盘的 memcache存在内存里

mysql的数据存储是,由数据库,数据表,数据的记录,

存储数据是按照表的结构进行存储的。

memcache的数据存储格式是:key/value的格式,来存储的,

相当于在内存里面有一张两列的哈希表。类似于php的里面的关联数组



memcache细节讨论

 1、缓存周期(有效期)

缓存周期的设置有两种方式:

如果缓存周期设置为0表明此数据永不过期


第一种使用:秒数,最大不能超过30天,即2592000秒,

第二种使用:使用时间戳,该时间戳是到的哪个时间点。比如我们要把一个数据缓存60天,

$mem->add($key,$value,0,time()+60*24*3600)


2、 惰性删除,

就是说,缓存的数据,到期后,不会自动删除,当get数据的时候,查看有没有到期,如果到期了,则再删除该数据。

 memcache不会开启进程来监视键是否过期,省memcache的资源,也省cpu.


3、Least Recently Used(LRU)

最近 最少使用原则,

当前存储的数据的在memcache里面空间已经占满后,则memcache会把不活跃(get或set次数比较少的)的数据(不管是否到期)清除,让新的数据给存储进来。


4、安全性

memcache定位就是做数据的缓存的,不是数据的持久存储的,因此没有做一些用户的验证,目的提高连接速度,发挥自己的独特功能。

memcahe该软件本身没有提供一些安全机制,如果要限制使用,则只能在操作系统的层面来解决,比如window系统、安装防火墙的软件,在linux下面使用iptables,seclinux(安全机制)


5、memcache比较适合于存储哪些数据。

存储的数据的特点:

 访问比较频繁,

安全性不高,丢失无所谓,

修改比较频繁的数据,比如一些用户的在线状态。


6、不适合应用的场景:

 1、缓存的数据量比较小。

2、缓存的数据需要持久化。



memcache实现原理

1、访问数据的速度比传统的关系型数据库要快,因为Oracle、MySQL这些传统的关系型数据库为了保持数据的持久性,数据存放在硬盘中,IO操作速度慢


2、memcache的数据存放在内存中同时意味着只要memcache重启了,数据就会消失


3、既然memcache的数据存放在内存中,那么势必受到机器位数的限制,32位机器最多只能使用2GB的内存空间,要使用更多内存,可以分多个端口开启多个Memcached进程。

 64位机器可以认为没有上限。


4、memcache采用的内存分配方式是固定空间分配


1、memcache将内存空间分为一组slab


2、每个slab下又有若干个page,每个page默认是1M,如果一个slab占用100M内存的话,那么这个slab下应该有100个page


3、每个page里面包含一组chunk,chunk是真正存放数据的地方,同一个slab里面的chunk的大小是固定的


4、应该可以理解为什么memcache存放的value大小是限制的,因为一个新数据过来,slab会先以page为单位申请一块内存,申请的内存最多就只有1M,所以value大小自然不能大于1M了


5、memcache的内存分配chunk里面会有内存浪费,88字节的value分配在128字节(紧接着大的用)的chunk中,就损失了30字节,但是这也避免了管理内存碎片的问题


6、memcache的LRU算法不是针对全局的,是针对slab的






总结memcache的特性和限制



1、memcache中可以保存的item数据量是没有限制的,只要内存足够



2、memcache单进程在32位机中最大使用内存为2G,64位机则没有限制。



3、Key最大为250个字节,超过该长度无法存储



4、单个item最大数据是1MB,超过1MB的数据不予存储



5、memcache服务端是不安全的,比如已知某个memcache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效//这个不太懂 抽时间实践



6、不能够遍历memcache中所有的item,因为这个操作的速度相对缓慢且会阻塞其他的操作



8、memcache设置添加某一个Key值的时候,传入expiry为0表示这个Key值永久有效,这个Key值也会在30天之后失效



数据在内存中失效后,并不会立马被删除,只有在下次get时候,系统才会将其删除。

memcache可以因此,被一些未被及时删除的数据占满空间。

加之LRU淘汰机制,永久数据如果很少被访问的话,在内存空间被占满的情况下,再有新数据被缓存,则永久数据,就有可能被删除





PHP的memcache客户端所有方法总结

memcache::add


添加一个值,如果已经存在,则返回false



memcache::addServer


添加一个可供使用的服务器地址



memcache::close


关闭一个memcache对象



memcache::connect


创建一个memcache对象


memcache::decrement


对保存的某个key中的值进行减法操作

 

memcache::delete


删除一个key值



memcache::flush


清除所有缓存的数据

实际上没有释放资源,它仅仅将所有的缓存标记为过期,这样可以使新的缓存来覆盖被占的内存空间。



memcache::get


获取一个key值



memcache::getServerStatus


获取运行服务器的参数

成功返回服务器状态,服务器没有启动会返回0,其他数字的时候表示服务器是启动状态的。



memcache::getStatus


返回服务器的一些运行统计信息

 

memcache::getVersion


返回运行的memcache的版本信息



memcache::increment


对保存的某个key中的值进行加法操作



memcache::pconnect


创建一个memcache的持久连接对象



memcache::replace


对一个已有的key进行覆写操作



memcache::set

添加一个值,如果已经存在,则覆写

 

Memcache是以守护进程方式运行于一个或多个服务中,随时会接收客户端的连接和操作。



Memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
监控 NoSQL Redis
一探Redis究竟:超火爆入门指南,你竟然还没看?
Redis是由C语言编写的开源、基于内存、支持多种数据结构、高性能的Key-Value数据库。
260 2
一探Redis究竟:超火爆入门指南,你竟然还没看?
|
缓存 NoSQL Java
吹爆!阿里最新开源的这份Redis全栈小册,涵盖了Redis的所有操作
前言 Redis这玩意不用多说,Java后端打工人就没有没接触过的,现在出去面试基本上是必问项;而且在工作中在项目中还能起很大的作用。它不仅能减少数据库的操作、并且你还可以利用redis的一些数据结构如set sorted set 解决一些特定的问题、利用单线程实现分布式锁、一些简单的订阅发布等等。 当然,这些你都会的话,那说明你只是停留在会用的阶段。如果你想要精通redis,并想在面试的中凭借Redis俘获面试官的芳心的话。除了会用以外,还要去掌握redis一些基本的原理如压缩表、跳跃表、哨兵模式、集群、高可用,这样可以让你更好的使用redis,保证缓存利用最大化、资源最优化。掌握这些你在
174 0
|
25天前
|
存储 NoSQL MongoDB
Redis在中国火爆,为何MongoDB更受欢迎国外?
本文介绍了Redis和MongoDB的基本概念及其在GitHub Star、DB-Engines Ranking和Google Trends中的数据对比。Redis是一个基于内存的键值对存储数据库,适合快速读写场景;MongoDB则是面向文档的数据库,支持大规模数据存储和复杂查询。全球范围内,MongoDB的搜索热度高于Redis,但在中国市场,Redis更受欢迎,因其高性能和低延迟特性满足了中国互联网公司对高并发的需求。总结部分分析了两者的特点及适用场景,并结合中美两国的行业背景解释了其受欢迎程度的不同原因。
50 1
|
5月前
|
存储 NoSQL 关系型数据库
MongoDB保姆级指南(上):七万字从零到进阶,助你掌握又一款强大的NoSQL!
MongoDB是数据库家族中的一员,是一款专为扩展性、高性能和高可用而设计的数据库,它可以从单节点部署扩展到大型、复杂的多数据中心架构,也能提供高性能的数据读写操作;而且提供了数据复制、无感知的故障自动选主等功能,从而实现数据节点高可用。
452 6
|
8月前
|
监控 NoSQL Redis
【万字长文 一文搞定】Redis:从新手村到大师殿堂的奥德赛之旅 9种实现分布式锁的全技术指南
【万字长文 一文搞定】Redis:从新手村到大师殿堂的奥德赛之旅 9种实现分布式锁的全技术指南
108 4
|
8月前
|
缓存 NoSQL Java
互联网疯传的Redis学习笔记:收藏达到30W,阿里P7评论我很需要
Redis作为目前的主流NoSql数据库,不会是不可能的,在面试中也是非常高频的,一定不能在这个环节丢分,不管是学习,还是面试,以下知识点,都有必要掌握。
|
运维 NoSQL MongoDB
[慕课笔记]mongodb入门篇
[慕课笔记]mongodb入门篇
69 1
|
安全 Java 数据库
顿悟!百度强推的Redis天花板笔记,原来数据库是这样理解的
写在前面 自从 Spring Boot、Spring Cloud 火起来之后,Spring Security 也跟着沾了一把光! 其实我一直觉得 Spring Security 是一个比 Shiro 优秀很多的权限管理框架,但是重量级、配置繁琐、门槛高这些问题一直困扰着 Spring Security 的开发者,也让很多初学者望而却步。直到 Spring Boot 横空出世,这些问题统统都得到缓解。 在 Spring Boot 或者 Spring Cloud 中,如果想选择一个权限管理框架,几乎毫无疑问的选择 Spring Security,Shiro 在这个环境下已经不具备优势了。 但
顿悟!百度强推的Redis天花板笔记,原来数据库是这样理解的
腾讯云大神亲码“redis深度笔记”,不讲一句废话,全是精华
作为这个时代码代码的秃头人员,对Redis肯定是不陌生的,如果连Redis都没用过,还真不好意思出去面试,指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis,像亚马逊、谷歌、阿里、腾讯都要使用,可见精通Redis使用真的很有必要。 所以,今天则分享出腾讯云大神亲自码出的“redis深度笔记”,笔记内容没有讲一句废话,全篇看下来都是精华
|
存储 缓存 运维
知乎问题: 如何说服技术老大用 Redis ?
缓存的世界很广阔,对于**应用系统**来讲,我们经常将缓存划分为**本地缓存**和**分布式缓存**。 本地缓存 :应用中的缓存组件,缓存组件和应用在同一进程中,缓存的读写非常快,没有网络开销。但各应用或集群的各节点都需要维护自己的单独缓存,无法共享缓存。 分布式缓存:和应用分离的缓存组件或服务,与本地应用隔离,多个应用可直接共享缓存。