简介
Java客户端比较常用的是Jedis
,Redisson
和lettuce
。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,通常我们会把建立连接池的操作封装成工厂方法,复用连接。而且一些配置信息也会写到配置文件,方便修改,降低耦合。
欢迎关注我的公众号