• MemCachedClient 节点失效时的处理


    引入jar包

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>cn.zno</groupId>
        <artifactId>memcached-test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.1.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>com.danga</groupId>
                <artifactId>java-memcached</artifactId>
                <version>2.6.3</version>
            </dependency>
        </dependencies>
    </project>
    View Code

    配置Beans.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean class="com.danga.MemCached.SockIOPool" factory-method="getInstance"
            init-method="initialize" destroy-method="shutDown">
            <constructor-arg>
                <value>my-memcachedPool</value>
            </constructor-arg>
            <property name="servers">
                <list>
                    <value>172.16.50.238:11211</value>
                    <value>172.16.162.248:11211</value>
                </list>
            </property>
            <!-- 初始化连接为20 -->
            <property name="initConn">
                <value>20</value>
            </property>
            <!-- 最小连接为5 -->
            <property name="minConn">
                <value>7</value>
            </property>
            <!-- 最大连接为100 -->
            <property name="maxConn">
                <value>10000</value>
            </property>
            <!-- 平衡线程休眠时间为30ms -->
            <property name="maintSleep">
                <value>30</value>
            </property>
            <!-- Nagle标志为false -->
            <property name="nagle">
                <value>false</value>
            </property>
            <!-- 响应超时时间为3000ms -->
            <property name="socketTO">
                <value>3000</value>
            </property>
        </bean>
        <bean class="com.danga.MemCached.MemCachedClient">
            <constructor-arg>
                <value>my-memcachedPool</value>
            </constructor-arg>
        </bean>
    
    </beans>
    View Code

    测试类

    import java.util.Date;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.danga.MemCached.MemCachedClient;
    
    public class Test {
    
        public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");
    
            MemCachedClient client = ctx.getBean(MemCachedClient.class);
    
            System.out.println(client.add("xiaoming", "0", new Date(60 * 1000)));
            System.out.println(client.add("xiaoming1", "0", new Date(60 * 1000)));
            System.out.println(client.add("xiaoming", "0", new Date(60 * 1000)));
            // System.out.println(client.get("xiaoming"));
            System.out.println(client.add("xiaoming", "0", new Date(60 * 1000)));
            
        }
    
    }
    View Code

    验证结论:

    /*
    ======== 单节点  add 测试 ============
    测试结果:
    1. telnet 172.16.50.238 11211 不通时,返回 false
    2. telnet 172.16.50.238 11211 通时 ,数据不存在时,返回 true
    3. telnet 172.16.50.238 11211 通时 ,数据已存在时,返回 false
    
    ==========多节点 [A:172.16.50.238 11211]
                    [B:172.16.162.248 11211] add 测试============
    测试用例123:
    1. [AB通] 时数据不存在时true,数据存在时false
    
    2. 运行过程中有节点不可用
    System.out.println(client.add("xiaoming", "0", new Date(60*1000))); // 哈希应该存至A ,A通,返回true    
    System.out.println(client.add("xiaoming1", "0", new Date(60*1000)));// 哈希应该存至B ,B通,返回true
    System.out.println(client.add("xiaoming", "0", new Date(60*1000))); // 哈希应该存至A ,A不通 ,返回false ,A节点移除,哈希算法改变。 !上一行的注释! 也可用get方法代替,交互一次就可以判断节点是否可用。 
    System.out.println(client.add("xiaoming", "0", new Date(60*1000))); // 哈希算法存至B ,B通,返回true
    
    3. 启动前A节点不可用
    哈希算法都存至B
    
    
    */

     补充:

    如果有AB两节点,B节点停止服务,则之前哈希至B的都哈希至A(但是每次都有稍微卡顿,具体可能是判断该服务可用不可用);当B节点再次提供服务时,则哈希至B(无卡顿)。

  • 相关阅读:
    [Algorithm] Delete a node from Binary Search Tree
    [Javascript] Check both prop exists and value is valid
    对象的多态性
    spring 定时任务(3)--配置多个定时任务
    能上QQ无法打开网页
    [置顶] Ajax核心--XMLHttpRequest对象
    linux内核--进程地址空间(一)
    [SQL]一个删选数据的例子,使用GROUP、DISTINCT
    [置顶] 腾讯2014软件开发笔试题目
    DBS小结
  • 原文地址:https://www.cnblogs.com/zno2/p/4673411.html
Copyright © 2020-2023  润新知