大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Memcached的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
创新互联是一家集网站建设,宝塔企业网站建设,宝塔品牌网站建设,网站定制,宝塔网站建设报价,网络营销,网络优化,宝塔网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
一、Memcached简介
memcached是高性能的分布式内存缓存服务器。它通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。与其类似常见的还有redis。Memcached基于一个存储键/值(K/V)对的hashmap。客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
memcached的API使用32位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。
二、Memcached的分布式算法
1、余数哈希(余数计算分散):
原理:根据服务器台数的余数进行分散:先求得键(key)的整数哈希值( int hashCode ),通过Hash函数把key转化成整数后,再用这个哈希值除以服务器台数,根据余数选择服务器。
举例:总共10台服务器(编号为0~9),先获取数据的key的整数哈希值:hashCode=hash(key)=13 ,然后除以服务器总台数,mod 10(13%10)=3,即选择编号为3的服务器进行存储。
缺点:当添加或减少服务器后要进行重哈希,这样会导致原来的服务器序号变了,则可能出现求得的余数也改变,导致Memcached命中率下降,导致更多地访问数据库服务器去调数据,增加了数据库服务器的负载。
2、一致性哈希:
原理:
一致性哈希是将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间是0~(2^32 -1)(即哈希值是一个32位的无符号整型)。这个哈希空间为环。然后让每台机器占一个扇形空间。(一致性哈希方式,使得服务器保存的哈希值空间是一个范围,而不是一个特定的余数系列.所以减少了增删服务器后的影响.)
哈希空间按顺时针方向组织。为确定每台服务器在空间上的位置,按照服务器主机名或者IP地址对每台服务器进行Hash寻址。然后需要使用hash算法来判断数据应该存储在哪个服务器:首先,将数据根据key值使用相同的函数H计算出哈希值h,根据h确定数据在环上的位置,从此位置延环顺时针向下寻找,遇到的第一个服务器就是其应该存储的服务器。
容错性:对下图,当Server3服务器故障时,数据的存储指示D发生了改变,存放在了Server2上边。系统的存储数据变化最少(因为是数据是顺时针寻找服务器存储,所以D位置数据找到的是Server2服务器)
扩展性:假设增加服务器Server4,按规则放在BC中间,那么只是B存储在Server4上边了,整体的影响只是发生在了新增节点的区间部分。
三、Memcached的数据清除算法
Memcached会启动LRU(Least Recently Used,最近最少使用)算法淘汰旧的数据项。
每个slab会维护一个队列,刚插入的数据在队头,经常get的数据也会移动到队头,这样较老或者访问较少的数据相对都留在队尾。该算法从队尾开始淘汰。当slab分配不到足够的内存时,首先会检查队尾是否有过期数据。如果有的话会直接将其覆盖为新的对象,如果没有,会开始淘汰队尾的对象。
四、工作流程
检查客户端的请求数据是否在memcached中,若存在则直接把请求数据返回,不存在则访问数据库服务器进行操作;
如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现);
每次更新数据库的同时更新memcached中的数据,保证一致性;当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
五、Memcached 和 Redis的区别?
1、数据存储位置:Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。而Memecache把数据全部存在内存之中;
2、速度上:Redis的速度比memcached快很多;
3、多线程:Memcached支持多线程,而Redis使用单线程的IO复用模型;
4、支持的数据类型:Memcached仅支持简单的数据类型,想要存入复杂的数据类型必须把复杂的数据类型转变成简单的数据类型。Redis不仅仅支持简单的k/v类型的数据,同时还提供string(字符串)、list(链表)、set(集合)、zset(sortedset --有序集合)和hash(哈希类型)等数据结构的存储。
关于Memcached的原理是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。