> 文章列表 > 在Spring Boot微服务集成Jedis操作Redis

在Spring Boot微服务集成Jedis操作Redis

在Spring Boot微服务集成Jedis操作Redis

记录: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.203port: 28001password: 12345678timeout: 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对应的版本。

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

2.微服务中配置Jedis

2.1配置Jedis

@Configuration
public class JedisConfig {@Autowiredprivate 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 {@Autowiredprivate 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中获取JedisjedisPool = 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日