You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Shing Hing Man <ma...@yahoo.com> on 2013/09/09 12:08:38 UTC

Performance difference between Camel spring redis and standalone Jedis


 Hi,

I have written a standalone program PublishBenchmark.java (please see below)   using Jedis to publish a 2K message to a Redis Channel 100,000 times. 
I repeat the same process using Camel 2.11.1  Camel spring redis component (Please see RedisPublisherBenchmark.java below).
Below is timing for both.

Jedis :  Time taken (in sec) to publish 100000 msgs=1.805
Camel spring redis : Time taken (in sec) to publish 100000 msgs=16.017

Is my configuration for Camel spring redis optimal ?
Is it  expected that Camel spring redis  about 8 times slower than a standalone Jedis program ?

Thanks in advance for any assistance !

Shing 



public class RedisPublisherBenchmark {

    public static void main(String[] args) throws Exception {

        JedisShardInfo hostInfo = new JedisShardInfo("localhost", 6379);
        hostInfo.setPassword("abc123");
        final JedisConnectionFactory CONNECTION_FACTORY = new JedisConnectionFactory(
                hostInfo);

        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
        redisTemplate.setConnectionFactory(CONNECTION_FACTORY);
        // redisTemplate.afterPropertiesSet();

        SimpleRegistry registry = new SimpleRegistry();
        registry.put("redisTemplate", redisTemplate);

        // To get rid of Hex padding
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());

        // create CamelContext
        CamelContext context = new DefaultCamelContext(registry);
        Component direct = new DirectComponent();

        context.addComponent("start", direct);

        final String directEndPoint = "direct:start";

        context.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:start")
                        .to("spring-redis://localhost:6379?redisTemplate=#redisTemplate");
            }
        });
        context.start();

        ProducerTemplate template = context.createProducerTemplate();
        final String payload = getPayload();
        
        
        int NO_OF_MSGS= 100000;
        final Processor processor = new RedisProcessor(payload);

        long start = System.currentTimeMillis();
        
        for (int i = 0; i <NO_OF_MSGS ; ++i) {
            // Publish "Hello world" to a redis channel
            Exchange exchange = template.send(directEndPoint, processor);
        }
        
        long end = System.currentTimeMillis();
        double timeTaken = (end - start)/1000.0;
        
        System.out.println(String.format("Time taken (in sec) to publish %s msgs=%s", NO_OF_MSGS,timeTaken));
        
        System.out.println("Press any key to shutdown.");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.readLine();

        // stop the CamelContext
        context.stop();
    }

    private static String getPayload() {
        String template = "name11:foo11";

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 170; ++i) {
            sb.append(template);
        }

        return sb.toString();

    }

    private static class RedisProcessor implements Processor {

        public String message;

        public RedisProcessor(String message) {
            this.message = message;
        }

        @Override
        public void process(Exchange exchange) throws Exception {
            Message in = exchange.getIn();

            in.setHeader(RedisConstants.COMMAND, "PUBLISH");
            in.setHeader(RedisConstants.CHANNEL, "msjscollector");
            in.setHeader(RedisConstants.MESSAGE, message);

        }

    }

}

============================

public class PublishBenchmark {

    private static final int NO_OF_MSGS = 100000;

    public static void main(String[] args) throws UnknownHostException,
            IOException {
        Jedis jedis = new Jedis("localhost", 6379);
        jedis.connect();
        jedis.auth("abc123");
        jedis.flushAll();

        long begin = System.currentTimeMillis();

        String payload = getPayload();
        
        for (int n = 0; n <= NO_OF_MSGS; ++n) {
            jedis.publish("msjscollector", payload);
            
        }

        double timeTaken = (System.currentTimeMillis() - begin)/1000.0;

        jedis.disconnect();

        System.out.println(String.format("Time taken (in sec) to publish %s msgs=%s", NO_OF_MSGS,timeTaken));
    }

    
    private static String  getPayload(){
        String template ="name11:foo11";  
        
        StringBuilder sb = new StringBuilder();
        for (int i=0; i < 170; ++i){
            sb.append(template);
        }
        
        return sb.toString();
        
        
    }
}

Re: Performance difference between Camel spring redis and standalone Jedis

Posted by Christian Müller <ch...@gmail.com>.
May be Jedis is much more faster than Spring Redis? Can you compare these
both (without using Camel)?
Jedis is Apache license 2.0 [1], so we could offer a component for Jedis
too...

[1] http://code.google.com/p/jedis/

Best,
Christian
-----------------

Software Integration Specialist

Apache Camel committer: https://camel.apache.org/team
V.P. Apache Camel: https://www.apache.org/foundation/
Apache Member: https://www.apache.org/foundation/members.html

https://www.linkedin.com/pub/christian-mueller/11/551/642


On Mon, Sep 9, 2013 at 12:08 PM, Shing Hing Man <ma...@yahoo.com> wrote:

