Memcached (一)介绍

简介:

简要概述:

Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据(不做编码),如字符串、对象等。

为什么是直接数据?因为数据在网络中传输是要经过流式化的,数据传递到对方那里,它如何知道这是什么类型的数据呢,所以就需要在原有数据之外在增加其他数据来修饰数据。所以直接数据就是不加任何修饰的数据。

比如在读写分离一主多从的模式下,为了加速查询从服务器通常开启缓存,特别是会发生多表连接查询的时候。但是由于多个从服务器前端有一个调度器来进行负载均,所以每次同一个请求未必发送到同一个从服务器上,这样缓存就用不了了。为了解决这个问题,就引入了公共缓存,也就是Memached

Memached是键值数据库,键就是其实就是搜索条件的HASH码,值就是数据。查找过程就是对比HASH码,所以只要HASH码不冲突,那么它的查找时间无论你有多少HASH码时间都是一样的,也就O1的查找速度。

Memecached是一个开发工具,它不是一个代码加速器,也不是数据库中间件。为什么它不是数据库中间件呢,因为中间件是你请求它,如果它没有数据,它会替你去向后查找,而Memached则不是,所以这就是为什么说Memcached的功能一半依赖于客户端的开发,一半依赖于服务器。


它的特点如下:

  1. 简单的KEY/VALUE存储

  2. 功能实现一半依赖于客户端,一半依赖于服务器

  3. 各个Memcached服务器之间没有联系

  4. O1的执行效率

  5. 过期数据处理,默认情况下采用懒惰模式,因为内存数据库实际上就是对内存的操作,每增加一个数据就要发起系统调用去申请内存,减少一个数据也要发起系统调用去回收内存,所以如果频繁的这种操作会影响性能。


Linux中内核使用Glibc库中的malloc()来实现内存分配,使用free()来实现内存释放,所以C\C++程序员可以手动管理内存,这是优势也是劣势,如果是一个经验少的程序员,会经常忘记申请或者释放内存,那么这个程序性能就很低下。所以Memached使用了内存管理器中的slap allocator分配器来实现内存申请和回收。你一启动Memached就要指定分配多大内存空间,无论用还是不用,然后使用slap allocator分配器来对这一段内存做分割,也就是切成小块,这些小块的大小不一样,主要就是为了适应不同大小的数据,也就是尽量避免内存的反复申请和释放。假设申请了一堆1K2K的和4K的内存,如果来了一个3K的数据呢?它会使用最接近且大于它的内存块,也就是4K的,那剩余的1K也就浪费了,这是无法避免的。它不会使用2K+1K的内存块,因为数据不能再分割了,不是说技术上不允许而是从性能上来说的。所以内存页到底分配多大,用户可以自己设定分配因子。


内存术语:

Page:内存页,也就是让slab用于切割的内存空间。默认的页面大小为1M,然后slab对这些页面做切割。

Chunkslab把页切割后的就叫做Chunk,用于缓存记录的空间。

Slab class:同一个种大小的chunk的被称为slabclass

Memcached协议有两种,文本格式和二进制格式。

如果1Memcached不够用,可以增加,但是因为Memcached之间没有任何联系,所以你前端就需要有一个调度器或者负载均衡器,这样有带来一个问题就是缓存命中率的事情,你的缓存在哪里下次也要访问哪里。所以加负载均衡不是问题,而是命令率是重要的事情。为了保证命中率,就有了几个算法:

HASH取余:最简单的办法根据HASH值对后端服务器数量取余。不过这种方式有一个致命的缺点就是增减服务器,那么余将会改变,有可能导致所有缓存都全局失效。

