Redis的调用方式

package com;

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

import org.junit.Test;

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;

/**
 * redis的几种调用方式
 * @author lenovo
 *
 */
public class Demo1 {

//-------------------------------------------------------单机实例----------------------------------------------------
    /**
     * 普通同步写入操作,写入10万行字符串,大约需要40秒
     */
    @Test
    public void test1Normal() {
        Jedis jedis = new Jedis("192.168.3.134",6379); //需要在LINUX防火墙public里增加6379端口
       // jedis.auth("admin");  //redis服务没有设置密码,如何加上这行会抛出异常
        long start = System.currentTimeMillis();

        for (int i = 0; i < 100000; i++) {
            String result = jedis.set("n" + i, "n" + i);
        }

        long end = System.currentTimeMillis();
        System.out.println("Simple SET: " + ((end - start)/1000.0) + " seconds");
        jedis.disconnect(); //关闭连接
    }

    /**
     * 普通批量事物提交,10万条字符串写入大约0.5秒。
     * REDIS事物不支持回滚
     */
    @Test
    public void test2Trans() {
        Jedis jedis = new Jedis("192.168.3.134",6379);
        long start = System.currentTimeMillis();
        Transaction tx = jedis.multi();
        for (int i = 0; i < 100000; i++) {
            tx.set("t" + i, "t" + i);
        }
        List<Object> results = tx.exec();
        long end = System.currentTimeMillis();
        System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds");
        jedis.disconnect();
    }

    /**
     * 普通异步管道提交。不必等待执行完成返回结果
     */
    @Test
    public void test3Pipelined() {
        Jedis jedis = new Jedis("192.168.3.134",6379);
        Pipeline pipeline = jedis.pipelined();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            pipeline.set("p" + i, "p" + i);
        }
        List<Object> results = pipeline.syncAndReturnAll();
        long end = System.currentTimeMillis();
        System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds");
        jedis.disconnect();
    }

    /**
     * 在管道中使用事物.但是经测试,发现其效率和单独使用事务差不多
     */
    @Test
    public void test4combPipelineTrans() {
        Jedis jedis = new Jedis("192.168.3.134",6379);
        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");
        jedis.disconnect();
    }

//----------------------------分布式---------分布式直连不支持事物,但可以使用管道-----------------------------
    /**
     * 分布式直连,普通同步操作
     */
    @Test
    public void test5shardNormal() {
        List<JedisShardInfo> shards = Arrays.asList(
                new JedisShardInfo("192.168.3.134",6379),
                new JedisShardInfo("192.168.3.134",6379)); //这里在生产环境里换成不同服务器IP。测试发现其中一台机器宕机,将会抛出异常

        ShardedJedis sharding = new ShardedJedis(shards);

        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("[email protected] SET: " + ((end - start)/1000.0) + " seconds");

        sharding.disconnect();
    }

    /**
     * 分布式直连,管道.用junit运行异常,但没有异常信息。将代码放入main方法可正常运行。具体原因不明
     */
    public void test6shardpipelined() {
          List<JedisShardInfo> shards = Arrays.asList(
                    new JedisShardInfo("192.168.3.134",6379),
                    new JedisShardInfo("192.168.3.134",6379)); //这里在生产环境里换成不同服务器IP。测试发现其中一台机器宕机,将会抛出异常

        ShardedJedis sharding = new ShardedJedis(shards);

        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("[email protected] SET: " + ((end - start)/1000.0) + " seconds");

        sharding.disconnect();
    }

