Redis实践(三)基于jedis开发java应用:redis的8种方式设置key,value
2016-11-16 22:36
1021 查看
前面已经进行了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实例)
在elipse中创建工程,并且将上面三个jar包放到lib目录中,并且添加到buildpath
下面,对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比,代码如下:(主要从网上获取,少量改动)
下面是运行的结果。
从图中可以看出,异步调用的效率非常高。
一、目标
搭建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种不同的接口进行测试,比较一下调用的效率
下面是运行的结果。
从图中可以看出,异步调用的效率非常高。
相关文章推荐
- Redis实践(三)基于jedis开发java应用:redis的8种方式设置key,value
- 在Java中使用Jedis操作Redis,在高并发的情况下,应用卡死、报无法获取连接错误的处理方式
- Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- 基于Key-Value对的排序(Java版)
- iOS开发UI篇—ios应用数据存储方式(偏好设置)
- 基于PhoneGap与Java开发的Android应用的性能对比
- Redis((支持网络、基于内存、可持久化、日志型、key-Value数据库))百度百科
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- Quartz应用实践入门案例二(基于java工程)
- Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
- 四、Java内存数据库实践之深入浅出Redis - Java Client - Jedis的使用
- Redis 的 Java 客户端开发包 Jedis
- 【iOS开发-60】案例学习:多组数据的tableView设置、添加右側组索引、多层数据模型设置以及valueForKeyPath
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- iOS开发UI篇—ios应用数据存储方式(偏好设置)
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- 【Tools.Redis】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