一致性HASH:也就是一个虚拟的环,232次方。根据服务器名称计算HASH值,然后用这个HASH值对232次方取余,其结果一定是在232次方之内,所以这就是服务器的位置,假设你有3个服务器,落在了这个虚拟环的3个不同位置,用户请求来了,换句话说用户请求的KEY,计算KEY的哈希值,然后也对232次方取余,这样也有一个结果,也会落到这个环上,然后根据顺时针原则去找服务器。这种算法对于服务器的增减所带来的影响比较小。但是缺点是不均衡。尤其是当节点比较少的时候,每个节点在环的位置上不一样有些彼此离得近有些却远,离得远的显然处理的请求会更多。所以可以使用虚拟节点来增加节点数量,来减少不均衡的请求。

我们之前提到Memcached的功能一半是在客户端上,一半是在服务器上,所以上面说的均衡算法是在客户端上实现的或者是在Memcached前端的负载均衡器上实现的。








      本文转自linuxjavachen  51CTO博客,原文链接:http://blog.51cto.com/littledevil/1901454 ,如需转载请自行联系原作者


相关文章
|
JavaScript 前端开发 程序员
用Unity不会几个插件怎么能行?Unity各类插件及教程推荐
话说工欲善其事必先利其器,程序员总是有一些开发利器,而对于Unity3D开发程序员来说,插件就是非常好用的利器。 今天博主,就将比较好用的插件推荐给大家,希望一起学习品鉴。
|
4月前
|
关系型数据库 MySQL 程序员
从自建MySQL到阿里云RDS:程序员的数据库减负革命
如果你正在为自建MySQL数据库的高成本运维发愁,为凌晨三点的主从同步故障告警而崩溃,为开发团队频繁索要新测试库的要求感到窒息——是时候开启一场数据库的自我救赎了。 程序员更需构建"技术敏锐度+工程落地能力+跨域协作"的三维竞争力,通过创建技术组合形成差异化优势。企业应建立持续学习机制,提供AI沙盒环境促进技术转化。
|
NoSQL Ubuntu 安全
在Ubuntu 18.04上安装和保护Redis的方法
在Ubuntu 18.04上安装和保护Redis的方法
339 0
|
9月前
|
存储 JSON API
淘宝商品详情API接口概述与JSON数据示例
淘宝商品详情API是淘宝开放平台提供的核心接口之一,为开发者提供了获取商品深度信息的能力。以下是技术细节和示例:
|
分布式计算 关系型数据库 数据处理
美柚与MaxCompute的数据同步架构设计与实践
数据处理与分析 一旦数据同步到MaxCompute后,就可以使用MaxCompute SQL或者MapReduce进行复杂的数据处理和分析。
|
机器学习/深度学习 编解码 算法
ICCV 2023 | 当尺度感知调制遇上Transformer,会碰撞出怎样的火花?
近年来,基于Transformer和CNN的视觉基础模型取得巨大成功。有许多研究进一步地将Transformer结构与CNN架构结合,设计出了更为高效的hybrid CNN-Transformer Network,但它们的精度仍然不尽如意。本文介绍了一种新的基础模型SMT(Scale-Aware Modulation Transformer),它以更低的参数量(params)和计算量(flops)取得了大幅性能的提升。
一文教你学会keil软件仿真
一文教你学会keil软件仿真
2438 1
|
存储 关系型数据库 MySQL
探讨MySQL什么情况下触发表锁,行锁
MySQL是一种流行的关系型数据库管理系统,它支持多种存储引擎,例如MyISAM和InnoDB。在并发访问数据库的环境下,为了保证数据的完整性和一致性,MySQL会使用锁机制来控制对数据的访问。MySQL中的锁分为表级锁和行级锁,它们在不同的情况下会被触发。
1657 0
|
Kubernetes 监控 算法
Kubernetes 调度器优化
Kubernetes 调度器优化
1556 0
|
弹性计算 NoSQL Shell
redis没设置密码,莫名被设置了4个sh脚本
阿里云ECS实例上未设密码的Redis服务被发现含有未知来源的SH脚本,这些脚本定时从外部URL下载并执行代码。这可能是服务器遭受恶意攻击的迹象。建议立即检查系统日志,确认是否被黑,并移除这些脚本。同时,为Redis设置密码,加强安全防护。若不确定,可寻求专业安全团队帮助。
581 2