Memcached有两个核心组件组成:服务端(ms)和客户端(mc),在一个memcached的查询中,mc先通过计算key的hash值来 确定kv对所处在的ms位置。当ms确定后,客户端就会发送一个查询请求给对应的ms,让它来查找确切的数据。因为这之间没有交互以及多播协议,所以 memcached交互带给网络的影响是最小化的。
举例说明:考虑以下这个场景,有三个mc分别是X,Y,Z,还有三个ms分别是A,B,C:
设置kv对
X想设置key=”foo”,value=”seattle”
X拿到ms列表,并对key做hash转化,根据hash值确定kv对所存的ms位置
B被选中了
X连接上B,B收到请求,把(key=”foo”,value=”seattle”)存了起来
获取kv对
Z想得到key=”foo”的value
Z用相同的hash算法算出hash值,并确定key=”foo”的值存在B上
Z连接上B,并从B那边得到value=”seattle”
其他任何从X,Y,Z的想得到key=”foo”的值的请求都会发向B
Memcached服务器(ms)
内存分配
默认情况下,ms是用一个内置的叫“块分配器”的组件来分配内存的。舍弃c++标准的malloc/free的内存分配,而采用块分配器的主要目的 是为了避免内存碎片,否则操作系统要花费更多时间来查找这些逻辑上连续的内存块(实际上是断开的)。用了块分配器,ms会轮流的对内存进行大块的分配,并 不断重用。当然由于块的大小各不相同,当数据大小和块大小不太相符的情况下,还是有可能导致内存的浪费。
同时,ms对key和data都有相应的限制,key的长度不能超过250字节,data也不能超过块大小的限制 --- 1MB。
因为 mc所使用的hash算法,并不会考虑到每个ms的内存大小。理论上mc会分配概率上等量的kv对给每个ms,这样如果每个ms的内存都不太一样,那可能 会导致内存使用率的降低。所以一种替代的解决方案是,根据每个ms的内存大小,找出他们的最大公约数,然后在每个ms上开n个容量=最大公约数的 instance,这样就等于拥有了多个容量大小一样的子ms,从而提供整体的内存使用率。
缓存策略
当ms的hash表满了之后,新的插入数据会替代老的数据,更新的策略是LRU(最近最少使用),以及每个kv对的有效时限。Kv对存储有效时限是在mc端由app设置并作为参数传给ms的。
同时ms采用是偷懒替代法,ms不会开额外的进程来实时监测过时的kv对并删除,而是当且仅当,新来一个插入的数据,而此时又没有多余的空间放了,才会进行清除动作。
Memcached客户端(mc)
Memcached客户端有各种语言的版本供大家使用,包括java,c,php,.net等等。
大家可以根据自己项目的需要,选择合适的客户端来集成。
缓存式的Web应用程序架构
有了缓存的支持,我们可以在传统的app层和db层之间加入cache层, 每个app服务器都可以绑定一个mc,每次数据的读取都可以从ms中取得,如果没有,再从db层读取。而当数据要进行更新时,除了要发送update的 sql给db层,同时也要将更新的数据发给mc,让mc去更新ms中的数据。
相关推荐
Memcached处理的数据分为两类: - **文本行**:用于发送命令或接收服务器响应。 - **非结构化数据**:用于存储和检索的实际数据。 ##### 3. 结束标记 所有文本行和非结构化数据都以`\r\n`结尾。需要注意的是,非...
- **命令序列化与反序列化**:因为Memcached处理的是键值对,所以数据需要被序列化成字节流,然后在客户端和服务器之间传输。这可能涉及到JSON、protobuf或其他序列化格式。 - **Key-Value操作**:基本的get、set、...
4. **序列化库**:Memcached处理的对象通常是字节流,因此可能需要序列化和反序列化库,如java自带的序列化或者Google的Protocol Buffers。 **集成步骤** 1. **下载所需jar包**:从官方或可靠的第三方源获取所需的...
2. **配置编译**:使用`./configure --enable-threads`命令进行配置,其中`--enable-threads`选项是开启线程支持,这对于提高Memcached处理并发请求的能力至关重要。 3. **编译**:运行`make`命令进行编译。 4. **...
这种方式可以显著提高Memcached处理大量并发连接的能力。 ##### 自主内存管理 Memcached采用了一种称为“slab allocator”的内存分配机制,它可以预先分配不同大小的内存块,并根据键值对的大小自动选择合适的内存...
libevent允许Memcached处理大量的并发连接请求,但这种处理能力是有上限的,一般情况下最大连接数为200个,这一数值可以通过配置进行调整。 ##### 1.2 Memcached的内存管理机制 - **内存分配与管理**:Memcached...
本文记录了我在生产环境下使用memcached实现tomcat session会话共享解决方案的实施完整过程,验证可用!有需要的请拿走.
5. **序列化与反序列化**:由于Memcached处理的是字节流,所以非基本类型的数据需要序列化。spymemcached提供了一些内置的序列化器,如`BinarySerialization`,但你也可以自定义序列化器。 6. **并发与性能**:...
libevent支持高效的事件驱动编程模型,允许Memcached处理大量并发连接。理论上,它可以处理无限多的连接,但实际上受操作系统限制。 2. **libevent的安装过程**: - 下载libevent源码包,例如`libevent-2.0.16-...
7. **数据序列化和反序列化**:memcached处理的是二进制数据,客户端可能集成JSON、pickle或其他序列化库,用于在Python对象和memcached之间的转换。 8. **扩展性**:客户端库可能具备集群支持,能够透明地处理多台...
在64位Windows系统上运行Memcached,可以支持超过4GB的内存,这在处理大量数据时非常有用。64位版本可以更有效地管理和利用现代服务器的大量RAM,允许Memcached存储更多缓存数据,提高整体性能。同时,由于64位架构...
Linux安装Memcached问题处理 标题:Linux安装Memcached问题处理,可能有些乱,但是能看懂 Memcached 是一个高性能的、分布式的内存对象缓存系统,它可以减少数据库负载,提升访问速度。在动态应用中,Memcached ...
这通常涉及到配置一个upstream模块,指定Tomcat服务器的IP和端口,然后在HTTP块或Server块中添加`proxy_pass`指令,设置其通过Memcached处理Session。 最后,`nginx-1.6.2`目录包含了Nginx的安装包,你需要根据官方...
在安装memcached时,libevent作为依赖库,因为它提供了异步事件处理机制,这对于memcached的高效运行至关重要。下载libevent的稳定版本,例如`libevent-2.0.21-stable.tar.gz`,解压并按照以下步骤编译和安装: 1. ...
**memcached缓存处理** **一、什么是memcached** `memcached`是一个高性能、分布式内存对象缓存系统,用于在动态系统中减少数据库负载。它通过将数据存储在内存中来加速读取操作,而不是每次请求都去查询数据库。...
libevent 提供了一种方式来处理多个长时间运行的连接,而无需创建大量的线程或进程。 安装 libevent: ```bash sudo apt-get install libevent-dev ``` 重新配置并编译 Memcached,指定使用 libevent: ```bash ...
Python-memcached是Python语言的一个库,用于与Memcached缓存系统进行交互。Memcached是一种高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。Python-memcached库则...
Memcached利用libevent来处理网络I/O事件,使得它能够高效地处理大量并发请求。 4. **内存存储**:Memcached将所有数据存储在内存中,不涉及磁盘操作,因此读写速度非常快。然而,这也意味着一旦服务重启或服务器...