MemCache详细解读

news2024/11/17 17:53:45

目录

一、MemCache是什么

二、MemCache特性和限制

三、MemCache实现原理

四、MemCache的Java实现实例

五、MemCache指令汇总


一、MemCache是什么

MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。MemCache是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题,而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。

另外,说一下MemCache和MemCached的区别:

1、MemCache是项目的名称,而MemCached是MemCache服务器端可以执行文件的名称;

2、memcache可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,memcached自管理这些HashTable。

二、MemCache特性和限制

在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。

Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分多个端口开启多个Memcached进程 ,

最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA

60*60*24*30控制

最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制

单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576进行控制,

它是默认的slab大小

最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,通过

settings.maxconns=1024 进行控制

跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步进方式

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

memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。

memcached作为小规模的数据分布式平台是十分有效果的。

memcached是键值一一对应,key默认最大不能超过128个字 节,value默认大小是1M,也就是一个slabs,如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中 存储,故需要修改slabs的大小,多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据。

memcached已经可以支持C/C++、Perl、PHP、Python、Ruby、Java、C#、Postgres、Chicken Scheme、Lua、MySQL和Protocol等语言客户端。

三、MemCache实现原理

首先:memcached是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作。

其次:客户端在与memcached服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符key,存取操作均通过这个key进行,保存到memcached中的对象实际上是放置内存中的,并不是保存cache文件中的,这也是为什么memcached能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

memcache采用了C/S的模式,在server端启动服务进程,在启动时可以指定监听的ip、自己的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。

memcached 的目前版本是通过C实现,采用了单进程、单线程、异步I/O,基于事件(event_based)的服务方式.使用libevent作为事件通知实现。多个Server可以协同工作,但这些 Server 之间是没有任何通讯联系的,每个Server只是对自己的数据进行管理。Client端通过指定Server端的ip地址(通过域名应该也可以)。需要缓存的对象或数据是以key->value对的形式保存在Server端。key的值通过hash进行转换,根据hash值把value传递到对应的具体的某个Server上。当需要获取对象数据时,也根据key进行。首先对key进行hash,通过获得的值可以确定它被保存在了哪台Server上,然后再向该Server发出请求。Client端只需要知道保存hash(key)的值在哪台服务器上就可以了。

memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。

说白了memcache是一种内存缓存技术,是一种缓存手段,要看情况来使用。

对于频繁读取,每次读取重复率高,数据更新频度低的数据,用memcache可以优化你的系统响应速度。

内置内存存储方式

为了提高性能,memcached中保存的数据都存储在memcache内置的内存存储空间中。由于数据仅存在于内存中,因此,重启memcached、重启操作系统就会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

memcached的内存算法

Memcached利用slab allocation机制来分配和管理内存,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值大小去匹配slab大小,找就近的slab存放,所以存在空间浪费现象。

传统的内存管理方式是,使用完通过malloc分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率。

Memcached的缓存策略

Memcached的缓存策略是LRU(最近最少使用)加上到期失效策略。当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU中,memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/vlue对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期,这样可减轻服务器的负载。

Memcached的分布式算法

当向memcached集群存入/取出key/value时,memcached客户端程序根据一定的算法计算存入哪台服务器,然后再把key/value值存到此服务器中。也就是说,存取数据分二步走,第一步,选择服务器,第二步存取数据。

 

选择服务器算法有两种,一种是根据余数来计算分布,另一种是根据散列算法来计算分布。

余数算法:先求得键的整数散列值,再除以服务器台数,根据余数确定存取服务器,这种方法计算简单,高效,但在memcached服务器增加或减少时,几乎所有的缓存都会失效。

散列算法:先算出memcached服务器的散列值,并将其分布到0到2的32次方的圆上,然后用同样的方法算出存储数据的键的散列值并映射至圆上,最后从数据映射到的位置开始顺时针查找,将数据保存到查找到的第一个服务器上,如果超过2的32次方,依然找不到服务器,就将数据保存到第一台memcached服务器上。如果添加了一台memcached服务器,只在圆上增加服务器的逆时针方向的第一台服务器上的键会受到影响。

memcached不互相通信的分布式

memcached尽管是“分布式”缓存服务器,但服务器并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎么进行分布呢?这完全取决于客户端 实现。

四、MemCache的Java实现实例

