说明
- jedis:redis官方推荐的操作redis的原生api,是一个jar包。其方法与redis命令集基本一致。要学习使用jedis,学会redis的命令集便可
- Redis基础教程:http://shuiliumu.eu.org/index.php/archives/132/
- Redis中文网:https://www.redis.net.cn
1. 依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.2</version>
</dependency>
2. 基本使用
- 说明:开启redis服务器,在javaWeb项目中连接,操作redis
Jedis jedis = new Jedis("127.0.0.1",6379); //连接redis
jedis.close(); // 关闭连接
jrfid.xxx // jedis其他方法与命令终端中的命令相同
Transaction multi = jedis.multi(); // 开启事务
multi.xxxx // multi的方法与命令终端中的命令相同,只不过这些命令是以事务方式执行
multi.exec(); //执行事务
multi.discard(); //放弃事务
Jedis
3. Redis连接池配置
- 注意:以下为spring环境下的配置方式
(1)单点连接池配置
-
说明:只连接一台redis服务器时,可使用的配置方式
-
文件名:RedisPoolConfig.java
@Configuration
public class RedisPoolConfig {
/**
* 说明:获取jedis对象方式
* @Autowird
* JedisPool jedisPool;
* Jedis jedis = jedisPool.getResource();
*
**/
@Bean
public JedisPool createJedisPool(){
/******** 配置连接池相关信息 *************/
// 连接池配置对象,封装了连接池相关配置
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(8); // redis总连接数 默认 8
jedisPoolConfig.setMaxIdle(8); // 连接池中最大空闲连接 默认 8
String host = "127.0.0.1";
Integer port = 6379;
/******** 创建连接池 *************/
JedisPool jedisPool = new JedisPool(jedisPoolConfig,host,port);
return jedisPool;
}
}
(2)哨兵连接池配置
- 说明:配置哨兵模式的连接池
1)Redis配置
《1》redis服务器配置
-
复制多个redis.conf文件,分别给不同Redis服务器使用
-
修改配置文件中
# win中不支持,不用配
daemonize yes
# 修改。win中不用配 不与其他服务端口配置相同便可
pidfile xxx.pid
# 修改服务端口号 不与其他服务端口配置相同便可
port xxx
# 修改rdb文件名 不与其他服务端口配置相同便可
dbfilename xxx.rdb
# 修改日志文件名 不与其他服务端口配置相同便可
logfile “xxx.log”
# 配置主节点的ip和端口,配置完后,那么使用该配置文件开启的redis服务,变为从节点
replicaof masterip masterport
# 配置连接主节点密码,若主节点登录要密码,那么将密码配置上。否则从节点无法无法通过验证,连接主节点
masterauth masterpassword
《2》监控服务配置
- 新建监控配置文件
sentinel.conf
并进行配置(若是多哨兵模式,则新建多个文件,分别进行配置)
Linux配置
# Example sentinel.conf
# 哨兵sentinel实例运行的端口 默认26379
port 26379
# 哨兵sentinel的工作目录
dir /tmp
# 哨兵sentinel监控的redis主节点的 ip port
# master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 1
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
# 这个数字越小,完成failover所需的时间就越长,
# 但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
# 可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
# SCRIPTS EXECUTION
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
#这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
#一个是事件的类型,
#一个是事件的描述。
#如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
#通知脚本
# sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/notify.sh
# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是“failover”,
# <role>是“leader”或者“observer”中的一个。
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
Win配置
# 多哨兵模式,修改服务端口号 不与其他哨兵进程相同便可
port 26379
# 多哨兵模式,修改myid 不与其他哨兵进程相同便可(不配也可,会自动生成)
sentinel myid 36722fcfb2a09c023aa59366290b3fe39526cac4
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 127.0.0.1 6381 1
sentinel down-after-milliseconds mymaster 5000
《3》服务开启
redis-sentinel 哨兵模式监控配置文件名.conf # linux中启动哨兵模式
redis-server.exe 哨兵模式监控配置文件名.conf --sentinel # win中开启哨兵模式
redis-server [配置文件] #开启所有redis服务
2)配置类
@Configuration
public class RedisPoolConfig {
/**
* 说明:获取jedis对象方式
* @Autowird
* JedisSentinelPool jedisSentinelPool;
* Jedis jedis = jedisSentinelPool.getResource();
*
**/
@Bean
public JedisSentinelPool createJedisSentinelPool(){
/******** 配置连接池相关信息 *************/
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10);
jedisPoolConfig.setMaxIdle(5);
jedisPoolConfig.setMinIdle(5);
/******** 配置redis服务器信息封装 *************/
// String格式: 服务器host:哨兵port 表示
// "127.0.0.1:26379" 表示 127.0.0.1 地址中所有redis服务器,均被使用26379端口的哨兵监控
Set<String> sentinels = new HashSet<String>(Arrays.asList(
"127.0.0.1:26379",
"127.0.0.1:26380",
"127.0.0.2:26379",
"127.0.0.2:26380"
));
// 主节点名字名称
String masterName = "mymaster";
/******** 创建连接池 *************/
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, jedisPoolConfig);
return jedisSentinelPool;
}
}
3)测试
@Autowired
JedisSentinelPool jedisSentinelPool;
@Test
void test4() {
Jedis resource = jedisSentinelPool.getResource();
resource.set("key2","HelloFromSentinelPool");
String result = resource.get("key2");
System.out.println(result);
}
(3)集群连接池配置(待完善)
- 说明:多redis服务器成集群,为每个服务器配置一个连接池。每个redis服务器均可进行读写操作。JedisCluster对象通过随机抽取方式选取池连接
@Configuration
public class RedisPoolConfig {
/**
* 说明:获取JedisCluster对象方式(其继承有操作redis七大数据类型的所有方法)
* @Autowird
* JedisCluster jedisCluster;
* jedisCluster.xxxxx
*
**/
@Bean
public JedisCluster createJedisCluster(){
/******** 配置连接池相关信息 *************/
// 连接池配置对象,封装了连接池相关配置
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(8); // redis总连接数 默认 8
jedisPoolConfig.setMaxIdle(8); // 连接池中最大空闲连接 默认 8
/******** 配置redis客户端相关信息 *************/
String hostA = "168.192.0.1";
Integer portA = 6379;
// Host,Port封装对象
HostAndPort hostAndPortA = new HostAndPort(hostA,portA);
String hostB = "168.192.0.2";
Integer portB = 6379;
HostAndPort hostAndPortB = new HostAndPort(hostB,portB);
/******** 封装HostAndPort *************/
Set<HostAndPort> set = new HashSet<HostAndPort>();
set.add(hostAndPortA);
set.add(hostAndPortB);
/******** 创建连接池 *************/
JedisCluster jedisCluster = new JedisCluster(set,jedisPoolConfig);
return jedisCluster;
}
}