`
lobin
  • 浏览: 425704 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

memcached

 
阅读更多

1、分布式缓存系统 memcached 协议

2、。。。

 

 

Memcached是一个开源的高性能分布式内存对象缓存系统,天然通用。但旨在通过减轻数据库负载来加快动态Web应用程序的使用。

 

Memcached 是一个基于内存的key-value结构数据的存储,适用于简单随意的数据存储,如数据库查询结果缓存,API调用返回结果缓存,或者页面渲染。

 

 

Memcached组成

客户端

客户端维护一组后端缓存服务器节点。

一个基于客户端(client-based)的哈希算法。

用于基于key来选择一个后端服务器节点来缓存数据。

服务器

缓存数据用,通过key将数据缓存在内部的一个哈希表中。

LRULeast Recently Used 近期最少使用算法

基于近期最少使用算法算法来决定在内存不够时丢弃老数据或者重用内存。

 

设计思想

简单的key/value存储

无关乎数据,无关乎结构

缓存的数据项由一个key,过期时间,可选的标记以及原始数据组成。

 

逻辑一半一半

一部分设计在客户端,一部分在服务器端。客户端决定选择哪个后端服务器来读取key/value数据,具体存储读取由服务器决定,包括非热点数据(old data)丢弃,内存回收和重用。

 

服务器相互不连通

服务器相互不连通,它们之间是隔离的并不知道对方的存在。没有通信,没有同步,没有广播,没有复制。

添加服务器加大可用内存;使缓存失效很简单,直接摘除后端对应的服务器节点,或者在后端对应服务器节点重新写入就行。

 

O(1)时间复杂度

尽可能快即锁友好,近乎确定和稳定的查询速度。在低端机上查询的效率基本在1ms以内;高端服务器能够达到每秒百万个key数据的吞吐量。

 

默认采用最近最少使用算法来缓存数据

过期机制

缓存数据将在给定的过期时间后过期,这种过期机制防止过时的数据被返回。刷新未使用的数据,努力保留经常请求的信息。

无需停顿以等待垃圾回收,确保较低的延迟

 

缓存失效

与其通过广播的方式使得还承诺的数据无效,客户直接解决使得服务器端数据无效。

 

结果呢?不管是从分布式还是实际应用角度来讲,这里边还是有太多的问题需要解决。很多具体的应用,多亏memcached已经足够稳定,同时变化的不多,影响得也不大,不然绝大多数见过的线上应用都得出大问题。

 

结果呢?memcached足够稳定。

 

 

 

一致性哈希

哈希是一种常见的用于存储数据的容器数据结构,一致性哈希和普通的哈希不同,主要用于数据key和后端节点的映射,如将某个key映射到后端的某台机器,它可能是我们常见的服务器,处理来自客户端的请求,当然也可以用于存储,如缓存应用,一致性哈希常用于缓存场景,这种情况下,后台就是缓存服务器,数据通过一致性哈希映射到后台的一台缓存服务器上,数据就缓存在该服务器节点。

 

从哈希角度来看,一致性哈希和普通的哈希最大的区别在于一致性满足单调性,普通哈希是不支持单调性的,这表现在哈希容量大小发生变化(扩容或者缩容)后,所有已映射的key的映射关系都会发生变化,需要重新进行映射。而一致性哈希是满足单调性的,在一致性哈希中,有个哈希环的概念,一组节点映射在环上,数据key也通过映射的方式选择一个节点,如果环上的节点发生变化,不会导致已映射的所有数据key的映射关系都发生变化。

 

哈希实现

一个典型的哈希实现:

p = m % n

在这个算法中,n为容量大小,m为数据key,实际上应该是hash值。在这个算法中,任何数据key的hash在模余之后结果总是在0到n-1范围之间。

 

假设n为5,一组数据key为:(8,9,10,11,12,13),按照上面的算法,p为(3,4,0,1,2,3),如果n发生变化,假设n变成6,同样的一组数据key,按照上面的算法映射的结果都会发生变化,新的映射结果p为(2,3,4,0,1,2)。

这就不具备单调性。这在一些情况下是不能接受的,如在哈希中存了大量的数据,比如java中的哈希结构,如果有新的数据需要放进去,这时需要进行扩容,扩容意味着n发生变化,那么之前已经存下的大量数据都要重新进行映射,虽然java中保存了hash值,不需要重新计算,采用了空间换时间,但还是需要重新计算每个数据最终存下的位置。这在java中使用哈希时应该尽量避免这种情况的发生。

 

好的一致性哈希设计

一个好的一致性哈希设计应该满足上面的单调性。除了上面提到的单调性,还应该满足平衡性,分散性以及负载性。

 

单调性

 

平衡性

 

分散性

 

负载性

 

映射

在一致性哈希中,首先需要将一组节点映射到哈希环上,然后数据key也通过映射的方式选择映射到环上的某个节点。

 

节点和数据key的映射

节点的映射和数据key的映射可以采用同样的映射关系,也可以分别采用不同的映射关系。最终应该确保数据key能尽可能的均匀分散在各个节点上。

 

节点和数据key的映射通过哈希来实现。

 

哈希的设计

 

一致性哈希中的哈希函数实现

一个常见的使用一致性哈希的场景就是缓存,我们在查询db数据后,会将查询的数据缓存在memcached中,memcached是一种分布式缓存服务器。这么做有很多好处,尤其是在高并发应用场景中,高并发查询,大量db连接,db响应慢导致整个用户操作响应无法容忍,db不像其他应用能够很容易的做到扩展以支持高并发用户请求响应,单库单表增长很快变得很大导致响应很慢,这些问题的终极问题就是:

1、数据库db成为系统瓶颈

2、数据库db扩展成为问题关键

当然这里的问题不是说数据库是系统瓶颈,怎么解决db扩展的问题

 

虚拟节点

分享到:
评论

相关推荐

    memcached windows稳定版

    在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装 3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动...

    memcached安装软件 libevent magent memcached

    Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载。它通过在内存中存储数据来提供快速的数据访问,从而提高应用的性能。本篇文章将详细讲解如何安装和配置memcached,...

    memcached 64位 window

    标题"memcached 64位 window"指的是在Windows操作系统上运行的64位版本的Memcached缓存系统。Memcached是一种分布式内存对象缓存系统,广泛用于减轻数据库负载,提高Web应用的性能。由于是64位版本,这意味着它可以...

    php7 的memcached扩展php_memcached.dll扩展

    Memcached是一种分布式内存对象缓存系统,广泛应用于Web应用程序,以提高数据读取速度,减轻数据库负载。在PHP环境中,使用Memcached扩展可以方便地存储和检索数据,尤其适用于处理高并发场景。 `...

    hibernate-memcached包

    **hibernate-memcached包** 是一个专为Hibernate框架设计的扩展,目的是将流行的分布式内存缓存系统Memcached整合到Hibernate中,作为其二级缓存解决方案。在大型分布式应用中,缓存技术是提高性能的关键,特别是...

    memcached-1.5.11.tar.gz

    《深入理解Memcached:基于1.5.11版本的剖析》 Memcached,一个高性能、分布式的内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。本文将深入探讨Memcached的1.5.11版本,解析其...

    memcached+tomcat7共享session所需要的jar包

    标题中的“memcached+tomcat7共享session所需要的jar包”是指使用Memcached作为分布式缓存系统,实现Tomcat7服务器间的Session共享。这通常是为了在集群环境中解决Session复制或粘滞会话的问题,提高Web应用的可扩展...

    memcached-win-32/64-1.4.4-14

    memcached的基本设置: -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d ...

    java_memcached-release_2.5.1.jar Memcache java jar 包

    Java Memcached是一个流行的Java客户端库,用于与Memcached缓存系统进行交互。Memcached是一种分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用的性能。在本例中,我们关注的是`java_memcached-release_...

    memcached数据完整迁移到redis

    标题 "memcached数据完整迁移到redis" 描述的是一个数据迁移的过程,从使用 memcached 存储的数据转换到使用 redis 存储。这个过程在 IT 领域中是常见的,因为不同的缓存系统有不同的特性和优势。让我们深入探讨这个...

    memcached安装包以及MemCachedClient

    **Memcached 安装与使用详解** Memcached 是一款高性能的分布式内存缓存系统,用于在Web应用中减轻数据库负载。它将数据存储在内存中,以键值对的形式提供快速访问,尤其适用于高并发场景。Memcached 使用简单,可...

    memcached 完整的项目,服务端(win) 客户端 包括jar包

    **Memcached 完整项目详解** Memcached 是一个高性能、分布式的内存对象缓存系统,用于在应用服务器之间共享数据,减少数据库负载。这个项目包含了 Memcached 的服务端(适用于 Windows)以及 Java 客户端,是开发...

    windows下memcached+memcached.dll 5.3.8

    标题中的“Windows下memcached+memcached.dll 5.3.8”指的是在Windows操作系统上安装和使用Memcached服务的场景,其中`memcached.dll 5.3.8`是Memcached服务器的一个特定版本的动态链接库文件。Memcached是一款高...

    memcached服务器端memcached.exe 下载

    标题“memcached服务器端memcached.exe 下载”指的是获取memcached服务端的可执行文件,`memcached.exe`是Windows环境下运行memcached服务的程序。这个绿色版的memcached意味着它无需安装,下载解压后即可直接运行,...

    memcached-win64-1.4.4-14.zip

    Memcached 是一个高性能、分布式内存对象缓存系统,它广泛应用于Web应用中,用来减轻数据库负载,提高数据访问速度。Memcached的设计理念是简单而快速,通过在内存中存储键值对来提供高速的数据访问。这里我们关注的...

    memcached-win32-1.4.4-14.zip

    标题"memcached-win32-1.4.4-14.zip"指的是Memcached的Windows 32位版本,版本号为1.4.4,构建编号14。这个压缩包是一个软件分发包,用于在32位Windows系统上部署和运行Memcached。 描述中提到,Memcached是一个...

    python-memcached python-memcached

    Python-memcached是Python语言的一个库,用于与Memcached缓存系统进行交互。Memcached是一种高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。Python-memcached库则...

Global site tag (gtag.js) - Google Analytics