java版Memcached的理解

阿里岑文初的memcached虽然添加了不少功能,但我觉得好像还不是那么完美,有些细节在使用时还是需要注意……

优点:

    1.配置改用文件,代替代码初始化,带来方便

    2.增加cluster和keySet等方法提供了一些增强功能。

    3.LocalCache结合Memcached使用,提高数据获取效率

需要注意的地方:

  1. 一个SocketPool配置一个节点是最好的

    Whalin原版Memcache客户端已经实现了负载,是通过在定义SocketPool时指定多个servers并用逗号分开来实现的:

    <client name="mclient1" socketpool="pool1" compressEnable="true" defaultEncoding="UTF-8" ></client>
    <client name="mclient2" socketpool="pool2" compressEnable="true" defaultEncoding="UTF-8" ></client> 
    	
    <socketpool name="pool1" failover="true" initConn="10" minConn="5" maxConn="250" maintSleep="0"
            nagle="false" socketTO="3000" aliveCheck="true">
            <servers>10.0.68.211:12000,10.0.68.212:12222</servers>
            <weights>5,5</weights>
    </socketpool>  
    <socketpool name="pool2" failover="true" initConn="10" minConn="5" maxConn="250" maintSleep="0"
            nagle="false" socketTO="3000" aliveCheck="true">
            <servers>10.0.68.213:12000,10.0.68.214:12222</servers>
            <weights>5,5</weights>
    </socketpool>  
    <cluster name="cluster1">
    	<memCachedClients>mclient1,mclient2</memCachedClients>
    </cluster>

    可以看到,我们定义了两个client和两个socketPool,且这两个client为主备关系。

    在put数据的时候,会根据key对数据做一次hash,来决定由哪一个client来做同步写入,另一个则自动作异步同步。socketPool和client是被包含的关系,比如我们选择了mclient1来同步写入,mclient1持有的pool1又会再做一次hash来决定数据放在哪个Memcached服务器上!而且10.0.86.211和10.0.68.212可没有主备的关系!

    可能有的人觉得这样挺好,数据会均匀落在2台机器上,另外两台数据也会备份,但,这种设置逻辑也太复杂了吧,而且你确定这是你想要的结果?如果你真想做两两主备,那下面这种设置方式岂不更容易理解?

<client name="mclient1" socketpool="pool1" compressEnable="true" defaultEncoding="UTF-8" ></client>
<client name="mclient2" socketpool="pool2" compressEnable="true" defaultEncoding="UTF-8" ></client> 
<client name="mclient3" socketpool="pool3" compressEnable="true" defaultEncoding="UTF-8" ></client>
<client name="mclient4" socketpool="pool4" compressEnable="true" defaultEncoding="UTF-8" ></client> 	
<socketpool name="pool1" failover="true" initConn="10" minConn="5" maxConn="250" maintSleep="0" nagle="false" socketTO="3000" aliveCheck="true">
        <servers>10.0.68.211:12000</servers>
</socketpool>  
<socketpool name="pool2" failover="true" initConn="10" minConn="5" maxConn="250" maintSleep="0" nagle="false" socketTO="3000" aliveCheck="true">
        <servers>10.0.68.212:12000</servers>
</socketpool>  
<socketpool name="pool3" failover="true" initConn="10" minConn="5" maxConn="250" maintSleep="0" nagle="false" socketTO="3000" aliveCheck="true">
        <servers>10.0.68.213:12000</servers>
</socketpool>  
<socketpool name="pool4" failover="true" initConn="10" minConn="5" maxConn="250" maintSleep="0" nagle="false" socketTO="3000" aliveCheck="true">
        <servers>10.0.68.214:12000</servers>
</socketpool>
<cluster name="cluster1">
	<memCachedClients>mclient1,mclient3</memCachedClients>
</cluster> 
<cluster name="cluster2">
	<memCachedClients>mclient2,mclient4</memCachedClients>
</cluster>

        所以,请一个SocketPool设置一个server节点。当然,程序里 memcacheManager.getCache(mclientName)这种取法怎么让clientName拿的随机又是个让人郁闷的问题了。

    2.cluster视情况而定,不一定需要。

    我觉得既然是缓存服务器,down了启动就是,数据再从数据库拿就是,当然,如果用作它用则别论。其次,我如果设置主备,可能是想做双机热备的功能,数据嘛……,视情况而定,这个代码好像是实现了,赞!

    3.没有了一致性hash算法,新的hash算法还需要改进

    缓存服务器嘛,一致性hash肯定是最好的了,好像原版是有的,扩展之后的版本是没有用了,伤心……

    4.序列化方法的改进,可以用Hessian的序列化机制

    

    上面是我的一家之言,当然,我的见解肯定是与大牛有差距的,在此列出,也只是我的一些想法和疑惑吧

你可能感兴趣的:(java版Memcached的理解)