Redis支持的Java客户端

Redis 的 Java 客户端很多,常用的有三种:Jedis、Redisson 和 lettuce。其中官方推荐使用 Jedis 和 Redisson。 在企业中用的最多的就是 Jedis。Jedis 提供了完整 Redis 命令,而 Redisson 有更多分布式的容器实现。

Jedis

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>3.8.0</version>
</dependency>

单例连接

Jedis jedis = new Jedis("127.0.0.1", 6379);
//ping 通显示 PONG
System.out.println(jedis.ping());// 去 ping 我们 redis 的主机所在 ip 和端口
jedis.set("test", "1234");
System.out.println(jedis.get("test"));

JedisPool 连接池

单一 Jedis 实例不是线程安全的, JedisPool 是一个线程安全的网络连接池。可以用 JedisPool 创建一些可靠 Jedis 实例,可以从池中拿到 Jedis 的实例。这种方式可以解决那些问题并且会实现高效的性能。

JedisPoolConfig config = new JedisPoolConfig();
// 连接池最大空闲数
config.setMaxIdle(300);
// 最大连接数
config.setMaxTotal(1000);
// 在空闲时检查有效性
config.setTestOnBorrow(true);
/*
 * GenericObjectPoolConfig poolConfig, String host, int port, int timeout, String password
 * redis 地址
 * redis 端口
 * 连接超时时间
 * */
JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 20000);

Jedis jedis = jedisPool.getResource();
jedis.del("test");
jedis.close();

主从复制

Jedis jedis_S = new Jedis("127.0.0.1", 6300);
Jedis jedis_M = new Jedis("127.0.0.1", 6390);
// 从机连接到主机
jedis_S.slaveof("127.0.0.1",6390);

// 主机写入
jedis_M.set("class","1122");

// 从机读取
String result = jedis_S.get("class");
System.out.println(result);

哨兵模式

// 哨兵节点列表
Set<String> sentinels = new HashSet<String>();
sentinels.add("127.0.0.1:26379");
sentinels.add("127.0.0.1:26380");
sentinels.add("127.0.0.1:26381");

JedisPoolConfig config = new JedisPoolConfig();
// 连接池最大空闲数
config.setMaxIdle(300);
// 最大连接数
config.setMaxTotal(1000);
// 在空闲时检查有效性
config.setTestOnBorrow(true);

// 监听的主节点名称
JedisSentinelPool sentinelPool = new JedisSentinelPool("mybaster", sentinels, config);

集群模式

Set<HostAndPort> hostAndPorts = new HashSet<HostAndPort>();
hostAndPorts.add(new HostAndPort("127.0.0.1", 6379));
hostAndPorts.add(new HostAndPort("127.0.0.1", 6380));
hostAndPorts.add(new HostAndPort("127.0.0.1", 6381));

JedisPoolConfig config = new JedisPoolConfig();
// 连接池最大空闲数
config.setMaxIdle(300);
// 最大连接数
config.setMaxTotal(1000);
// 在空闲时检查有效性
config.setTestOnBorrow(true);

JedisCluster jedisCluster = new JedisCluster(hostAndPorts, config);

Redisson

Redisson 采用了基于 NIO 的 Netty 框架,不仅能作为 Redis 底层驱动客户端,具备提供对 Redis 各种组态形式的连接功能,对 Redis 命令能以同步发送、异步形式发送、异步流形式发送或管道形式发送的功能,LUA 脚本执行处理,以及处理返回结果的功能,还在此基础上融入了更高级的应用方案,不但将原生的 Redis Hash,List,Set,String,Geo,HyperLogLog 等数据结构封装为 Java 里大家最熟悉的映射(Map),列表(List),集(Set),通用对象桶(Object Bucket),地理空间对象桶(Geospatial Bucket),基数估计算法(HyperLogLog)等结构,在这基础上还提供了分布式的多值映射(Multimap),本地缓存映射(LocalCachedMap),有序集(SortedSet),计分排序集(ScoredSortedSet),字典排序集(LexSortedSet),列队(Queue),阻塞队列(Blocking Queue),有界阻塞列队(Bounded Blocking Queue),双端队列(Deque),阻塞双端列队(Blocking Deque),阻塞公平列队(Blocking Fair Queue),延迟列队(Delayed Queue),布隆过滤器(Bloom Filter),原子整长形(AtomicLong),原子双精度浮点数(AtomicDouble),BitSet 等 Redis 原本没有的分布式数据结构。不仅如此,Redisson 还实现了 Redis 文档中提到像分布式锁 Lock 这样的更高阶应用场景。事实上 Redisson 并没有不止步于此,在分布式锁的基础上还提供了联锁(MultiLock),读写锁(ReadWriteLock),公平锁(Fair Lock),红锁(RedLock),信号量(Semaphore),可过期性信号量(PermitExpirableSemaphore)和闭锁(CountDownLatch)这些实际当中对多线程高并发应用至关重要的基本部件。正是通过实现基于 Redis 的高阶应用方案,使 Redisson 成为构建分布式系统的重要工具。

在提供这些工具的过程当中,Redisson 广泛的使用了承载于 Redis 订阅发布功能之上的分布式话题(Topic)功能。使得即便是在复杂的分布式环境下,Redisson 的各个实例仍然具有能够保持相互沟通的能力。在以这为前提下,结合了自身独有的功能完善的分布式工具,Redisson 进而提供了像分布式远程服务(Remote Service),分布式执行服务(Executor Service)和分布式调度任务服务(Scheduler Service)这样适用于不同场景的分布式服务。使得 Redisson 成为了一个基于 Redis 的 Java 中间件(Middleware)。

