最近一直在捣腾memcached的优化问题,由于我们的memcached上的比较匆忙,导致实际中只有67%的命中率,实在不理想,用memcached-tool工具查看,有几个slabs居然还没有满,但是最近我们放数据进去时过一会就get misses了。显然,这个问题是由于我们之前上memcached的时候没有预先评估存入的items的长度,启动服务器时没有有效调整slabs的增长因子导致的。于是,首先,我就决定看下memcachd服务断源码,看看服务器端是怎么算这个items的长度的。下面是主要的源代码(Version1.3.X):
static size_t item_make_header(const uint8_t nkey, const int flags, const int nbytes, 00081 char *suffix, uint8_t *nsuffix)
{
*nsuffix = (uint8_t ) snprintf(suffix, 40, " %d %d\r\n" , flags, nbytes - 2);
return sizeof (item ) + nkey + *nsuffix + nbytes;
}
其中nkey表示items的键长,*nsuffix表示items的后缀长度,nbytes表示items中value的长度,至于size(item)这个的长度在32位机中为32,在64位机中为48。实际使用中由于每个键值的后面要加上'\0'作为结尾,value后面要加上'\r\n'结尾,那么最后的结果要加上3个字节。下面举出一些具体的测试列子(java 客户端,键值统一为:"DM_20100419"):
(1)、byte=1。set DM_20100419 1 0 1。按照上面的规则计算公式为32+(11+1)+6+(1+2)=53。
(2)、创建一个对象(一定要实现序列化接口),set DM_20100419 8 0 43。同样,按照上面的规则得到计算结果为:32+(11+1)+7+(43+2)=96.
(3)、double=1。 set DM_20100419 512 0 8。按照规则计算32+(11+1)+8+(8+2)=62.
经过服务器端验证均与上述计算结果吻合。谨以此与大家分享,希望能够给大家一点帮助。
相关推荐
Memcache 学习文档 for Java Demo Memcache 是一套分布式的高速缓存系统,由 LiveJournal 的 Brad Fitzpatrick 开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站...
Memcache是一种广泛使用的分布式内存缓存系统,它能够显著提升Web应用的性能,通过将数据存储在内存中,减少对数据库的访问,从而缩短响应时间。在PHP中,我们可以使用`Memcache`扩展来与Memcache服务器进行交互。 ...
Memcache是一种高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用的响应速度。在.NET环境中,开发人员通常使用C#客户端来与Memcache服务器进行交互。本篇文章将详细介绍如何在C#中使用Memcache...
- **内存碎片**:适当控制item的大小,防止内存碎片影响性能。 - **分布式负载均衡**:合理分配Memcached实例,确保负载均衡。 总的来说,Memcached作为一款高效的缓存工具,是解决高并发场景下数据库性能瓶颈的...
每个slab包含多个相同大小的chunk,chunk用于存储item结构体及对应的键值对。slab分为多个类别(slab class),每个类别的chunk大小按特定因子(默认为1.25)递增。这样,Memcache能够更有效地管理内存,减少碎片并...
Memcache 限制了键的长度和单个 item 的大小,更适合轻量级的缓存需求。而 Redis 没有这些限制,它可以处理更大、更复杂的数据。 最后,Redis 和 Memcache 运行环境和底层实现也有所不同。Redis 目前主要支持 Linux...
foreach ($items as $number => $item) { $str = $memcache_obj->getExtendedStats('cachedump', $number, 0); $line = $str[$option]; if (is_array($line) && count($line) > 0) { foreach ($line as $key ...
slab将内存划分为不同的chunk,每个chunk大小相同,对应一个特定的item。这样,当存储和检索数据时,可以快速找到适合大小的chunk,提高内存利用率。 3. **数据结构**:memcached中的数据以键值对的形式存在,键和...
本文将基于"memcache的tcp_udp_内存流程图.pdf"这一资料进行详细介绍。 #### 二、系统启动流程与libevent的使用 Memcached在启动过程中使用libevent库来管理事件。libevent是一个高性能的事件处理库,用于实现网络...
item := &memcache.Item{Key: "mykey", Value: []byte("myvalue")} mc.Set(item) val, err := mc.Get("mykey") if err != nil { panic(err) } println(string(val.Value)) } ``` 四、应用场景与优化 1. 高...
mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")}) it, err := mc.Get("foo") ...}完整文档,请参阅参见https://pkg.go.dev/github.com/bradfitz/gomemcache/memcache或者运行$ godoc github....
set value of item with key 'var_key', using on-the-fly compression expire time is 50 seconds */ $memcache_obj->set('var_key', 'some really big variable', MEMCACHE_COMPRESSED, 50); echo $memcache_...
`Memcache.pptx`的主题聚焦于一个特定的问题:使用`spymemcached`客户端时遇到的`BufferOverflowException`。这个异常通常表明在尝试存储数据到Memcached时,分配的缓冲区空间不足以容纳数据,从而导致了溢出。 `...
关于 这是Go编程语言( )的内存缓存客户端库。 正在安装 使用go get $ go get github.com/bradfitz/gomemcache/memcache 执行此命令后,即可使用... mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")})
一个RSS文件通常包含频道(Channel)和条目(Item)两部分。频道是RSS文档的容器,包含了RSS feed的基本信息,如标题、描述、链接等;条目则是具体的文章或内容,每个条目都有自己的标题、描述、链接和发布日期等...
- **优化配置**:了解item大小分布可以帮助调整 `Memcached` 的内存分配策略,例如设置合适的 `max_item_size` 参数。 - **容量规划**:对于预估未来存储需求,统计当前缓存中item的平均大小和数量很有帮助。 **与...
<event obj="memcache" info="memcache used than 90%">PHP1</event> <event obj="cpu" info="cpu used than 95%">PHP2</event> <event obj="disk" info="disk is removed">PHP3</event> ``` 接下来,我们讨论...
item := &memcache.Item{Key: "key", Value: []byte("value"), Expiration: 0} err := mc.Set(item) if err != nil { // handle error } ``` 5. **配置文件解析**: 通常,我们可以使用`github....