redis cluster jedis client 示例

redis cluster 基本的redis操作示例:

JedisCluster jc = null;
    @Before
    public void before(){
        Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
        //Jedis Cluster will attempt to discover cluster nodes automatically
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));
        jc = new JedisCluster(jedisClusterNodes);
    }
    @Test
    public void test_incr(){
         
        String key = "page_view";
        jc.del(key);
        jc.incr(key);
        String result = jc.get(key);
        System.out.println(result);
        Assertions.assertThat(result).isEqualTo(1+"");
    }
    @Test
    public void test_setAndGetStringVal(){
        String key = "foo";
        String value = "bar";
        jc.set(key, value);
        String result = jc.get(key);
        System.out.println(result);
        Assertions.assertThat(result).isEqualTo(value);
    }
    @Test
    public void test_setAndGetStringVal_and_set_expire() throws InterruptedException{
        String key = "hello";
        String value = "world";
        int seconds = 3;
        jc.setex(key, seconds , value);
        String result = jc.get(key);
        System.out.println(result);
        Assertions.assertThat(result).isEqualTo(value);
        Thread.sleep(seconds*1000);
        result = jc.get(key);
        System.out.println(result);
        Assertions.assertThat(result).isNull();
         
    }
    @Test
    public void test_setAndGetHashVal(){
         
        String key = "website";
        String field= "google";
        String value = "google.com";
        jc.del(key);
        jc.hset(key, field, value);
        String result = jc.hget(key, field);
        System.out.println(result);
        Assertions.assertThat(result).isEqualTo(value);
    }
    @Test
    public void test_setAndGetListVal(){
         
        String key = "mylist";
        jc.del(key);
        String[] vals = {"a","b","c"};
        jc.rpush(key, vals);
        List<String> result = jc.lrange(key, 0, -1);
        System.out.println(result);
        Assertions.assertThat(result).containsExactly(vals);
    }
    @Test
    public void test_setAndGetSetVal(){
         
        String key = "language";
        jc.del(key);
        String[] members = {"java", "ruby", "python"};
        jc.sadd(key, members);
        Set<String> result = jc.smembers(key);
        System.out.println(result);
        Assertions.assertThat(result).containsOnly(members);
    }

演示主从切换时的jedis操作情景:

JedisCluster jc = null;
    @Before
    public void before(){
        Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
        //Jedis Cluster will attempt to discover cluster nodes automatically
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));
        jc = new JedisCluster(jedisClusterNodes);
    }
    /**
     * 在一个无限循环中不停的读写
     * @throws InterruptedException
     */
    @Test
    public void setAndWriteStringValueRepeatedly() throws InterruptedException{
        String key = "test_oper_during_failover";
        jc.del(key);
        long failureTime = 0;
        long recoveryTime = 0;
        while(true){
            try {
                String result = jc.get(key);
                if(failureTime != 0 && recoveryTime==0){
                    recoveryTime =  System.currentTimeMillis();
                    System.out.println("Cluster is recovered! Downtime lasted "+(recoveryTime-failureTime)+" ms");
                }
                     
                System.out.println(result);
                jc.set(key, System.currentTimeMillis()+"");
                 
            } catch (Exception e) {
                if(failureTime==0)
                    failureTime=System.currentTimeMillis();
                e.printStackTrace();
            }
            Thread.sleep(1000);
        }
         
    }

输出:

null
1430663109857
1430663110860
......
redis.clients.jedis.exceptions.JedisClusterMaxRedirectionsException: Too many Cluster redirections?
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:37)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:70)
    ...
...
redis.clients.jedis.exceptions.JedisClusterException: CLUSTERDOWN The cluster is down
    at redis.clients.jedis.Protocol.processError(Protocol.java:111)
    at redis.clients.jedis.Protocol.process(Protocol.java:138)
    ...
Cluster is recovered! Downtime lasted 7089 ms
1430663137897
1430663146602
...

