Twemproxy

来源:互联网 发布:selenium 隐藏元素 js 编辑:程序博客网 时间:2024/06/04 18:03

概述

twemproxy(发音"two-em-proxy"),是一个memcached和redis协议的快速而轻量级的代理。它的建立主要是减少后端缓存服务器上的连接。基于这一点,协议流水线和分片一起使你能够水平缩放你的分布式缓存架构,它最大的特性和优势就是可以水平缩放分布式缓存架构,如果你的应用内存数据量会不断增加且较大,强烈建议使用它

注意:因为做了分片,所以有一些命令是不支持的,查看不支持的命令列表;

特性

  • 速度快
  • 轻量级
  • 维护持久的服务器连接
  • 保持后端服务器连接数低
  • 启用请求和响应的管道
  • 支持代理到多个服务器
  • 同时支持多个服务器池
  • 在多个服务器间自动分片
  • 实现完整的memcached ascii 和 redis协议
  • 服务器配置简单,通过一个YAML文件即可
  • 支持多种哈希模式包括一致性哈希和分配
  • 可以在故障时配置禁止某个节点
  • 通过暴露的统计监听端口提供可观测性
  • 支持Linux,*BSD,OS X 和 SmartOS(Salaris)

部署架构图

 

  • Twemproxy实际上只是一个代理,不保存任何数据,只建立client和Redis实例的通道;
  • 添加缓存数据时通过一定的算法将数据分片进入不同的Redis实例。

用法

客户端是使用非常简单,只需要将原来单机redis的地址改为代理的地址即可,注意同时连接多个代理稍微有些不同,建议使用这种方式

连接多个代理
public static void testMultiTwemproxy(){
        Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
        //Jedis Cluster will attempt to discover cluster nodes automatically
        jedisClusterNodes.add(new HostAndPort("192.168.45.135"22122));
        jedisClusterNodes.add(new HostAndPort("192.168.45.136"22122));
        JedisCluster jc = new JedisCluster(jedisClusterNodes);
        for (int i = 0; i < 10000; i++) {
            String key = "singlekey" + i;
            jc.set(key, "singleValue" + i);
            System.out.println(jc.get(key));
        }
        String value = jc.get("foo");
    }
连接单个代理
public static void testSingleProxy() throws Exception{
        Jedis jedis = new Jedis("192.168.45.136"22122);
        for (int i = 0; i < 10000000; i++) {
            try {
                String key = "testkey" + i;
                jedis.set(key, "value" + i);
                System.out.println(jedis.get(key));
                Thread.sleep(5);
            catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
                i--;
            }
        }
    }