Memcache 连接超时 什么原因

Memcache 连接超时 什么原因,第1张

Memcached存储单个item最大数据是在1MB内,如果数据超过1M,存取set和get是都是返回false,而且引起性能的问题。

我们之前对排行榜的数据进行缓存,由于排行榜在我们所有sql select查询里面占了30%,而且我们排行榜每小时更新一次,所以必须对数据做缓存。为了清除缓存方便,把所有的用户的数据放在同一key中,由于memcached:set的时候没有压缩数据。在测试服测试的时候,没发现问题,当上线的时候,结果发现,在线人数刚刚490人的时候,服务器load average飘到7.9。然后我们去掉缓存,一下子就下降到0.59。

所以Memcahce不适合缓存大数据,超过1MB的数据,可以考虑在客户端压缩或拆分到多个key中。大的数据在进行load和uppack到内存的时候需要花很长时间,从而降低服务器的性能。

Memcached支持最大的存储对象为1M。这个值由其内存分配机制决定的。

memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重 *** 作系统内存管理器的负担,最坏的情况下,会导致 *** 作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题.

今天(2012-03-16)我们重新测试了memcached ::set的数据大小。可能是我们用php的memcached扩展是最新版,set数据的时候是默认压缩的。set 数据:

$ac = new memcahed()

$data = str_repeat('a', 1024* 1024)//1M的数据

$r = $ac->set('key', $data, 9999)

//或者

$data = str_repeat('a', 1024* 1024*100)//100M的数据

$r = $ac->set('key', $data, 9999)

不论是1M的数据还是100M的数据,都能set成功。后来我发现,memcachedset数据的时候是默认压缩的。由于这个这个是重复的字符串,压缩率高达1000倍。因此100M的数据压缩后实际也就100k而已。

当我设置:

$ac->setOption(memcahed::OPT_COMPRESSION,0)//不压缩存储数据。

$data = str_repeat('a', 1024* 1024)//1M数据

$r = $ac->set('key', $data, 9999)//1M的数据set不成功。

也就是说memcached server不能存储超过1M的数据,但是经过客户端压缩数据后,只要小于1M的数据都能存储成功。

memcached相关知识:

1、memcached的基本设置

1)启动Memcache的服务器端

# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

-d选项是启动一个守护进程,

-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,

-u是运行Memcache的用户,我这里是root,

-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,

-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,

-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,

-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

2)如果要结束Memcache进程,执行:

# kill `cat /tmp/memcached.pid`

哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该

段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。

2、适用memcached的业务场景?

1)如果网站包含了访问量很大的动态网页,因而数据库的负载将会很高。由于大部分数据库请求都是读 *** 作,那么memcached可以显著地减小数据库负载。

2)如果数据库服务

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。

下载Windows的Server端

安装Memcache Server(也可以不安装直接启动)

1. 下载memcached的windows稳定版,解压放某个盘下面,比如在c:\memcached

2. 在CMD下输入 "c:\memcached\memcached.exe -d install" 安装.

3. 再输入:"c:\memcached\memcached.exe -d start" 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。

如果下载的是二进制的版本,直接运行就可以了,可以加上参数来加以设置。

常用设置:

-p <num> 监听的端口

-l <ip_addr> 连接的IP地址, 默认是本机

-d start 启动memcached服务

-d restart重起memcached服务

-d stop|shutdown 关闭正在运行的memcached服务

-d install安装memcached服务

-d uninstall 卸载memcached服务

-u <username>以<username>的身份运行 (仅在以root运行的时候有效)

-m <num> 最大内存使用,单位MB。默认64MB

-M内存耗尽时返回错误,而不是删除项

-c <num> 最大同时连接数,默认是1024

-f <factor> 块大小增长因子,默认是1.25

-n <bytes> 最小分配空间,key+value+flags默认是48

-h显示帮助

首先可以在多台服务器装memcached,启动时分别指定容量和端口

访问时采用集群方式访问,只需要spring配置文件里面配置即可

value可以放任何对象,包括集合

每个键值的生命周期可以在放入时独立设置

类库可以用spymemcached

数据更新方式可以在后台的定时任务中执行

下面是spring mvc中配置:

<bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean">

<property name="servers" value="服务器A:端口,服务器B:端口,服务器C:端口" />

<property name="protocol" value="BINARY" />

<property name="transcoder">

<bean class="net.spy.memcached.transcoders.SerializingTranscoder">

<property name="compressionThreshold" value="1024" />

</bean>

</property>

<property name="opTimeout" value="2000" />

<property name="timeoutExceptionThreshold" value="1998" />

<property name="locatorType" value="CONSISTENT" />

<property name="hashAlg">

<value type="net.spy.memcached.DefaultHashAlgorithm">KETAMA_HASH</value>

</property>

<property name="failureMode" value="Redistribute" />

<property name="useNagleAlgorithm" value="false" />

</bean>


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/sjk/10100800.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存