pom.xml:

<properties>
        <junit.version>4.11</junit.version>
        <assertj.version>1.7.0</assertj.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- assertj -->
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>${assertj.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

参考:

https://github.com/xetorthio/jedis

问题:

  1. hostandport 只需要指定一个 host ip和端口?其他的都直接由rediscluster去获取是吧?

    摘自http://redis.io/topics/cluster-tutorial

    此段话是针对ruby client的, 但是我想应该也适用于jedis。

 3  startup_nodes = [
     4      {:host => "127.0.0.1", :port => 7000},
     5      {:host => "127.0.0.1", :port => 7001}
     6  ]
 
The startup nodes don‘t need to be all the nodes of the cluster. The important thing is that at least one node is reachable. Also note that redis-rb-cluster updates this list of startup nodes as soon as it is able to connect with the first node. You should expect such a behavior with any other serious client.
时间: 2024-11-03 03:44:58

redis cluster jedis client 示例的相关文章

redis cluster java client jedisCluster spring集成方法

1.使用jedis的原生JedisCluster spring的applicationContext.xml配置redis的连接.连接池.jedisCluster Bean <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect time out

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed outat redis.clients.jedis.Connection.connect(Connection.java:154)at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:83)at redis.clients

jedis处理redis cluster集群的密码问题

环境介绍:jedis:2.8.0 redis版本:3.2 首先说一下redis集群的方式,一种是cluster的 一种是sentinel的,cluster的是redis 3.0之后出来新的集群方式 本身redis3.2的cluster集群是支持密码的 ,具体怎么搭建,可以查找相关的文档,这里只介绍应用层面的操作 jedis2.8.0的版本没有实现对redis cluster集群的密码操作 在jedis中创建redis cluster的对象时,一般是采用 JedisCluster jedisClu

解决Redis cluster的jedis驱动在高并发下的拥塞问题

redis cluster发布后我们项目中使用了cluster,使用驱动是jedis,但是在压力测试过程中发现有一定数量的redis访问非常缓慢高达几十秒数分钟,经过分析jedis驱动JedisClusterInfoCache中加锁造成 private Map<String, JedisPool> nodes = new HashMap<String, JedisPool>();  private Map<Integer, JedisPool> slots = new

redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set

1.项目启动报错: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool redis.clients.util.Pool.getResource(Pool.java:50) redis.clients.jedis.JedisPool.getResource(JedisPool.java:88) com.radiadesign.catalina.session.

全面剖析Redis Cluster原理和应用 (转)

1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在Cluster推出之前,可用性要靠Sentinel

全面剖析Redis Cluster原理和应用

全面剖析Redis Cluster原理和应用 1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在Cl

Redis中国用户组|唯品会Redis cluster大规模生产实践

嘉宾:陈群 很高兴有机会在Redis中国用户组给大家分享redis cluster的生产实践.目前在唯品会主要负责redis/hbase的运维和开发支持工作,也参与工具开发工作 Outline 一.生产应用场景 二.存储架构演变 三.应用最佳实践 四.运维经验总结 第1.2节:介绍redis cluster在唯品会的生产应用场景,以及存储架构的演变.第3节:redis cluster的稳定性,应用成熟度,踩到过那些坑,如何解决这些问题?这部分是大家比较关心的内容.第4节:简单介绍大规模运营的一些

Redis Essentials 读书笔记 - 第九章: Redis Cluster and Redis Sentinel (Collective Intelligence)

Chapter 9. Redis Cluster and Redis Sentinel (Collective Intelligence) 上一章介绍了复制,一个master可以对应一个或多个slave(replica), 在以下的情况下是够用的: 1. master有足够内存容纳所有key 2. 通过slave可以扩展读,解决网络吞吐量的问题 3. 允许停止master的维护窗口时间 4. 通过slave做数据冗余 但复制解决不了自动failover和自动resharding的问题,在以下的情