<dependency>
	<groupId>org.redisson</groupId>
	<artifactId>redisson</artifactId>
	<version>3.15.0</version>
</dependency>

Redisson 的配置方法分为程序配置文件配置两种方式。

程序化配置:

Config config = new Config();
config.useSingleServer().setAddress("127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);

文件方式配置:

single.yml 文件内容如下

singleServerConfig:
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  subscriptionsPerConnection: 5
  address: redis://127.0.0.1:6379
  subscriptionConnectionMinimumIdleSize: 1
  subscriptionConnectionPoolSize: 50
  connectionMinimumIdleSize: 10
  connectionPoolSize: 64
  database: 0
threads: 0
nettyThreads: 0
codec:
  class: org.redisson.codec.JsonJacksonCodec
Config config = Config.fromYAML(new File("D:\\workspace\\emptyPro\\redisson\\src\\main\\resources\\single.yml"));
RedissonClient redisson = Redisson.create(config);
String yml = redisson.getConfig().toYAML();
System.out.println(yml);

1、单点

上面的 single.yml 就是演示单点配置。

配置类:org.redisson.config.SingleServerConfig

2、主从模式

配置类:org.redisson.config.MasterSlaveServersConfig

Config config = new Config();
Set<String> slaveSet = new HashSet<String>();
slaveSet.add("redis://127.0.0.1:6300");
config.useMasterSlaveServers()
		.setMasterAddress("redis://127.0.0.1:6390")
		.setDatabase(0)
		.setKeepAlive(true)
		.setConnectTimeout(10)
		.setSlaveAddresses(slaveSet);
RedissonClient redisson = Redisson.create(config);
String yml = redisson.getConfig().toYAML();
System.out.println(yml);

输出配置如下:

masterSlaveServersConfig:
  idleConnectionTimeout: 10000
  connectTimeout: 10
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  subscriptionsPerConnection: 5
  sslEnableEndpointIdentification: true
  sslProvider: "JDK"
  pingConnectionInterval: 30000
  keepAlive: true
  tcpNoDelay: false
  slaveConnectionMinimumIdleSize: 24
  slaveConnectionPoolSize: 64
  failedSlaveReconnectionInterval: 3000
  failedSlaveCheckInterval: 180000
  masterConnectionMinimumIdleSize: 24
  masterConnectionPoolSize: 64
  readMode: "SLAVE"
  subscriptionMode: "MASTER"
  subscriptionConnectionMinimumIdleSize: 1
  subscriptionConnectionPoolSize: 50
  dnsMonitoringInterval: 5000
  slaveAddresses:
  - "redis://127.0.0.1:6300"
  masterAddress: "redis://127.0.0.1:6390"
  database: 0
threads: 16
nettyThreads: 32
referenceEnabled: true
transportMode: "NIO"
lockWatchdogTimeout: 30000
reliableTopicWatchdogTimeout: 600000
keepPubSubOrder: true
useScriptCache: false
minCleanUpDelay: 5
maxCleanUpDelay: 1800
cleanUpKeysAmount: 100
useThreadClassLoader: true

3、哨兵模式

配置类:org.redisson.config.SentinelServersConfig

Config config = new Config();
config.useSentinelServers()
		.setMasterName("mymaster")
		.setKeepAlive(true)
		.setConnectTimeout(10000)
		.addSentinelAddress("redis://127.0.0.1:26379", "redis://127.0.0.1:26380", "redis://127.0.0.1:26381");
RedissonClient redisson = Redisson.create(config);
String yml = redisson.getConfig().toYAML();
System.out.println(yml);

4、集群模式

Config config = new Config();
config.useClusterServers()
		.setScanInterval(100)
		.setKeepAlive(true)
		.addNodeAddress("redis://127.0.0.1:6379","redis://127.0.0.1:6380","redis://127.0.0.1:6381");
RedissonClient redisson = Redisson.create(config);
String yml = redisson.getConfig().toYAML();
System.out.println(yml);

更多详细内容,请前往:Redisson 使用手册

lettuce

Lettuce 是一个高性能基于 Java 编写的 Redis 驱动框架,底层集成了 Project Reactor 提供自然的反应式编程,通讯框架集成了 Netty 使用了非阻塞 IO,5.x 版本以后融合了 JDK1.8 的异步编程特性,在保证高性能的同时提供了十分丰富易用的 API,5.1 版本的新特性以下:

  • 支持 Redis 的新增命令 ZPOPMIN, ZPOPMAX, BZPOPMIN, BZPOPMAX。
  • 支持经过 Brave 模块跟踪 Redis 命令执行。
  • 支持 Redis Streams。
  • 支持异步的主从链接。
  • 支持异步链接池。
  • 新增命令最多执行一次模式(禁止自动重连)。
  • 全局命令超时设置(对异步和反应式命令也有效)。
  • ...... 等等

注意一点:Redis 的版本至少须要 2.6,固然越高越好,API 的兼容性比较强大。

参考:Redis 高级客户端 Lettuce

 


__EOF__

  • 本文作者: 残城碎梦
  • 本文链接: https://www.cnblogs.com/xfeiyun/p/15801548.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。