>
>
>  Hi,
>
> I have written a standalone program PublishBenchmark.java (please see
> below)   using Jedis to publish a 2K message to a Redis Channel 100,000
> times.
> I repeat the same process using Camel 2.11.1  Camel spring redis component
> (Please see RedisPublisherBenchmark.java below).
> Below is timing for both.
>
> Jedis :  Time taken (in sec) to publish 100000 msgs=1.805
> Camel spring redis : Time taken (in sec) to publish 100000 msgs=16.017
>
> Is my configuration for Camel spring redis optimal ?
> Is it  expected that Camel spring redis  about 8 times slower than a
> standalone Jedis program ?
>
> Thanks in advance for any assistance !
>
> Shing
>
>
>
> public class RedisPublisherBenchmark {
>
>     public static void main(String[] args) throws Exception {
>
>         JedisShardInfo hostInfo = new JedisShardInfo("localhost", 6379);
>         hostInfo.setPassword("abc123");
>         final JedisConnectionFactory CONNECTION_FACTORY = new
> JedisConnectionFactory(
>                 hostInfo);
>
>         RedisTemplate<String, String> redisTemplate = new
> RedisTemplate<String, String>();
>         redisTemplate.setConnectionFactory(CONNECTION_FACTORY);
>         // redisTemplate.afterPropertiesSet();
>
>         SimpleRegistry registry = new SimpleRegistry();
>         registry.put("redisTemplate", redisTemplate);
>
>         // To get rid of Hex padding
>         redisTemplate.setKeySerializer(new StringRedisSerializer());
>         redisTemplate.setValueSerializer(new StringRedisSerializer());
>
>         // create CamelContext
>         CamelContext context = new DefaultCamelContext(registry);
>         Component direct = new DirectComponent();
>
>         context.addComponent("start", direct);
>
>         final String directEndPoint = "direct:start";
>
>         context.addRoutes(new RouteBuilder() {
>             @Override
>             public void configure() throws Exception {
>                 from("direct:start")
>
> .to("spring-redis://localhost:6379?redisTemplate=#redisTemplate");
>             }
>         });
>         context.start();
>
>         ProducerTemplate template = context.createProducerTemplate();
>         final String payload = getPayload();
>
>
>         int NO_OF_MSGS= 100000;
>         final Processor processor = new RedisProcessor(payload);
>
>         long start = System.currentTimeMillis();
>
>         for (int i = 0; i <NO_OF_MSGS ; ++i) {
>             // Publish "Hello world" to a redis channel
>             Exchange exchange = template.send(directEndPoint, processor);
>         }
>
>         long end = System.currentTimeMillis();
>         double timeTaken = (end - start)/1000.0;
>
>         System.out.println(String.format("Time taken (in sec) to publish
> %s msgs=%s", NO_OF_MSGS,timeTaken));
>
>         System.out.println("Press any key to shutdown.");
>         BufferedReader br = new BufferedReader(new
> InputStreamReader(System.in));
>         br.readLine();
>
>         // stop the CamelContext
>         context.stop();
>     }
>
>     private static String getPayload() {
>         String template = "name11:foo11";
>
>         StringBuilder sb = new StringBuilder();
>         for (int i = 0; i < 170; ++i) {
>             sb.append(template);
>         }
>
>         return sb.toString();
>
>     }
>
>     private static class RedisProcessor implements Processor {
>
>         public String message;
>
>         public RedisProcessor(String message) {
>             this.message = message;
>         }
>
>         @Override
>         public void process(Exchange exchange) throws Exception {
>             Message in = exchange.getIn();
>
>             in.setHeader(RedisConstants.COMMAND, "PUBLISH");
>             in.setHeader(RedisConstants.CHANNEL, "msjscollector");
>             in.setHeader(RedisConstants.MESSAGE, message);
>
>         }
>
>     }
>
> }
>
> ============================
>
> public class PublishBenchmark {
>
>     private static final int NO_OF_MSGS = 100000;
>
>     public static void main(String[] args) throws UnknownHostException,
>             IOException {
>         Jedis jedis = new Jedis("localhost", 6379);
>         jedis.connect();
>         jedis.auth("abc123");
>         jedis.flushAll();
>
>         long begin = System.currentTimeMillis();
>
>         String payload = getPayload();
>
>         for (int n = 0; n <= NO_OF_MSGS; ++n) {
>             jedis.publish("msjscollector", payload);
>
>         }
>
>         double timeTaken = (System.currentTimeMillis() - begin)/1000.0;
>
>         jedis.disconnect();
>
>         System.out.println(String.format("Time taken (in sec) to publish
> %s msgs=%s", NO_OF_MSGS,timeTaken));
>     }
>
>
>     private static String  getPayload(){
>         String template ="name11:foo11";
>
>         StringBuilder sb = new StringBuilder();
>         for (int i=0; i < 170; ++i){
>             sb.append(template);
>         }
>
>         return sb.toString();
>
>
>     }
> }