目录
编辑
第2章:Memcached工作原理
2.1 数据存储与访问
2.2 分布式架构
2.3 数据过期机制
第2章:Memcached工作原理
2.1 数据存储与访问
Memcached是一种键值存储系统,其中数据以键值对的形式存储。键是用于定位数据的唯一标识符,而值则是要存储的数据本身。在Memcached中,键是一个字符串,长度通常限制在250字节以内,而值则可以是任意格式的数据,如字符串、整数、浮点数或序列化的复杂数据结构,但大小通常限制在1MB以内。
当应用程序需要存储数据时,它通过Memcached客户端库发送一个命令到Memcached服务器,指定要存储的键和对应的值。如果存储成功,Memcached会返回确认信息。如果数据已存在,Memcached将覆盖旧值。
对于数据访问,应用程序通过发送带有相应键的命令来请求数据。Memcached使用键在内存中查找对应的值,并将其返回给客户端。如果找不到数据,Memcached将返回一个“未找到”消息。
操作 | 描述 |
---|---|
存储数据 | 应用程序通过客户端发送set 命令,包含键、值和可选的生存时间(TTL)。 |
存储确认 | Memcached返回STORED 确认数据已存储,或返回错误代码。 |
获取数据 | 应用程序使用get 命令,传入键,Memcached查找键并返回对应的值。 |
获取确认 | Memcached返回值或NOT_FOUND 错误,表示键不存在或已过期。 |
删除数据 | 应用程序使用delete 命令,传入键,Memcached从内存中移除对应的键值对。 |
删除确认 | Memcached返回DELETED 确认数据已被删除,或NOT_FOUND 表示键不存在。 |
替换数据 | 如果键已存在,使用replace 命令替换现有值。 |
替换确认 | Memcached返回REPLACE 确认数据已被替换,或NOT_STORED 表示键不存在。 |
更新数据 | 使用increment 或decrement 命令在数值型值上进行原子性加减操作。 |
更新确认 | Memcached返回更新后的值或错误代码,如NOT_STORED 或VALUE 。 |
2.2 分布式架构
Memcached的分布式架构是其最强大的特性之一。在一个分布式环境中,数据被分割并存储在多台Memcached服务器上。这种架构不仅提高了数据的读写速度,还增加了系统的容错性和可扩展性。
当数据存储时,Memcached使用哈希算法(通常是CRC32)来计算键的哈希值,然后根据这个哈希值决定数据应该存储在哪一台服务器上。这称为哈希环技术,确保了数据的均匀分布。
客户端使用相同的哈希算法来确定数据的位置,从而可以直接向正确的服务器发出请求。这种设计消除了中心化的瓶颈,提高了系统的整体性能。
如果某个服务器宕机或离线,Memcached的分布式特性意味着其他服务器仍然可以提供服务,虽然可能暂时无法访问存储在故障服务器上的数据。为了提高可用性,可以采用复制或分片策略,但这通常需要更复杂的架构和管理。
特性 | 描述 |
---|---|
哈希环 | 使用CRC32或其他哈希算法将键映射到特定的服务器上,实现数据的均匀分布。 |
节点选择 | 根据哈希值确定数据所在的节点,客户端直接向该节点请求数据。 |
负载均衡 | 数据分布在多台服务器上,每台服务器承担相似的请求负载。 |
容错机制 | 如果某节点不可用,请求将重定向至其他节点,可能暂时无法访问特定数据。 |
扩展性 | 可以通过添加更多节点来扩展缓存容量和吞吐量,无需停机。 |
分布式更新 | 当数据更新时,必须确保所有相关节点上的缓存数据同步更新,以避免数据不一致。 |
节点加入/离开 | 节点加入或离开集群时,数据需要重新分配以保持负载均衡。 |
一致性哈希 | 在节点变化时,使用一致性哈希算法尽量减少数据迁移量,减少系统中断时间。 |
2.3 数据过期机制
Memcached支持数据的过期机制,这是通过设置一个生存时间(TTL,Time To Live)来实现的。当数据存储时,可以指定一个过期时间,单位为秒。一旦过期时间到达,数据将从缓存中自动删除,以便释放内存空间给新的数据。
过期时间的设定是可选的,如果没有指定,数据将一直保留在缓存中,直到达到内存容量限制或显式删除。这种机制有助于防止缓存中存储过多的过时数据,同时也可以用来实现临时的缓存策略。
值得注意的是,Memcached的数据过期不是实时的。在过期时间到达时,数据并不会立即被物理删除,而是标记为“过期”。只有当缓存空间不足,需要为新数据腾出空间时,Memcached才会清理过期的数据。这一过程称为“最近最少使用”(LRU,Least Recently Used)淘汰策略。
机制 | 描述 |
---|---|
生存时间(TTL) | 数据项在内存中存活的时间,以秒为单位,过期后数据自动从缓存中移除。 |
过期检查 | Memcached定期检查数据项是否过期,过期的数据项会被标记为无效。 |
LRU淘汰 | 当缓存空间不足时,采用最近最少使用(LRU)策略淘汰过期或最久未使用的数据项。 |
清理策略 | 清理过期数据项的过程是非实时的,通常在内存压力大时触发,以腾出空间给新的数据项。 |
异步过期 | 数据项不会在过期时间到达的那一刻立即被删除,而是等待下一次清理周期才真正从缓存中移除。 |
手动清除 | 应用程序可以显式地使用flush_all 命令清除所有数据,或使用delete 命令清除特定的数据项。 |