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

 

posted @ 2022-01-14 13:45  残城碎梦  阅读(638)  评论(0编辑  收藏  举报