【问题标题】:Since we do not have binding of redis cluster, How to run ycsb to test redis cluster?由于我们没有绑定redis集群,如何运行ycsb来测试redis集群?
【发布时间】:2016-06-01 20:51:26
【问题描述】:

我正在研究redis。我已经使用三个主节点构建了我的 Redis 集群,并且我有另一个节点用于运行 ycsb。我遇到了与中所述相同的问题 To start YCSB load with cluster enabled option for REDIS。 我尝试根据给出的答案编辑 RedisClient.java。但是我遇到了错误: 导入 redis.clients.jedis.HostAndPort; 导入 redis.clients.jedis.JedisCluster; ,因为这些包不存在。所以我的问题是在哪里可以找到像 redis.clients.jedis.JedisCluster 这样的包?有没有人成功编辑 RedisClient.java 以测试 redis 集群,或者我们有其他解决方案吗?谢谢!

【问题讨论】:

    标签: ycsb redis-cluster


    【解决方案1】:

    ycsb 的默认redis 客户端不支持redis 集群。所以要使用ycsb对redis集群进行基准测试,我们必须修改redis客户端(RedisClient.java)并使用maven重新编译代码。以下代码对我有用:

    /**
     * Copyright (c) 2012 YCSB contributors. All rights reserved.
     *
     * Licensed under the Apache License, Version 2.0 (the "License"); you
     * may not use this file except in compliance with the License. You
     * may obtain a copy of the License at
     *
     * http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
     * implied. See the License for the specific language governing
     * permissions and limitations under the License. See accompanying
     * LICENSE file.
     */
    
    /**
     * Redis client binding for YCSB.
     *
     * All YCSB records are mapped to a Redis *hash field*.  For scanning
     * operations, all keys are saved (by an arbitrary hash) in a sorted set.
     */
    
    package com.yahoo.ycsb.db;
    
    import com.yahoo.ycsb.ByteIterator;
    import com.yahoo.ycsb.DB;
    import com.yahoo.ycsb.DBException;
    import com.yahoo.ycsb.Status;
    import com.yahoo.ycsb.StringByteIterator;
    
    
    import redis.clients.jedis.Protocol;
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Properties;
    import java.util.Set;
    import java.util.Vector;
    
    import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.JedisCluster;
    import java.util.HashSet;
    
    /**
     * YCSB binding for <a href="http://redis.io/">Redis</a>.
     *
     * See {@code redis/README.md} for details.
     */
    public class RedisClient extends DB {
    
      private JedisCluster jedis;
    
      public static final String HOST_PROPERTY = "redis.host";
      public static final String PORT_PROPERTY = "redis.port";
      public static final String PASSWORD_PROPERTY = "redis.password";
    
      public static final String INDEX_KEY = "_indices";
    
      public void init() throws DBException {
        Properties props = getProperties();
        int port;
        Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
    
        String portString = props.getProperty(PORT_PROPERTY);
        if (portString != null) {
          port = Integer.parseInt(portString);
        } else {
          port = Protocol.DEFAULT_PORT;
        }
        String host = props.getProperty(HOST_PROPERTY);
    
        jedisClusterNodes.add(new HostAndPort(host, port));
    
        jedis = new JedisCluster(jedisClusterNodes);
    
    
        String password = props.getProperty(PASSWORD_PROPERTY);
        if (password != null) {
          jedis.auth(password);
        }
      }
    
      public void cleanup() throws DBException {
    
      }
    
      /*
       * Calculate a hash for a key to store it in an index. The actual return value
       * of this function is not interesting -- it primarily needs to be fast and
       * scattered along the whole space of doubles. In a real world scenario one
       * would probably use the ASCII values of the keys.
       */
      private double hash(String key) {
        return key.hashCode();
      }
    
      // XXX jedis.select(int index) to switch to `table`
    
      @Override
      public Status read(String table, String key, Set<String> fields,
          HashMap<String, ByteIterator> result) {
        if (fields == null) {
          StringByteIterator.putAllAsByteIterators(result, jedis.hgetAll(key));
        } else {
          String[] fieldArray =
              (String[]) fields.toArray(new String[fields.size()]);
          List<String> values = jedis.hmget(key, fieldArray);
    
          Iterator<String> fieldIterator = fields.iterator();
          Iterator<String> valueIterator = values.iterator();
    
          while (fieldIterator.hasNext() && valueIterator.hasNext()) {
            result.put(fieldIterator.next(),
                new StringByteIterator(valueIterator.next()));
          }
          assert !fieldIterator.hasNext() && !valueIterator.hasNext();
        }
        return result.isEmpty() ? Status.ERROR : Status.OK;
      }
    
      @Override
      public Status insert(String table, String key,
          HashMap<String, ByteIterator> values) {
        if (jedis.hmset(key, StringByteIterator.getStringMap(values))
            .equals("OK")) {
          jedis.zadd(INDEX_KEY, hash(key), key);
          return Status.OK;
        }
        return Status.ERROR;
      }
    
      @Override
      public Status delete(String table, String key) {
        return jedis.del(key) == 0 && jedis.zrem(INDEX_KEY, key) == 0 ? Status.ERROR
            : Status.OK;
      }
    
      @Override
      public Status update(String table, String key,
          HashMap<String, ByteIterator> values) {
        return jedis.hmset(key, StringByteIterator.getStringMap(values))
            .equals("OK") ? Status.OK : Status.ERROR;
      }
    
      @Override
      public Status scan(String table, String startkey, int recordcount,
          Set<String> fields, Vector<HashMap<String, ByteIterator>> result) {
        Set<String> keys = jedis.zrangeByScore(INDEX_KEY, hash(startkey),
            Double.POSITIVE_INFINITY, 0, recordcount);
    
        HashMap<String, ByteIterator> values;
        for (String key : keys) {
          values = new HashMap<String, ByteIterator>();
          read(table, key, fields, values);
          result.add(values);
        }
    
        return Status.OK;
      }
    
    }
    

    我认为这可能对其他人有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 2020-07-17
      • 2019-12-01
      • 2020-03-29
      相关资源
      最近更新 更多