更新时间:2020-01-03 15:04:14 来源:极悦 浏览3049次
memcache的分布式原理
memcached 虽然称为 “ 分布式 ” 缓存服务器,但服务器端并没有 “ 分布式 ” 功能。每个服务器都是完全独立和隔离的服务。memcached 的分布式,则是完全由客户端程序库实现的。这种分布式是 memcached 的最大特点。
memcache的内存分配机制
如何存放数据到memcached缓存中?(memcache内存分配机制)
Slab Allocator内存分配机制:预先将内存分配成数个slab仓库,每个仓库再切出不同大小的chunk,去适配收到的数据。多余的只能造成浪费,不可避免。 增长因子(Grace factor):一般而言观察数据大小的变化规律设置合理的增长因子,默认1.25倍. 太大容易造成浪费。memcached.exe -m 64 -p 11211 -f 1.25
如果有100byte的内容要存储,但122大小的仓库的chunk用满了怎么办? 答:是并不会寻找更大仓库的chunk来存储,而是把122仓库中的旧数据踢掉!
memcache的惰性失效机制
当某个值过期后并不会从内存删除。(因此status统计时的curr_items有其信息) 2 如果之前没有get过,将不会自动删除。如果(过期失效,没get过一次)又没有一个新值去占用他的位置时,当做空的chunk占用。3 当取其值(get)时,判断是否过期:如果过期返回空,且清空。(所以curr_items就减少了) 即这个过期只是让用户看不到这个数据而已,并没有在过期的瞬间立即从内存删除,这个过程 称为lazy expirtion,属性失效,好处是节约了cpu和检测的成本,称为“惰性失效机制”
memcache缓存的无底洞现象
缓存的无底洞现象:facebook的工作人员反应,他们在2010年左右,memcacahed节点就已经达到3000个,大约数千G的缓存,他们发现一个问题,memchache连接频率太高导致效率下降,于是加memcache节点,添加后发现连接频率导致的问题仍然没有好转,称之为“无底洞现象”。
问题分析:以用户为例:user-133-age,user-133_name,user-133-height.........N个key 当服务器增多,133号用户的信息也被散落在更多的服务器, 所以同样是访问个人主页,得到相同的个人信息,节点越多,要连接节点越多,对于memcache的连接数并没有随着节点的增多而降低,问题出现。
事实上:nosql和传统的rdbms并不是水火不容,两者在某些设计上是可以相互参考的。对于nosql的key-value这种存储,key的设计可以参考mysql中表和列的设计。比如user表下有age、name、height列,对应的key可以用user:133:age=23,user:133:name=ls,user:133:height=168;
问题的解决方案:把某一组key按其共同前缀来分布,比如:user:133:age=23,user:133:name=ls,user:133:height=168;在用分布式算法求其节点时,应该以user:133来计算,而不是以user:133:age来计算,这样这三个关于个人信息的key都落在同一个节点上。再次访问只需要连接一个节点。问题解决。
hash算法平衡性
平衡性指的是hash的结果尽可能分布到所有的缓存中去,这样可以使得所有的缓存空间都可以得到利用。但是hash算法不保证绝对的平衡性,为了解决这个问题一致性hash引入了“虚拟节点”的概念。虚拟节点”( virtual node )是实际节点在 hash 空间的复制品( replica ),一实际个节点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列。“虚拟节点”的hash计算可以采用对应节点的IP地址加数字后缀的方式。 例如假设 cache A 的 IP 地址为202.168.14.241 。 引入“虚拟节点”前,计算 cache A 的 hash 值:Hash(“202.168.14.241”); 引入“虚拟节点”后,计算“虚拟节”点 cache A1 和 cache A2 的 hash 值: Hash(“202.168.14.241#1”); // cache A1 Hash(“202.168.14.241#2”); // cache A2 这样只要是命中cacheA1和cacheA2节点,就相当于命中了cacheA的缓存。这样平衡性就得到了提高。
memcached与redis的区别
redis做存储,可以持久化,memcache做缓存,数据易丢失。2 redis支持多数据类型,memcache存放字符串。3 redis服务端仅支持单进程、单线程访问,也就是先来后到的串行模式,避免线程上下文切换,自然也就保证数据操作的原子性。Memcache服务端是支持多线程访问的。4 redis虽然是单进程单线程模式,但是redis使用了IO多路复用技术做到一个线程可以处理很多个请求来保证高性能。
Redis的主从复制
1在Slave启动并连接到Master之后,它将主动发送一个SYNC命令给Master。2 Master在收到SYNC命令之后,将执行BGSAVE命令执行后台存盘进程(rdb快照), 同时收集所有接收到的修改数据集的命令即写命令到缓冲区,在后台存盘进程执行完毕后,Master将传送整个数据库文件到Slave。3 Slave在接收到数据库文件数据之后,将自身内存清空,加载rdb文件到内存中完成一次完全同步。4 接着,Master继续将所有已经收集到缓冲区的修改命令,和新的修改命令依次传送给Slaves 5 Slave将在本地执行这些数据修改命令,从而达到最终的数据同步 6 之后Master和Slave之间会不断通过异步方式进行命令的同步,从而保证数据的实时同步 7 如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在 重新连接成功之后:2.8之前的redis将进行一次完全同步
Redis的部分复制过程
部分同步工作原理如下:1):Master为被发送的复制流创建一个内存缓冲区(in-memory backlog),记录最近发送的复制流命令 2):Master和Slave之间都记录一个复制偏移量(replication offset)和当前Master ID(Master run id) 3):当出现网络断开,Slave会重新连接,并且向Master请求继续执行原来的复制进程 4):如果Slave中断网前的MasterID和当前要连的MasterID相同,并且从断开时到当前时刻Slave记录的偏移量所指定的数据仍然保存在Master的复制流缓冲区里面,则Master会向Slave发送缺失的那部分数据,Slave执行后复制工作可以继续执行。5):否则Slave就执行完整重同步操作
以上就是极悦注册机构小编介绍的“2020年Java中级工程师面试题”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
相关推荐
(初级到高级)
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习