当前位置:   article > 正文

SpringBoot 整合Redis_springboot redis 配置testonborrow

springboot redis 配置testonborrow

这里使用自定义的Redis配置文件来使用Dokcer启动Redis。

   

  1. [root@centos7 redis6]# docker run -d -v /root/redis6/redis.conf:/usr/local/etc/redis/redis.conf --name redis-v6.0.8 -p 6379:6379 redis:6.0.8 redis-server /usr/local/etc/redis/redis.conf
  2. c9ce5b9c398e37c75e7909a54deacbb9bb3d2f5cfe726ac4bb129d434f5af411
  3. [root@centos7 redis6]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. c9ce5b9c398e redis:6.0.8 "docker-entrypoint.s…" 6 seconds ago Up 4 seconds 0.0.0.0:6379->6379/tcp redis-v6.0.8

一、SpringBoot 整合单机Redis

在 SpringBoot 中,默认集成的 Redis 就是 Spring Data Redis,默认底层的连接池使用了 lettuce ,开发者可以自行修改为自己的熟悉的,例如 Jedis。

Spring Data Redis 针对 Redis 提供了非常方便的操作模板 RedisTemplate 和 StringRedisTemplate。RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅等。   

  

1、创建一个 springboot 工程,引入相关依赖包,

  1. <!--默认使用 letture-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.apache.commons</groupId>
  12. <artifactId>commons-pool2</artifactId>
  13. </dependency>
  14. ==或者========
  15. <!--使用 jedis-->
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-data-redis</artifactId>
  19. <exclusions>
  20. <exclusion>
  21. <groupId>io.lettuce</groupId>
  22. <artifactId>lettuce-core</artifactId>
  23. </exclusion>
  24. </exclusions>
  25. </dependency>
  26. <dependency>
  27. <groupId>redis.clients</groupId>
  28. <artifactId>jedis</artifactId>
  29. </dependency>

主要就是引入了 Spring Data Redis + 连接池。

2、在application.properties配置文件中配置redis:

  1. server.port=8088
  2. # Redis 的基本信息
  3. spring.redis.host=192.168.xxx.xxx
  4. spring.redis.port=6379
  5. spring.redis.password=xxxxxx
  6. spring.redis.database=1
  7. # 连接池信息
  8. spring.redis.lettuce.pool.min-idle=5
  9. spring.redis.lettuce.pool.max-idle=10
  10. spring.redis.lettuce.pool.max-active=8
  11. spring.redis.lettuce.pool.max-wait=1ms
  12. spring.redis.lettuce.shutdown-timeout=100ms

引入了 Spring Data Redis,配置了 Redis 的基本信息,此时,自动化配置就会生效。看一下SpringBoot 中的自动配置类 RedisAutoConfiguration

其中 StringRedisTemplate 是 RedisTemplate 的子类,两个的方法基本一致,不同之处主要体现在操作的数据类型不同。RedisTemplate是操作对象,StringRedisTemplate是操作字符串。项目中根据业务使用他们都可以操作Redis。

   

3、测试操作一下String类型数据:

  1. @RestController
  2. public class RedisControlller {
  3. @Autowired
  4. private StringRedisTemplate stringRedisTemplate;
  5. @Autowired
  6. private RedisTemplate redisTemplate;
  7. @GetMapping("/set")
  8. public void set(){
  9. ValueOperations<String, String> opsForValue1 = stringRedisTemplate.opsForValue();
  10. opsForValue1.set("k1", "value111");
  11. ValueOperations<String, Object> opsForValue2 = redisTemplate.opsForValue();
  12. opsForValue2.set("k2", "value222");
  13. }
  14. @GetMapping("/get")
  15. public String get(){
  16. ValueOperations<String, String> opsForValue1 = stringRedisTemplate.opsForValue();
  17. String v1 = opsForValue1.get("k1");
  18. ValueOperations<String, Object> opsForValue2 = redisTemplate.opsForValue();
  19. Object v2 = opsForValue2.get("k2");
  20. return v1 + "==" + v2;
  21. }
  22. }

  

这是对 key和value进行序列化之后的结果。通过代码RedisTemplate获取是正常的。这是因为这两者序列化方案不同

  • RedisTemplate 中,默认的序列化方案是 JdkSerializationRedisSerializer
  • StringRedisTemplate 中,默认的序列化方案是 StringRedisSerializer 。默认情况下,前面不会有前缀。

因此,如果使用 StringRedisTemplate ,默认情况下,前面不会有前缀。开发者也可以自行修改 RedisTemplate 中的序列化方案。

  1. redisTemplate.setKeySerializer(new StringRedisSerializer());
  2. redisTemplate.setValueSerializer(new StringRedisSerializer());
  3. ValueOperations<String, Object> opsForValue2 = redisTemplate.opsForValue();
  4. opsForValue2 = opsForValue2;
  5. opsForValue2.set("k3", "value333");

  

