记录:406
场景:在Spring Boot微服务集成Jedis操作Redis的缓存和队列。
版本:JDK 1.8,Spring Boot 2.6.3,redis-6.2.5,jedis-3.7.1。
1.微服务中配置Redis信息
1.1在application.yml中Jedis配置信息
hub:
example:
redis:
jedis:
host: 192.168.19.203
port: 28001
password: 12345678
timeout: 60000
1.2使用ConfigurationProperties加载Jedis配置
Spring Boot微服务在启动时,自动注解机制会读取application.yml的Jedis相关注入到JedisConnectProperties 对象。
在Spring环境中,注入JedisConnectProperties对象,就能获取到Redis相关配置信息。也就是Jedis客户端必须的参数。
定义JedisConnectProperties 类,扫描yml中的hub.example.redis.jedis配置。
@Component
@ConfigurationProperties(prefix="hub.example.redis.jedis")
public class JedisConnectProperties {
private String host;
private int port;
private int timeout;
private String password;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
1.3在pom.xml添加依赖
在Spring Boot中默认集成jedis,使用无需加版本号,本例版本3.7.1是Spring Boot 2.6.3对应的版本。
redis.clients
jedis
3.7.1
2.微服务中配置Jedis
2.1配置Jedis
@Configuration
public class JedisConfig {
@Autowired
private JedisConnectProperties jedisProperties;
@Bean("jedisPoolConfig")
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(30);
jedisPoolConfig.setMaxIdle(30);
jedisPoolConfig.setMinIdle(1);
jedisPoolConfig.setNumTestsPerEvictionRun(-1);
jedisPoolConfig.setTestOnBorrow(true);
jedisPoolConfig.setTestOnReturn(false);
jedisPoolConfig.setBlockWhenExhausted(false);
return jedisPoolConfig;
}
@Bean("jedisPool")
public JedisPool jedisPool(JedisPoolConfig jedisPoolConfig) {
JedisPool jedisPool = new JedisPool(jedisPoolConfig,
jedisProperties.getHost(),
jedisProperties.getPort(),
jedisProperties.getTimeout(),
jedisProperties.getPassword());
return jedisPool;
}
}
2.2解析
在配置Jedis后,在Spring环境中可以使用@Autowired自动注入jedisPool,从Jedis资源池中获取Jedis就可以操作Redis了。
3.使用@Autowired注入方式操作Jedis
3.1简要说明
使用@Autowired注入JedisPool取出Jedis,操作Redis的增、查、改、删。
3.2操作示例
@RestController
@RequestMapping("/hub/example/loadJedis")
@Slf4j
public class LoadJedisController {
@Autowired
private JedisPool jedisPool;
/**
* 使用@Autowired注入JedisPool取出Jedis
*/
@GetMapping("/jedis01-01")
public Object loadData01_01() {
log.info("Jedis操作开始...");
// 1.获取Jedis对象
Jedis jedis = jedisPool.getResource();
// 2.增
jedis.set("CityInfo:suzhou01:01", "苏州");
// 3.查
String city = jedis.get("CityInfo:suzhou01:01");
// 4.改
jedis.set("CityInfo:suzhou01:01", "苏州-姑苏");
// 5.删
jedis.del("CityInfo:suzhou01:01");
// 6.释放Jedis对象
jedis.close();
log.info("Jedis操作结束...");
return "执行成功";
}
}
3.3测试验证
使用Postman测试。
请求RUL:http://127.0.0.1:18205/hub-205-redis/hub/example/loadJedis/jedis01-01
4.使用静态方法获取JedisPool操作Jedis
4.1简要说明
使用静态方法获取JedisPool取出Jedis,操作Redis的增、查、改、删。
4.2封装静态类
使用Spring工具类从Spring管理的Bean中取出JedisPool。
添加重试机制从JedisPool取出Jedis。
@Slf4j
public class JedisUtil {
public static Jedis getJedis() {
Jedis jedis = null;
JedisPool jedisPool = null;
// 1.当前获取次数和最大重试次数
int maxRetryTime = 3;
int curRetryTime = 0;
while (curRetryTime < maxRetryTime) {
curRetryTime++;
try {
// 2.从JedisPool中获取Jedis
jedisPool = SpringUtil.getBean("jedisPool");
jedis = jedisPool.getResource();
return jedis;
} catch (Exception e) {
log.info("从JedisPool中获取Jedis失败,最大次数{},当前获取次数{}", maxRetryTime, curRetryTime);
try {
TimeUnit.SECONDS.sleep(2L);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
return null;
}
}
4.3操作示例
@RestController
@RequestMapping("/hub/example/loadJedis")
@Slf4j
public class LoadJedisController {
/**
* 使用静态方法获取JedisPool取出Jedis
*/
@GetMapping("/jedis01-02")
public Object loadData01_02() {
log.info("Jedis操作开始...");
// 1.获取Jedis对象
Jedis jedis = JedisUtil.getJedis();
// 2.增
jedis.set("CityInfo:suzhou01:02", "苏州");
// 3.查
String city = jedis.get("CityInfo:suzhou01:02");
// 4.改
jedis.set("CityInfo:suzhou01:02", "苏州-姑苏");
// 5.删
jedis.del("CityInfo:suzhou01:02");
// 6.释放Jedis对象
jedis.close();
log.info("Jedis操作结束...");
return "执行成功";
}
}
4.4测试验证
使用Postman测试。
请求RUL: http://127.0.0.1:18205/hub-205-redis/hub/example/loadJedis/jedis01-02
5.Jedis类说明
Jedis类,继承BinaryJedis类,实现接口:JedisCommands、MultiKeyCommands、 AdvancedJedisCommands、ScriptingCommands、BasicCommands、ClusterCommands、 SentinelCommands、ModuleCommands。
Jedis类:redis.clients.jedis.Jedis,操作Redis全部功能,包括String和byte[]类型数据。Jedis已实现操作Redis的命令均可以使用此类操作。
BinaryJedis类:BinaryJedisredis.clients.jedis.BinaryJedis,操作byte[]类型数据。
JedisCommands接口:redis.clients.jedis.commands.JedisCommands,操作Redis常用操作命令,一般是操作一个key的命令。
MultiKeyCommands接口:redis.clients.jedis.commands.MultiKeyCommands,操作Redis使用多个key操作的命令。
AdvancedJedisCommands接口:redis.clients.jedis.commands.AdvancedJedisCommands,操作Redis的一些高阶命令。
ScriptingCommands接口:redis.clients.jedis.commands.ScriptingCommands,操作Redis脚本的命令。
BasicCommands接口:redis.clients.jedis.commands.BasicCommands,操作Redis的一些基础命令。比如ping、info等命令。
ClusterCommands接口:redis.clients.jedis.commands.ClusterCommands,操作Redis集群命令。
SentinelCommands接口:redis.clients.jedis.commands.SentinelCommands,操作Redis的Sentinel哨兵模式的命令。
ModuleCommands接口:redis.clients.jedis.commands.ModuleCommands,包括moduleLoad、moduleUnload、moduleList方法。
6.注意问题
(1)配置Redis超时时时,不能配置太短,如果网络稍微不好一点,就会取不到Jedis。注意设置Jedis超时时间单位是毫秒。
(2)在Spring Boot 2.6.3微服务中已经集成了Jedis,使用默认版本就可,如果使用更高版本,可能会存在版本冲突,需要做相应的适配修改。
以上,感谢。
2023年4月15日