Memcached总结

1、Memcached简介算法

    memcached是高性能的分布式内存缓存服务器。它经过缓存数据库查询结果,减小数据库访问次数,以提升动态Web应用的速度、提升可扩展性。与其相似常见的还有Redis。Memcached基于一个存储键/值(K/V)对的hashmap。客户端能够用任何语言来编写,并经过memcached协议与守护进程通讯。数据库

    memcached的API使用32位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不一样的机器上。当表格满了之后,接下来新增的资料会以LRU机制替换掉。缓存

2、Memcached的分布式算法服务器

一、余数哈希(余数计算分散):数据结构

原理:根据服务器台数的余数进行分散:先求得键(key)的整数哈希值( int hashCode ),经过Hash函数把key转化成整数后,再用这个哈希值除以服务器台数,根据余数选择服务器。多线程

举例:总共10台服务器(编号为0~9),先获取数据的key的整数哈希值:hashCode=hash(key)=13 ,而后除以服务器总台数,mod 10(13%10)=3,即选择编号为3的服务器进行存储。分布式

缺点:当添加或减小服务器后要进行重哈希,这样会致使原来的服务器序号变了,则可能出现求得的余数也改变,致使Memcached命中率降低,致使更多地访问数据库服务器去调数据,增长了数据库服务器的负载。memcached

二、一致性哈希:函数

原理:性能

  • 一致性哈希是将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间是0~(2^32 -1)(即哈希值是一个32位的无符号整型)。这个哈希空间为环。而后让每台机器占一个扇形空间。(一致性哈希方式,使得服务器保存的哈希值空间是一个范围,而不是一个特定的余数系列.因此减小了增删服务器后的影响.)

  • 哈希空间按顺时针方向组织。为肯定每台服务器在空间上的位置,按照服务器主机名或者IP地址对每台服务器进行Hash寻址。而后须要使用hash算法来判断数据应该存储在哪一个服务器:首先,将数据根据key值使用相同的函数H计算出哈希值h,根据h肯定数据在环上的位置,今后位置延环顺时针向下寻找,遇到的第一个服务器就是其应该存储的服务器。

容错性:对下图,当Server3服务器故障时,数据的存储指示D发生了改变,存放在了Server2上边。系统的存储数据变化最少(由于是数据是顺时针寻找服务器存储,因此D位置数据找到的是Server2服务器)

扩展性:假设增长服务器Server4,按规则放在BC中间,那么只是B存储在Server4上边了,总体的影响只是发生在了新增节点的区间部分。

3、Memcached的数据清除算法

  • Memcached会启动LRU(Least Recently Used,最近最少使用)算法淘汰旧的数据项。 
  • 每一个slab会维护一个队列,刚插入的数据在队头,常常get的数据也会移动到队头,这样较老或者访问较少的数据相对都留在队尾。该算法从队尾开始淘汰。当slab分配不到足够的内存时,首先会检查队尾是否有过时数据。若是有的话会直接将其覆盖为新的对象,若是没有,会开始淘汰队尾的对象。

4、工做流程

  • 检查客户端的请求数据是否在memcached中,若存在则直接把请求数据返回,不存在则访问数据库服务器进行操做;
  • 若是请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,须要程序明确实现);
  • 每次更新数据库的同时更新memcached中的数据,保证一致性;当分配给memcached内存空间用完以后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,而后再替换掉最近未使用的数据。

5、Memcached 和 Redis的区别?

一、数据存储位置:Redis支持数据的持久化,能够将内存中的数据保持在磁盘中,重启的时候能够再次加载进行使用。而Memecache把数据所有存在内存之中;

二、速度上:Redis的速度比memcached快不少;

三、多线程:Memcached支持多线程,而Redis使用单线程的IO复用模型;

四、支持的数据类型:Memcached仅支持简单的数据类型,想要存入复杂的数据类型必须把复杂的数据类型转变成简单的数据类型。Redis不只仅支持简单的k/v类型的数据,同时还提供string(字符串)、list(链表)、set(集合)、zset(sortedset --有序集合)和hash(哈希类型)等数据结构的存储。

相关文章
相关标签/搜索