MemCached Client集群方案
- Cluster的实现
Memcached作为集中式Cache,就存在着集中式的致命问题:单点问题,Memcached支持多Instance分布在多台机器上,仅仅 只是解决了数据全部丢失的问题,但是当其中一 台机 器出错以后,还是会导致部分数据的丢失,一个篮子掉在地上还是会把部分的鸡蛋打破。因此就需要实现一个备份机制,能够保证Memcached在部分失效以后,数据还能够 依然使用,因 此做Cluster也是必要的。
(1) 应用传入需要操作的key,通过CacheManager获取配置在Cluster中的客户端。
(2) 当获得Cache Client以后,执行Cache操作。
(3) A.如果是读取操作,当不能命中时去集群其他Cache客户端获取数据,如果获取到数据,尝试写入到本次获得的Cache客户端,并返回结果。(达到数据恢复的作用)
B.如果是更新操作,在本次获取得Cache客户端执行更新操作以后,立即返回,将更新集群其他机器命令提交给客户端的异步更新线程对列去异步执行。(由于如果是根据 key来获取Cache,那么异步执行不会影响到此主键的查询操作)
存在的问题:如果是设置了Timeout的数据,那么在丢失以后被复制的过程中就会变成永久有效的内容。
2 LocalCache结合Memcached使用,提高数据获取效率。,Memcached并不是完全无损失的,Memcached是通过Socket数据交互来进行通信的,因此机器的带宽,网络IO,Socket连接数都是制约Memcached发挥其作用的障碍。Memcache的一个突出优点就是Timeout的设置,也就是放入进去的数据可以设置有效期,自动会失效,这样对于一些不敏感的数据就可以在一定的容忍时间内不去更新,提高效率。根据这个思想,其实在集群中的每一个Memcached客户端也可以使用本地的Cache,来缓存获取过的数据,设置一定的失效时间,来减少对于Memcached的访问次数,提高整体性能。
因此,在每一个客户端中内置了一个有超时机制的本地缓存(采用lazy timeout机制),在获取数据的时候,首先在本地查询数据是否存在,如果不存在则再向Memcache发起请求,获得数据以后,将其缓存在本地,并设置有效时间。