MemCache的客户端有很多第三方jar包提供了实现,其中比较好的当属XMemCached了,XMemCached具有效率高、IO非阻塞、资源耗费少、支持完整的协议、允许设置节点权重、允许动态增删节点、支持JMX、支持与Spring框架集成、使用连接池、可扩展性好等诸多优点,因而被广泛使用。这里利用XMemCache写一个简单的MemCache客户单实例:

public class MemCacheManager
{
    private static MemCacheManager instance = new MemCacheManager();
    
    /** XMemCache允许开发者通过设置节点权重来调节MemCache的负载,设置的权重越高,该MemCache节点存储的数据越多,负载越大 */
    private static MemcachedClientBuilder mcb = 
            new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:11211 127.0.0.2:11211 127.0.0.3:11211"), new int[]{1, 3, 5});
    private static MemcachedClient mc = null;
    
    /** 初始化加载客户端MemCache信息 */
    static
    {
        mcb.setCommandFactory(new BinaryCommandFactory()); // 使用二进制文件
        mcb.setConnectionPoolSize(10); // 连接池个数,即客户端个数
        try
        {
            mc = mcb.build();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        
    }
    
    private MemCacheManager()
    {
        
    }
    
    public MemCacheManager getInstance()
    {
        return instance;
    }
    
    /** 向MemCache服务器设置数据 */
    public void set(String key, int expiry, Object obj) throws Exception
    {
        mc.set(key, expiry, obj);
    }
    
    /** 从MemCache服务器获取数据 */
    public Object get(String key) throws Exception
    {
        return mc.get(key);
    }
    
    /**
     * MemCache通过compare and set即cas协议实现原子更新,类似乐观锁,每次请求存储某个数据都要附带一个cas值,MemCache
     * 比对这个cas值与当前存储数据的cas值是否相等,如果相等就覆盖老数据,如果不相等就认为更新失败,这在并发环境下特别有用
     */
    public boolean update(String key, Integer i) throws Exception
    {
        GetsResponse<Integer> result = mc.gets(key);
        long cas = result.getCas();
        // 尝试更新key对应的value
        if (!mc.cas(key, 0, i, cas))
        {
            return false;
        }
        return true;
    }
}

五、MemCache指令汇总

MemCache命令参数:

命    令作    用
get返回Key对应的Value值
add 添加一个Key值,没有则添加成功并提示STORED,有则失败并提示NOT_STORED
set  无条件地设置一个Key值,没有就增加,有就覆盖,操作成功提示STORED
replace 按照相应的Key值替换数据,如果Key值不存在则会操作失败 
stats返回MemCache通用统计信息(下面有详细解读)
stats items返回各个slab中item的数目和最老的item的年龄(最后一次访问距离现在的秒数)
stats slabs返回MemCache运行期间创建的每个slab的信息(下面有详细解读)
version返回当前MemCache版本号
flush_all清空所有键值,但不会删除items,所以此时MemCache依旧占用内存
quit关闭连接

MemCache服务器的基本信息参数:

参  数  名作      用
pidMemCache服务器的进程id 
uptime服务器已经运行的秒数
time服务器当前的UNIX时间戳 
versionMemCache版本 
pointer_size当前操作系统指针大小,反映了操作系统的位数,64意味着MemCache服务器是64位的 
rusage_user进程的累计用户时间 
rusage_system 进程的累计系统时间 
curr_connections  当前打开着的连接数
total_connections  当服务器启动以后曾经打开过的连接数
connection_structures 服务器分配的连接构造数 
cmd_get get命令总请求次数 
cmd_setset命令总请求次数 
cmd_flush flush_all命令总请求次数 
get_hits 总命中次数,重要,缓存最重要的参数就是缓存命中率,以get_hits / (get_hits + get_misses)表示,比如这个缓存命中率就是99.2% 
get_misses 总未命中次数 
auth_cmds 认证命令的处理次数 
auth_errors 认证失败的处理次数 
bytes_read 总读取的字节数
bytes_written 总发送的字节数 
 limit_maxbytes分配给MemCache的内存大小(单位为字节) 
accepting_conns 是否已经达到连接的最大值,1表示达到,0表示未达到
listen_disabled_num 统计当前服务器连接数曾经达到最大连接的次数,这个次数应该为0或者接近于0,如果这个数字不断增长, 就要小心我们的服务了
threads 当前MemCache总线程数,由于MemCache的线程是基于事件驱动机制的,因此不会一个线程对应一个用户请求 
bytes 当前服务器存储的items总字节数
current_items 当前服务器存储的items总数量 
total_items 自服务器启动以后存储的items总数量 

stats slab指令解读:

参  数  名作      用
chunk_size当前slab每个chunk的大小,单位为字节
chunks_per_page每个page可以存放的chunk数目,由于每个page固定为1M即1024*1024字节,所以这个值就是(1024*1024/chunk_size)
total_pages分配给当前slab的page总数
total_chunks当前slab最多能够存放的chunk数,这个值是total_pages*chunks_per_page
used_chunks已经被分配给存储对象的chunks数目
free_chunks曾经被使用过但是因为过期而被回收的chunk数
free_chunks_end新分配但还没有被使用的chunk数,这个值不为0则说明当前slab从来没有出现过容量不够的时候
mem_requested当前slab中被请求用来存储数据的内存空间字节总数,(total_chunks*chunk_size)-mem_requested表示有多少内存在当前slab中是被闲置的,这包括未用的slab+使用的slab中浪费的内存
get_hits当前slab中命中的get请求数
cmd_set当前slab中接收的所有set命令请求数
delete_hits当前slab中命中的delete请求数
incr_hits当前slab中命中的incr请求数
decr_hits当前slab中命中的decr请求数
cas_hits当前slab中命中的cas请求数
cas_badval当前slab中命中但是更新失败的cas请求数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【李宏毅】自注意力机制self-attention

课件网址&#xff1a; 【機器學習2021】自注意力機制 (Self-attention) (上) - YouTube 【機器學習2021】自注意力機制 (Self-attention) (下) - YouTube 这两章课程主要在讲self-attention是怎么做的&#xff0c;对应的矩阵操作是什么&#xff0c;以及为什么要这样处理。 …

MySQL_第13章_约束

第13章_约束 1. 约束(constraint)概述 1.1 为什么需要约束 数据完整性&#xff08;Data Integrity&#xff09;是指数据的精确性&#xff08;Accuracy&#xff09;和可靠性&#xff08;Reliability&#xff09;。它是防止数据库中存在不符合语义规定的数据和防止因错误信息…

SQL Server 意向锁

SQL Server 数据库引擎使用意向锁来确保共享锁&#xff08;S 锁&#xff09;或排他锁&#xff08;X 锁&#xff09;放置在锁层次结构的底层资源上。 意向锁之所以命名为意向锁&#xff0c;是因为在较低级别锁前可获取它们&#xff0c;因此会通知意向将锁放置在较低级别上。 意向…

fastadmin后台用户管理中余额记录显示

查询明细JS代码 {field: buttons,width: "200px",title: __(查询明细),table: table,events: Table.api.events.operate,buttons: [{name: money,text: __(余额),title: __(余额),classname: btn btn-xs btn-success btn-dialog,icon: fa fa-database,url: user/us…

按照条件向Spring容器中注册bean

1.Conditional注解概述 Conditional注解可以按照一定的条件进行判断&#xff0c;满足条件向容器中注册bean&#xff0c;不满足条件就不向容器中注册bean。 package org.springframework.context.annotation;import java.lang.annotation.Documented; import java.lang.annota…

数据转换器的工程师指南

数据转换是连接模拟和数字世界的重要电路&#xff0c;在大多数嵌入式系统中&#xff0c;您都会发现模拟到数字转换和数字到模拟转换&#xff0c;从物联网&#xff08;IoT&#xff09;传感器到无线网络&#xff0c;从智能家居自动化到电源&#xff0c;数据转换无处不在。在本文中…

Git在工作中的使用流程

Git中的分支 master分支&#xff1a;所有用户可见的正式版本&#xff0c;都从master发布&#xff08;也是用于部署生产环境的分支&#xff0c;确保master分支稳定性&#xff09;。主分支作为稳定的唯一代码库&#xff0c;不做任何开发使用。master 分支一般由develop以及hotfi…

自学黑客/网络安全,三个月究竟能学到多少知识?

现在可以看到很多标题都是三个月零基础转行网络安全&#xff0c;三个月成为网络安全工程师月入15K&#xff0c;还有很多一系列类似吸引人的标题&#xff0c;那这些话是不是真实情况呢&#xff1f;那我们就来整理一下这三个月可以学到什么&#xff0c;然后再来看根据三个月的学习…

PyTorch训练提升

1. 更换学习率schedule 学习率 schedule 的选择对模型的收敛速度和泛化能力有很大的影响。Leslie N. Smith 等人在论文《Cyclical Learning Rates for Training Neural Networks》、《Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates 》…

web前端 --- CSS(1)

CSS&#xff08;Cascade Style Sheet&#xff09; --- 级联样式表&#xff08;1&#xff09; <head><style>选择器{属性名&#xff1a;属性值;属性名&#xff1a;属性值;}</style> </head>属性名&#xff1a;修饰对象的属性&#xff08;样式&#xff…

docker ——安装tomcat

环境&#xff1a;centos7 安装tomcat 第一步&#xff1a;联网 第二步&#xff1a;开启docker systemctl start docker 第三步&#xff1a;拉取镜像 docker pull tomcat //下载tomcat镜像 docker pull tomcat 第四步&#xff1a;创建容器 docker run -d …

Solr之查询页面,索引,SolrJ

文章目录 1 Solr查询1.1 查询页面1.1.1 基本查询1.1.2 Solr检索运算符1.1.3 高亮1.1.4 分组1.1.4.1 分组&#xff08;Field Facet&#xff09;1.1.4.2 分组&#xff08;Date Facet&#xff09; 1.2 创建索引文件1.2.1 使用Post上传文件1.2.1.1 Linux下使用1.2.1.1.1 索引XML1.2…

BDCC- 数据湖体系

文章目录 数据湖的概念数据湖 vs 数据仓库 vs Lakehouse① 业界进展&#xff08;Databricks 2.0&#xff09;-湖上建仓② 业界进展&#xff08;Snowflake EDW 2.0&#xff09;-仓外挂湖 LakeHouse 的演进&#xff08;1&#xff09;Lakehouse 的演进路线&#xff08;2&#xff0…

基于matlab的长短期神经网络LSTM的电力负荷预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的电力负荷预测 MATALB代码 效果图 结果分析 展望 参考论文 背影 电力负荷预测的实质是从已知的电力系统&#xff0c;经济&#xff0c;社会&#xff0c;气象等情况出发&#xff0c;根据历史负荷变化规律…

CSDN 周赛 48 期

CSDN 周赛 48 期 工作日参赛1、题目名称&#xff1a;最后一位2、题目名称&#xff1a;天然气订单3、题目名称&#xff1a;排查网络故障4、题目名称&#xff1a;运输石油小结 工作日参赛 说实话&#xff0c;今天是周末&#xff0c;但是今天也是工作日&#xff0c;老顾已经预计到…

Tossim 教程

系列文章目录 TinyOS 系列文章【一】&#xff1a;TinyOS 配置教程 TinyOS 系列文章【二】&#xff1a;Tossim 教程 文章目录 系列文章目录前言1. Tossim 简介2. TOSSIM 仿真2.1. 编译 TOSSIM2.2. 基于 Python 的仿真2.3. 调试语句2.4. 网络配置 总结 前言 本文主要用于记录在…

打破广播电视行业前端摄录设备依赖进口局面,BOSMA博冠全新国产8K摄像机重新定义广播世界

《世界广播电视》杂志曾经预测&#xff0c;2025年全球将有1000个超高清频道在播出。中国广电总局提出&#xff0c;到2025年底&#xff0c;标清频道基本关停&#xff0c;省级电视台要基本具备超高清电视制播能力。视频超高清已成为一个国际趋势。中国有14亿人口&#xff0c;是全…

蓝牙设备节点协议栈基础知识

蓝牙设备节点协议栈基础知识 一&#xff1a;TTY&#xff08;虚拟控制台&#xff0c;串口以及伪终端设备组成的终端设备&#xff09; Android/Linux 几乎所有的外设都以”设备节点”的形式存在 例如PC插入串口,会识别成COM1/COM2…在linux下面则以/dev/ttyXXX的形式存在,如/dev…

国家信息安全水平考试中NISP一级网络安全证书介绍

1、什么是NISP? 国家信息安全水平考试&#xff08;National Information Security Test Program&#xff0c;简称NISP&#xff09;&#xff0c;是由中国信息安全测评中心实施培养国家网络空间安全人才的项目。 2、考取NISP一级认证的同学就业岗位和薪资标准有那些呢&#xf…

Docker创建镜像,建立网桥,容器制作虚拟机

新建基础镜像&#xff0c;希望能够SSH&#xff0c;安装java&#xff0c;用户&#xff0c;声明22端口等等&#xff1b;拷贝基础hadoop安装文件 新建Dockerfile FROM centos:7.9.2009RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/local…