针对其他类型的序列化方案修改同理。

针对其他具体数据类型的操作,首先需要获取相应数据类型的操作方法是 opsForXXX,然后对数据进行操作方法,和命令对数据操作类似。比如:

      

整合单机Redis就这么简单的搞定了。

二、整合Jedis

依赖上面已经说明了。配置同上,其实 RedisTemplate就可以依赖注入使用了。

如果我们想使用 JedisPool来操作,就需要注入bean了。

1、在application.yml配置文件中,自定义配置项

  1. # 自定义配置项
  2. jedis:
  3. host: 192.168.xxx.xxx
  4. password: xxxxxx
  5. port: 6379
  6. timeout: 2000
  7. maxTotal: 15 # 最大连接数
  8. maxIdle: 10 # 最大空闲连接
  9. minIdle: 5 # 最小空闲连接
  10. maxWaitMillis: 10000 # 获取连接最大等待时间
  11. testOnBorrow: true # 获取连接时检测是否可用

2、创建配置类

  1. @Configuration
  2. public class JedisConfig extends CachingConfigurerSupport {
  3. private Logger logger = LoggerFactory.getLogger(JedisConfig.class);
  4. @Value("${jedis.host}")
  5. private String host;
  6. @Value("${jedis.port}")
  7. private int port;
  8. @Value("${jedis.password}")
  9. private String password;
  10. @Value("${jedis.timeout}")
  11. private int timeout;
  12. @Value("${jedis.maxIdle}")
  13. private int maxIdle;
  14. @Value("${jedis.minIdle}")
  15. private int minIdle;
  16. @Value("${jedis.maxWaitMillis}")
  17. private long maxWaitMillis;
  18. @Value("${jedis.testOnBorrow}")
  19. private boolean testOnBorrow;
  20. @Value("${jedis.maxTotal}")
  21. private int maxTotal;
  22. @Bean
  23. public JedisPoolConfig jedisPoolConfig() {
  24. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  25. jedisPoolConfig.setMaxTotal(maxTotal);
  26. jedisPoolConfig.setMaxIdle(maxIdle);
  27. jedisPoolConfig.setMinIdle(minIdle);
  28. jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
  29. jedisPoolConfig.setTestOnBorrow(testOnBorrow);
  30. return jedisPoolConfig;
  31. }
  32. @Bean
  33. public JedisPool jedisPool(JedisPoolConfig jedisPoolConfig) {
  34. logger.info("=====创建JedisPool连接池=====");
  35. if(StringUtils.isNotEmpty(password)) {
  36. return new JedisPool(jedisPoolConfig, host, port, timeout, password);
  37. }
  38. return new JedisPool(jedisPoolConfig, host, port, timeout);
  39. }
  40. // 这两个都可以
  41. // @Bean
  42. // public JedisPool jedisPoolFactory() {
  43. // JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  44. // jedisPoolConfig.setMaxTotal(maxTotal);
  45. // jedisPoolConfig.setMaxIdle(maxIdle);
  46. // jedisPoolConfig.setMinIdle(minIdle);
  47. // jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
  48. // jedisPoolConfig.setTestOnBorrow(testOnBorrow);
  49. // JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);
  50. // return jedisPool;
  51. // }
  52. }

3、愉快的使用

  1. // 简单实现 mq消息
  2. @Component
  3. public class ListMq {
  4. public final static String LIST_MQ = "LIST_MQ:";
  5. @Autowired
  6. private JedisPool jedisPool;
  7. /*消费者接受消息*/
  8. public List<String> get(String key) {
  9. Jedis jedis = null;
  10. try {
  11. jedis = jedisPool.getResource();
  12. return jedis.brpop(0,LIST_MQ +key);
  13. } catch (Exception e) {
  14. throw new RuntimeException("接受消息失败!e=" + e);
  15. } finally {
  16. if (jedis != null){
  17. jedis.close();
  18. }
  19. }
  20. }
  21. /*生产者发送消息*/
  22. public void put(String key, String message) {
  23. Jedis jedis = null;
  24. try {
  25. jedis = jedisPool.getResource();
  26. jedis.lpush(LIST_MQ +key,message);
  27. } catch (Exception e) {
  28. throw new RuntimeException("发送消息失败!");
  29. } finally {
  30. if (jedis != null){
  31. jedis.close();
  32. }
  33. }
  34. }
  35. }

—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/160065
推荐阅读
相关标签
  

闽ICP备14008679号