Redis实践(三)基于jedis开发java应用:redis的8种方式设置key,value

前面已经进行了redis的部署实践,下面要进行redis的java开发实践

一、目标

  搭建java开发环境,采用eclipse开发工具

  验证redis的写数据的8种方式的效率

二、环境准备

开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java。 Java的安装配置可以参考我们的 Java开发环境配置 接下来让我们安装 Java redis 驱动:
        首先你需要下载驱动包,下载 jedis.jar,我在本次实践中用的jedis的jar包是2.8.0 版本的。同时,要保证java工程可以正常运行,还需要下载commons-pool2-2.3.jar以及 
hamcrest-core-1.3.jar。

        然后,在redis服务上,配置好6379,6380 两个端口的配置文件,启动redis(因为后面需要用分布式的调用,所以需要启动两个redis实例)

三、java工程

在elipse中创建工程,并且将上面三个jar包放到lib目录中,并且添加到buildpath

 

    下面,对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比,代码如下:(主要从网上获取,少量改动)

package com.cwqsolo.redis.test;

import java.util.Arrays; 
import java.util.List; 

import redis.clients.jedis.Jedis; 
import redis.clients.jedis.JedisPoolConfig; 
import redis.clients.jedis.JedisShardInfo; 
import redis.clients.jedis.Pipeline; 
import redis.clients.jedis.ShardedJedis; 
import redis.clients.jedis.ShardedJedisPipeline; 
import redis.clients.jedis.ShardedJedisPool; 
import redis.clients.jedis.Transaction; 


//RedisDemo  用来测试redis的使用接口
public class RedisDemo { 

    private static Jedis jedis; 
    private static ShardedJedis sharding; 
    static ShardedJedisPool pool;

    public static void init() throws Exception { 
        List<JedisShardInfo> shards = Arrays.asList( 
                new JedisShardInfo("192.168.136.144",6379),
                new JedisShardInfo("192.168.136.144",6380)
                ); //使用相同的ip:port,仅作测试 


        jedis = new Jedis("192.168.136.144"); 
        sharding = new ShardedJedis(shards); 
        JedisPoolConfig config =new JedisPoolConfig();//Jedis池配置
        pool = new ShardedJedisPool(config, shards); 
    } 


    public static void CleanUp() throws Exception { 
        jedis.disconnect(); 
        sharding.disconnect(); 
        pool.destroy(); 
    } 


    //测试普通同步方式, 设置10w个key,value,看用时多少。
    public void test1Normal() { 
        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            String result = jedis.set("1n" + i, "1n" + i); 
        } 
        long end = System.currentTimeMillis(); 
        System.out.println("普通同步方式::Simple SET: " + ((end - start)/1000.0) + " seconds"); 
    } 

  //测试事务方式Transactions, 设置10w个key,value,看用时多少。
    public void test2Trans() { 
        long start = System.currentTimeMillis(); 
        Transaction tx = jedis.multi(); 
        for (int i = 0; i < 100000; i++) { 
            tx.set("1t" + i, "1t" + i); 
        } 
        //System.out.println(tx.get("t1000").get()); 

        List<Object> results = tx.exec(); 
        long end = System.currentTimeMillis(); 
        System.out.println("事务方式::Transaction SET: " + ((end - start)/1000.0) + " seconds"); 
    } 


    //采用管道方式,异步方式,一次发送多个指令,
    public void test3Pipelined() { 
        Pipeline pipeline = jedis.pipelined(); 
        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            pipeline.set("p" + i, "p" + i); 
        } 
        //System.out.println(pipeline.get("p1000").get()); 
        List<Object> results = pipeline.syncAndReturnAll(); 
        long end = System.currentTimeMillis(); 
        System.out.println("管道方式异步::Pipelined SET: " + ((end - start)/1000.0) + " seconds"); 
    } 

    //管道中调用事务, 
    public void test4combPipelineTrans() { 
        long start = System.currentTimeMillis(); 
        Pipeline pipeline = jedis.pipelined(); 
        pipeline.multi(); 
        for (int i = 0; i < 100000; i++) { 
            pipeline.set("" + i, "" + i); 
        } 
        //与管道的区别在这里
        pipeline.exec(); 
        List<Object> results = pipeline.syncAndReturnAll(); 
        long end = System.currentTimeMillis(); 
        System.out.println("管道中调用事务::Pipelined transaction: " + ((end - start)/1000.0) + " seconds"); 
    } 

    //分布式直连同步调用,用到了分片
    public void test5shardNormal() { 
        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            String result = sharding.set("sn" + i, "n" + i); 
        } 
        long end = System.currentTimeMillis(); 
        System.out.println("分布式直连同步::Simple@Sharing SET: " + ((end - start)/1000.0) + " seconds"); 
    } 

    //分布式直连异步调用
    public void test6shardpipelined() { 
	//采用sharding 对象
        ShardedJedisPipeline pipeline = sharding.pipelined(); 
        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            pipeline.set("sp" + i, "p" + i); 
        } 
        List<Object> results = pipeline.syncAndReturnAll(); 
        long end = System.currentTimeMillis(); 
        System.out.println("分布式直连异步::Pipelined@Sharing SET: " + ((end - start)/1000.0) + " seconds"); 
    } 

    //分布式连接池同步调用, 线程安全
    public void test7shardSimplePool() { 
        ShardedJedis one = pool.getResource(); 

        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            String result = one.set("spn" + i, "n" + i); 
        } 
        long end = System.currentTimeMillis(); 
        pool.returnResource(one); 
        System.out.println("分布式连接池同步调用::Simple@Pool SET: " + ((end - start)/1000.0) + " seconds"); 
    } 

    //分布式连接池异步调用
    public void test8shardPipelinedPool() { 
        ShardedJedis one = pool.getResource(); 

        ShardedJedisPipeline pipeline = one.pipelined(); 

        long start = System.currentTimeMillis(); 
        for (int i = 0; i < 100000; i++) { 
            pipeline.set("sppn" + i, "n" + i); 
        } 
        List<Object> results = pipeline.syncAndReturnAll(); 
        long end = System.currentTimeMillis(); 
        pool.returnResource(one); 
        System.out.println("分布式连接池异步调用::Pipelined@Pool SET: " + ((end - start)/1000.0) + " seconds"); 
    } 
    
    
  
    public static void main(String[] args) {
         
	RedisDemo testDemo = new RedisDemo();
	try {
	testDemo.init();
	}catch (Exception Exc) {
		
		Exc.printStackTrace();
		System.exit(0);
	}
	
	System.out.println("init complete sucessfully!!!"); 

	//测试普通同步方式
	testDemo.test1Normal();
	//测试事务方式Transactions
	testDemo.test2Trans();
	//采用管道方式,异步方式
	testDemo.test3Pipelined();
	//管道中调用事务,
	testDemo.test4combPipelineTrans();
	//分布式直连同步调用,用到了分片
	testDemo.test5shardNormal();
	//分布式直连异步调用
	testDemo.test6shardpipelined();
	//分布式连接池同步调用, 线程安全
	testDemo.test7shardSimplePool();
	//分布式连接池异步调用, 线程安全
	testDemo.test8shardPipelinedPool();
	

	try {
	    testDemo.CleanUp();
		}catch (Exception Exc) {
			
			Exc.printStackTrace();
			System.exit(0);
		}
       
    }
    
    
} 
整个代码,都是对redis进行key,value的设定,数据大小为10w,通过8种不同的接口进行测试,比较一下调用的效率

下面是运行的结果。


从图中可以看出,异步调用的效率非常高。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值