我们之前对排行榜的数据进行缓存,由于排行榜在我们所有sql select查询里面占了30%,而且我们排行榜每小时更新一次,所以必须对数据做缓存。为了清除缓存方便,把所有的用户的数据放在同一key中,由于memcached:set的时候没有压缩数据。在测试服测试的时候,没发现问题,当上线的时候,结果发现,在线人数刚刚490人的时候,服务器load average飘到79。然后我们去掉缓存,一下子就下降到059。
所以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 1024100);//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 1921680200 -p 12000 -c 256 -P /tmp/memcachedpid
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址1921680200,
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcachedpid,
2)如果要结束Memcache进程,执行:
# kill `cat /tmp/memcachedpid`
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该
段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。
2、适用memcached的业务场景?
1)如果网站包含了访问量很大的动态网页,因而数据库的负载将会很高。由于大部分数据库请求都是读 *** 作,那么memcached可以显著地减小数据库负载。
2)如果数据库服务memcache redis 虽然也是数据库 但和mysql的作用不一样 这两种是属于key value类型的 多用于缓存使用 memcache使用内存缓存数据 redis可使用内存或硬盘 可根据自己的业务要求选择数据库毫无疑问是memcache,内存的读写速度是硬盘的不知道多少倍,所以效率要高许多倍。
但是memcache的安全性比较低,而且如果数据比较多,会非常占用内存,一般是建议在内网专门用一台服务器做memcache服务器,并切断该服务器的外网访问,只让内网访问。这样的话,保证了效率,也保证了安全性。
但是内存是比较贵的,如果数据非常大,开销比较惊人,如果因为某些原因服务器需要重新开机,缓存丢失,也比较麻烦,这个时候可以考虑用 SSD 硬盘,用文件做缓存,能省不少钱,效率也不会差太多。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)