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的兼容性比较强大。