Jedis-java连接redis的客户端-redis单节点,哨兵和集群模式

简介

Java客户端比较常用的是JedisRedissonlettuce。Jedis是Redis官方推荐的Java连接开发工具。

优点: 

  • Jedis:比较全面的提供了Redis的操作特性  
  • Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列  
  • Lettuce:主要在一些分布式缓存框架上使用比较多

可伸缩:

  • Jedis:使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。
  • Redisson:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作
  • Lettuce:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作 

pom 引入Jedis依赖

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.1.0</version>
</dependency>

单主机连接模式

public static void  testRedis() {
    String host = "127.0.0.1";
    int port = 6379;
    //连接 Redis 服务
    Jedis jedis = new Jedis(host, port);
    // jedis.auth(password);
    System.out.println("连接成功");
    //设置 redis 字符串数据
    jedis.set("okayjam", "www.okayjam.com");
    // 获取存储的数据并输出
    System.out.println("redis 存储的字符串为: "+ jedis.get("okayjam"));
    jedis.close();
}

连接池

Jedis连接池是基于apache-commons pool2实现的。

public static void  testRedisPool() {
    String host = "192.168.242.128";
    int port = 6379;
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxIdle(8);
    config.setMaxTotal(18);
    //连接 Redis 服务
    JedisPool pool = new JedisPool(config, host, port, 2000);
    //  JedisPool pool = new JedisPool(config, host, port, 2000,"password");
    Jedis jedis = pool.getResource();
    //设置 redis 字符串数据
    jedis.set("okayjam", "www.okayjam.com");
    // 获取存储的数据并输出
    System.out.println("redis 存储的字符串为: "+ jedis.get("okayjam"));
    // 需要关闭把连接释放回连接池
    jedis.close();
}

哨兵模式

哨兵模式,连接的时候会通过哨兵寻找主节点,找到之后会连接主节点,而且在主节点宕机之后也可以通过监控重新连接新的主节点,这个过程是客户端就已经我们做的事情,我们也不需要关注哪个节点是主节点。

public static void testSentinel() {
    String masterName = "mymaster";
    String password = "";
    // 设置参数
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMaxTotal(10);
    jedisPoolConfig.setMaxIdle(5);
    jedisPoolConfig.setMinIdle(5);
    // 哨兵信息,注意填写哨兵的地址
    Set<String> sentinels = new HashSet<>(Arrays.asList("192.168.242.128:28021","192.168.242.128:28022","192.168.242.128:28023"));
    // 创建连接池
    JedisSentinelPool pool = new JedisSentinelPool(masterName, sentinels, jedisPoolConfig);
    //JedisSentinelPool pool = new JedisSentinelPool(masterName, sentinels,jedisPoolConfig, password);
    // 获取客户端
    Jedis jedis = pool.getResource();
    // 执行两个命令
    jedis.set("okayjam", "www.okayjam.com");
    String value = jedis.get("okayjam");
    System.out.println(value);
}

集群模式

集群中可以直接连接任意一个主节点,如果发现数据不在当前节点,会发出moved命令定位到数据所在的节点。

public static void testCluster() {
    // 配置参数,根据服务器情况设置连接参数
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxIdle(100);
    // 添加集群master地址
    Set<HostAndPort> jedisClusterSet = new HashSet<>();
    jedisClusterSet.add(new HostAndPort("192.168.242.128", 8201));
    jedisClusterSet.add(new HostAndPort("192.168.242.128", 8202));
    jedisClusterSet.add(new HostAndPort("192.168.242.128", 8203));
    // 连接集群
    JedisCluster jedisCluster = new JedisCluster(jedisClusterSet, config);
    // r如果带密码
    //JedisCluster jedisCluster  = new JedisCluster(jedisClusterSet,1000, 1000, 5, password, config);
    // 设置key
    jedisCluster.set("okayjam", "www.okayjam.com");
    // 读取key
    System.out.println(jedisCluster.get("okayjam"));
}

上面是三种方式连接redis,通常我们会把建立连接池的操作封装成工厂方法,复用连接。而且一些配置信息也会写到配置文件,方便修改,降低耦合。

欢迎关注我的公众号
只说一点点点点

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据