//-----------------------------------------分布式连接池-----适合多线程。直连方式不是线程安全的----------------------------------------------
    /**
     * 连接池 同步调用
     */
    @Test
    public void test7shardSimplePool() {
        List<JedisShardInfo> shards = Arrays.asList(
                new JedisShardInfo("192.168.3.134",6379),
                new JedisShardInfo("192.168.3.134",6379));

      ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards); //需要加入commons-pool2-2.4.2包

        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("[email protected] SET: " + ((end - start)/1000.0) + " seconds");

        pool.destroy();
    }

    /**
     * 连接池 管道调用
     */
    @Test
    public void test8shardPipelinedPool() {
         List<JedisShardInfo> shards = Arrays.asList(
                    new JedisShardInfo("192.168.3.134",6379),
                    new JedisShardInfo("192.168.3.134",6379));

        ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);

        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("[email protected] SET: " + ((end - start)/1000.0) + " seconds");
        pool.destroy();
    }

    public static void main(String[] args) {
        Demo1 demo = new Demo1();
        demo.test1Normal();
    }

    @Test
    public void test() {
        System.out.println("test");
    }

}
时间: 2024-11-02 11:25:29

Redis的调用方式的相关文章

Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式的调用方式做一个简单的介绍和对比: 一.普通同步方式 最简单和基础的调用方式: 1 @Test 2 public void test1Normal() { 3 Jedis jedis = new Jedis("localhost"); 4 long start = System.curre

redis两种调用方式实例

在下面的代码示例中,将给出两种最为常用的Redis命令操作方式,既普通调用方式和基于管线的调用方式.    注:在阅读代码时请留意注释. 1 #include <stdio.h>  2#include <stdlib.h>  3#include <stddef.h>  4#include <stdarg.h>  5#include <string.h>  6#include <assert.h>  7#include <hire

Java客户端Jedis的八种调用方式

redis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式的调用方式做一个简单的介绍和对比:  一.普通同步方式 最简单和基础的调用方式, @Test  public void test1Normal() {      Jedis jedis = new Jedis("localhost");      long start = System.c

线程安全的事件调用方式

通常事件调用方式为 //版本1 public event NewEventHandler NewEvent;protected virtual void OnNewEvent(EventArgs e){ if (NewEvent != null) NewEvent(this, e);} 但这种方式的问题在于,在做NewEvent != null 检测之后,NewEvent事件调用之前,事件取消了注册,即NewEvent重新变成null,此时再进行调用,将会抛出异常 线程安全的做法, //版本2

《C++反编译与逆向分析技术揭秘》之学习笔记03--函数的调用方式

※函数的调用方式 EBP:扩展基址指针寄存器(extended base pointer) 其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部. ESP:(Extended stack pointer)是指针寄存器的一种,用于指向栈的栈顶. _cdecl:C/C++默认的调用方式,调用方平衡栈,不定参数的函数可以试用. 调用方:1.参数压栈.esp-=42.调用函数.3.实现栈平衡.esp+=4 此处的printf也是同样道理0x004010CB.0x004010CC两处压入参数,共8个字节

js实现类似于add(1)(2)(3)调用方式的方法

群里有人说实现类似add(1)(2)(3)调用方式的方法,结果马上有人回答: var add = function(a){ return function(b){ return function(c){ return a+b+c; }; }; }; add(1)(2)(3); //6 没错!那要是add(1)(2)(3)(4) 这样4个调用呢,那这个肯定不适用了. 这种就是类似于执行一个函数返回函数自身值: function add(x) { var sum = x; var tmp = fun

简述自己用过的几种异步调用方式

直接上代码 1.BeginInvoke和EndInvoke方式 private static void BeginInvoke1() { Func<int,string> fun = Todo; for (int i = 0; i < 5; i++) { //fun.BeginInvoke(i,TodoCallBack, fun); /* 异步调用委托BeginInvoke * handler.EndInvoke(x)为执行委托的结果 */ fun.BeginInvoke(i, x =&

同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事.   例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个

简单解析三种JAVA调用方式-同步,异步,回调

模块之间有三种调用方式: 1.同步调用 同步调用很简单,就是直接调用方法B,必须等到方法A执行完才会继续执行原程序. 2.异步调用 异步调用,就是在A程序中给程序B一个实现,当B运行的时候,在满足条件的情况下能够调用A程序中的实现.举例说明 public interface Food { void eat(); } public class Cow implements Food { @override void eat() { syso("eat cow"); } } public