zoukankan      html  css  js  c++  java
  • 02.XMemcached的使用

        关于XMemcached的介绍或文档请参考:https://code.google.com/p/xmemcached/wiki/User_Guide_zh
        关于Memcached的命令及使用请参考:http://www.runoob.com/memcached/memcached-stats.html

    1.XMemcached基本使用

    1.使用XMemcached的简单例子
    1. public static void main(String[] args) throws IOException, TimeoutException, InterruptedException, MemcachedException
    2. {
    3. MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.110.100:11211"));
    4. MemcachedClient client = builder.build();
    5. // set 命令用于将 value(数据值) 存储在指定的 key(键) 中
    6. System.out.println("set :" + client.set("key001", 3600, "value001"));
    7. // add 命令用于将 value(数据值) 存储在指定的 key(键) 中
    8. System.out.println("add :" + client.add("key002", 3600, "value002"));
    9. // replace 命令用于替换已存在的 key(键) 的 value(数据值)
    10. System.out.println("replace :" + client.replace("key002", 3600, "value003"));
    11. // append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据
    12. System.out.println("append :" + client.append("key002", "value004"));
    13. // prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据
    14. System.out.println("prepend :" + client.prepend("key002", "value005"));
    15. // CAS 命令用于执行一个"检查并设置"的操作它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入
    16. GetsResponse<String> result = client.gets("key002");
    17. long cas = result.getCas();
    18. System.out.println("cas :" + client.cas("key002", 3600, "value002", cas));
    19. // get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空
    20. System.out.println("get :" + client.get("key001"));
    21. // gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空
    22. System.out.println("gets :" + client.gets("key002"));
    23. // delete 命令用于删除已存在的 key(键)
    24. System.out.println("delete :" + client.delete("key002"));
    25. // incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作
    26. System.out.println("incr :" + client.incr("key002", 1L));
    27. // stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等
    28. System.out.println("stats :" + client.stats(new InetSocketAddress("192.168.110.100", 11211)));
    29. System.out.println("getStats :" + client.getStats());
    30. // stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)
    31. System.out.println("getStatsByItem items :" + client.getStatsByItem("items"));
    32. // stats slabs 命令用于显示各个slab的信息,包括chunk的大小、数目、使用情况等
    33. System.out.println("getStatsByItem slabs :" + client.getStatsByItem("slabs"));
    34. // stats sizes 命令用于显示所有item的大小和个数
    35. System.out.println("getStatsByItem sizes :" + client.getStatsByItem("sizes"));
    36. // flush_all 命令用于用于清理缓存中的所有 key=>value(键=>值) 对
    37. client.flushAll();
    38. System.out.println("OK!!!");
    39. client.shutdown();
    40. }
    2.XMemcached主要类关系结构

    2.XMemcached深入使用

        想了解XMemcached更全面的使用可以参考:https://code.google.com/p/xmemcached/wiki/User_Guide_zh这里只介绍常用的功能
    1.使用Memcached集群(客户端集群)
    1. public static void main(String[] args) throws IOException, TimeoutException, InterruptedException, MemcachedException
    2. {
    3. // 集群服务器地址
    4. String server = "192.168.110.100:11211 192.168.110.101:11211 192.168.110.102:11211 192.168.110.103:11211";
    5. // 设置权重
    6. int[] weights = new int[] { 1, 2, 3, 4 };
    7. MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(server), weights);
    8. // 客户端集群算法:一致性哈希。默认是:按照key的哈希值模以连接数得到的余数
    9. builder.setSessionLocator(new KetamaMemcachedSessionLocator());
    10. MemcachedClient client = builder.build();
    11. // 返回可用的memcached服务器列表
    12. System.out.println(client.getAvailableServers());
    13. for (int i = 0; i < 100; i++)
    14. {
    15. System.out.print(client.set("key-" + i, 3600, "value-" + i) + "-");
    16. }
    17. System.out.println(" OK!!!");
    18. client.shutdown();
    19. }
    2.动态增删节点
    1. public static void main(String[] args) throws IOException, InterruptedException
    2. {
    3. MemcachedClientBuilder builder = new XMemcachedClientBuilder();
    4. MemcachedClient client = builder.build();
    5. System.out.println(client.getAvailableServers());
    6. client.addServer("192.168.110.100", 11211, 1);
    7. client.addServer("192.168.110.101", 11211, 2);
    8. client.addServer("192.168.110.102", 11211, 3);
    9. client.addServer("192.168.110.103", 11211, 4);
    10. System.out.println(client.getAvailableServers());
    11. client.removeServer("192.168.110.102:11211 192.168.110.103:11211");
    12. Thread.sleep(100); // 由于xmemcached是多线程操作,所以休眠一段时间才能看到效果
    13. System.out.println(client.getAvailableServers());
    14. System.out.println("OK!!!");
    15. client.shutdown();
    16. }
    3.设置连接池和其他配置
    1. public static void main(String[] args) throws IOException
    2. {
    3. MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.110.100:11211"));
    4. // 设置客户端集群的算法实现
    5. builder.setSessionLocator(new KetamaMemcachedSessionLocator());
    6. // 使用二进制协议
    7. builder.setCommandFactory(new BinaryCommandFactory());
    8. // Nio连接池
    9. builder.setConnectionPoolSize(5);
    10. // Failure模式和standby节点
    11. builder.setFailureMode(true);
    12. // 与tokyotyrant交互
    13. builder.setTranscoder(new TokyoTyrantTranscoder());
    14. MemcachedClient memcachedClient = builder.build();
    15. memcachedClient.shutdown();
    16. }
    Failure模式和standby节点说明xmemcached还支持主辅模式,你可以设置一个memcached的节点的备份节点,当主节点down掉的情况下,会将本来应该发往主节点的请求转发给standby备份节点。使用备份节点的前提是启用failure模式。示例如下:
    1. MemcachedClient builder=new XmemcachedClientBuilder(AddrUtil.getAddressMap("localhost:11211,localhost:11212 host2:11211,host2:11212"));
    上面的例子,将localhost:11211的备份节点设置为localhost:11212,而将host2:11211的备份节点设置为host2:11212
    4.与Spring集成
    配置如下:
    1. <!-- Memcached客户端工厂配置 -->
    2. <bean name="memcachedClient" class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown">
    3. <!-- Memcached的服务器集群 -->
    4. <property name="servers">
    5. <!-- <value>host1:port1 host2:port2 host3:port3</value> -->
    6. <value>${memcached.host1}</value>
    7. </property>
    8. <!-- 客户端节点权重设置,对应上面的servers配置 -->
    9. <property name="weights">
    10. <list>
    11. <value>${memcached.host1.weight}</value>
    12. </list>
    13. </property>
    14. <!-- 设置连接池的大小 -->
    15. <property name="connectionPoolSize" value="2"></property>
    16. <!-- 使用二进制协议通讯,默认为TextCommandFactory -->
    17. <property name="commandFactory">
    18. <bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory"></bean>
    19. </property>
    20. <!-- 分布式策略 -->
    21. <property name="sessionLocator">
    22. <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
    23. </property>
    24. <!-- 序列化转码器 -->
    25. <property name="transcoder">
    26. <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
    27. </property>
    28. <!-- 缓冲区分配器 -->
    29. <property name="bufferAllocator">
    30. <bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator"></bean>
    31. </property>
    32. <!-- 设置验证信息 -->
    33. <!--
    34. <property name="authInfoMap">
    35. <map>
    36. <entry key-ref="server1">
    37. <bean class="net.rubyeye.xmemcached.auth.AuthInfo" factory-method="typical">
    38. <constructor-arg index="0">
    39. <value>index</value>
    40. </constructor-arg>
    41. <constructor-arg index="1">
    42. <value>index-pd</value>
    43. </constructor-arg>
    44. </bean>
    45. </entry>
    46. </map>
    47. </property>
    48. -->
    49. </bean>
    使用时要注意:
        因为XMemcachedClientFactoryBean申明是“public class XMemcachedClientFactoryBean implements FactoryBean”实现了Spring FactoryBean接口,所以使用时不能直接获取XMemcachedClientFactoryBean类对象,使用方式如下,应该注入MemcachedClient对象:
    1. @Autowired
    2. @Qualifier("memcachedClient")
    3. private MemcachedClient memcachedClient;
    -------------------------------------------------------------------------------------------------------------------------------




  • 相关阅读:
    前端性能优化
    web缓存
    js实现数组去重并且显示重复的元素和索引值
    前端面试简单整理
    js记录重复字母的个数
    js数组快速排序
    sql数据库链接
    w3cschool -css
    w3cschool -html
    A*算法在栅格地图上的路径搜索(python实现)
  • 原文地址:https://www.cnblogs.com/LiZhiW/p/4853894.html
Copyright © 2011-2022 走看看