【修真院java小课堂】为什么要使用memcache?memcache有什么作用?

大家好,我是来自郑州分院的第10期java学员,今天我要讲为什么要使用memcache?memcache有什么作用?例行公事,先来背景介绍

 

背景介绍

在Web服务开发中,服务端缓存是服务实现中所常常采用的一种提高服务性能的方法。其通过记录某部分计算结果来尝试避免再次执行得到该结果所需要的复杂计算,从而提高了服务的运行效率。因此一些大规模的Web应用常常构建一个庞大的服务端缓存。而它们所常使用的就有Memcached。

 

知识剖析

Memcache是danga.com的一个开源项目,这是官方简介。

 

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

 

有时候我们会看到memcached

MemCache是这个项目的名称,而MemCached是服务器端的主程序名称。

 

Memcached工作原理

MemCached采用了C/S架构,在Server端启动后,以守护程序的方式,监听客户端的请求。启动时可以指定监听的IP(服务器的内网ip/外网ip)、端口号(所以做分布式测试时,一台服务器上可以启动多个不同端口号的MemCached进程)、使用的内存大小等关键参数。一旦启动,服务就会一直处于可用状态。

为了提高性能,MemCached缓存的数据全部存储在MemCached管理的内存中,所以重启服务器之后缓存数据会清空,不支持持久化。

 

Memcached内存分配方式

首先我们来看一看Memcached的内存管理模型。通常情况下,一个内存管理算法所最需要考虑的问题就是内存的碎片化(Fragmentation):在长时间地分配及回收之后,被系统所使用的内存将趋向于散落在不连续的空间中。这使得系统很难找到连续内存空间,一方面增大了内存分配失败的概率,另一方面也使得内存分配工作变得更为复杂,降低了运行效率。

为了解决这个问题,Memcached利用slab allocation机制来分配和管理内存,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值大小去匹配slab大小,找就近的slab存放,但这样也会有弊端,容易造成空间浪费现象。

可以减小slab块的递增倍数来减少内存浪费

 

常见问题

Memcached的分布式算法

余数算法:

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

散列算法:

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

 

扩展思考

memcached的分布式代理软件

Memagent

Magent 是一款开源的 Memcached 代理服务器软件

https://code.google.com/archive/p/memagent/

Repcached

repcached是日本人开发的基于Memcached的一个patch版本,实现Memcached的复制功能,它支持多个Memcached之间相互复制,可以解决Memcached的容灾问题。它所构建的主从方案是一个单主单从的方案,不支持多主多从。但是,它的特点是,主从两个节点可以互相读写,从而可以达到互相同步的效果。

缺点:

1)只支持一主一从备份,单对单

2)冗余备份,占用内存较多

 

Memcached Client目前有3种:

Memcached Client for Java

SpyMemcached

XMemcached

Memcached Client for Java 比 SpyMemcached更稳定、更早、更广泛;

SpyMemcached 比 Memcached Client for Java更高效;

XMemcached 比 SpyMemcache并发效果更好。

 

参考文献

https://segmentfault.com/a/1190000012950110

https://www.cnblogs.com/loveis715/p/4681643.html

 

更多讨论

Q1:memcached命令add和set的区别

A1:set 命令用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。

使用add添加新的键值对,仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的

值将仍然保持不变,并且将获得响应 NOT_STORED。

 

Q2:memcache的内存回收方式

A2:当数据容量用完MemCached分配的内存后,就会基于LRU(Least Recently Used)算法清理失效的缓存数据(放入数据时可设置失效时间),或者清理最近最少使用的缓存数据,然后放入新的数据。

 

Q3:memcache 每个key最大长度是多少?

A3:Key最大为250个字节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值