memcached是什么
MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。
Memcached 进程运行之后,会预申请一块较大的内存空间,自己进行管理,用完之后再申请,不是每次需要的时候去向操作系统申请。当分配给Memcached的内存足够大的时候,Memcached的时间消耗基本上只是网络Socket连接了。
通过以下两张图可以帮助你更快理解:
MemCache一次写缓存的流程如下:
1、应用程序服务器从数据库读到数据(数据可以来自数据库调用、API调用,或者页面渲染的结果)再通过memcached客户端程序输入需要写缓存的数据
2、API将Key输入路由算法模块,路由算法根据Key和MemCache集群服务器列表得到一台服务器编号
3、由服务器编号得到MemCache及其的ip地址和端口号
4、API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作
读缓存和写缓存一样,只要使用相同的路由算法和服务器列表,只要应用程序查询的是相同的Key,MemCache客户端总是访问相同的客户端去读取数据,只要服务器中还缓存着该数据,就能保证缓存命中。
一致性哈希算法
余数哈希
使用余数哈希的算法当服务器集群需要扩容时会使得很多缓存无法命中,而且这些无效缓存还没办法及时清除占用内存,增大了数据库的压力。
这个问题有解决方案,解决步骤为:
(1)在网站访问量低谷,通常是深夜,技术团队加班,扩容、重启服务器
(2)通过模拟请求的方式逐渐预热缓存,使缓存服务器中的数据重新分布
一致性哈希算法
先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),接着在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。
数据结构:
1. 排序后用list
2. 不排序,遍历+list
3. 红黑树
这样子如果增添节点之后会导致负载不均衡,通过创建虚拟节点可以解决这个问题。(将一个物理节点拆分为多个虚拟节点,并且同一个物理节点的虚拟节点尽量均匀分布在Hash环上)
Memcached 不足
1、数据是保存在内存当中的,一旦服务进程重启,数据会全部丢失
对策:可以采取更改Memcached的源代码,增加定期写入硬盘的功能
2、Memcached以root权限运行,而且Memcached本身没有任何权限管理和认证功能,安全性不足
对策:可以将Memcached服务绑定在内网IP上,通过防火墙进行防护