【Redis系列】Spring Boot 集成 Redis 实现缓存功能

2024-04-10 1175阅读

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

【Redis系列】Spring Boot 集成 Redis 实现缓存功能

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

      非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

      博客目录

        • 一、配置 Redis 连接
        • 二、使用 Jedis 操作 Redis
        • 三、使用 RedisTemplate 操作 Redis

          摘要:本文介绍了如何在 Spring Boot 项目中集成 Redis,并利用 Redis 实现缓存功能。文章包括配置 Redis 连接、使用 Jedis 和 RedisTemplate 两种方式进行操作的示例代码,并探讨了它们的优缺点。


          随着互联网应用的不断发展,对于数据的高效读写和缓存处理变得越来越重要。而 Redis 作为一款高性能的缓存数据库,被广泛应用于各种大型系统中。本文将介绍如何在 Spring Boot 项目中集成 Redis,并利用 Redis 实现缓存功能。

          【Redis系列】Spring Boot 集成 Redis 实现缓存功能

          一、配置 Redis 连接

          在 Spring Boot 项目中,我们可以通过配置文件来指定 Redis 的连接参数。以 YAML 格式的配置文件为例,示例如下:

          spring:
            redis:
              database: 3
              password: xxxx
              timeout: 60000 #连接超时
              host: 10.xxx.14.40
              port: 6379
              jedis:
                pool:
                  max-idle: 6 #最大空闲数
                  max-active: 100 #最大连接数
                  min-idle: 2 #最小空闲数
          

          以上配置了 Redis 的数据库编号、密码、连接超时时间以及连接池的相关参数。

          二、使用 Jedis 操作 Redis

          Jedis 是 Java 操作 Redis 的一款常用客户端库。下面是使用 Jedis 进行操作的示例代码。

          首先,我们需要创建一个 JedisConfig 类,用于配置 Jedis 连接池:

          @Slf4j
          @Configuration
          public class JedisConfig {
              @Value("${spring.redis.host}")
              private String host;
              @Value("${spring.redis.port}")
              private int port;
              @Value("${spring.redis.timeout}")
              private Integer timeout;
              @Value("${spring.redis.password}")
              private String password;
              @Value("${spring.redis.database}")
              private Integer database;
              @Value("${spring.redis.jedis.pool.max-active}")
              private int maxActive;
              @Value("${spring.redis.jedis.pool.max-idle}")
              private int maxIdle;
              @Value("${spring.redis.jedis.pool.min-idle}")
              private int minIdle;
              @Bean
              public JedisPool jedisPool() {
                  JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
                  jedisPoolConfig.setMaxIdle(maxIdle);
                  jedisPoolConfig.setMinIdle(minIdle);
                  jedisPoolConfig.setMaxTotal(maxActive);
                  JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, "default", password, database);
                  log.info("JedisPool Connection Success:" + host + "\t" + port);
                  return jedisPool;
              }
          }
          

          在上述代码中,我们通过@Configuration 注解将 JedisConfig 类标识为配置类,并通过@Bean 注解将 jedisPool 方法返回的 JedisPool 对象注册为 Spring 的 Bean。

          接下来,我们可以创建一个 JedisUtils 类,用于获取 Jedis 资源和释放连接:

          @Component
          public class JedisUtils {
              @Autowired
              private JedisPool jedisPool;
              /**
               * 获取Jedis资源
               */
              public Jedis getJedis() {
                  return jedisPool.getResource();
              }
              /**
               * 释放Jedis连接
               */
              public void close(Jedis jedis) {
                  if (jedis != null) {
                      jedis.close();
                  }
              }
          }
          

          在上述代码中,我们通过@Autowired 注解将 JedisPool 对象注入到 JedisUtils 类中。通过调用 getJedis 方法,我们可以获取一个 Jedis 资源对象,用于后续的操作。在完成操作后,调用 close 方法释放 Jedis 连接,以便连接可以被连接池重复利用。

          接下来,我们可以创建一个 JedisClient 类,用于具体的操作 Redis:

          @Slf4j
          @Component
          public class JedisClient {
              @Autowired
              private JedisUtils jedisUtils;
              /**
               * 根据key查询value值
               */
              public String get(String key) {
                  Jedis jedis = jedisUtils.getJedis();
                  try {
                      if (!jedis.exists(key)) {
                          log.info("key:{}在Redis中查不到数据.", key);
                      } else {
                          return jedis.get(key);
                      }
                  } catch (Exception e) {
                     log.error("Jedis get操作出错", e);
                  } finally {
                      jedisUtils.close(jedis);
                  }
                  return null;
              }
              /**
               * 设置key-value
               */
              public void set(String key, String value) {
                  Jedis jedis = jedisUtils.getJedis();
                  try {
                      jedis.set(key, value);
                  } catch (Exception e) {
                      log.error("Jedis set操作出错", e);
                  } finally {
                      jedisUtils.close(jedis);
                  }
              }
              /**
               * 删除key
               */
              public void delete(String key) {
                  Jedis jedis = jedisUtils.getJedis();
                  try {
                      jedis.del(key);
                  } catch (Exception e) {
                      log.error("Jedis delete操作出错", e);
                  } finally {
                      jedisUtils.close(jedis);
                  }
              }
          }
          

          在上述代码中,我们通过@Autowired 注解将 JedisUtils 对象注入到 JedisClient 类中,以获取 Jedis 资源。然后,我们可以定义一些常见的 Redis 操作方法,例如 get、set 和 delete。

          最后,我们可以在需要使用缓存的地方调用 JedisClient 类进行 Redis 操作。例如:

          @RestController
          public class UserController {
              @Autowired
              private JedisClient jedisClient;
              @GetMapping("/user/{id}")
              public User getUserById(@PathVariable("id") String id) {
                  String key = "user:" + id;
                  String value = jedisClient.get(key);
                  if (value != null) {
                      return JSON.parseObject(value, User.class);
                  } else {
                      User user = userService.getUserById(id);
                      if (user != null) {
                          jedisClient.set(key, JSON.toJSONString(user));
                      }
                      return user;
                  }
              }
          }
          

          在上述代码中,我们首先根据缓存的 key 值查询 Redis 中是否存在对应的 value 值。如果存在,则直接从 Redis 中获取缓存数据。如果不存在,则从数据库中获取数据,并将数据存入 Redis 中以供下次使用。

          三、使用 RedisTemplate 操作 Redis

          除了使用 Jedis 进行 Redis 操作外,Spring Boot 还提供了另一种方式:使用 RedisTemplate。下面是使用 RedisTemplate 进行操作的示例代码。

          【Redis系列】Spring Boot 集成 Redis 实现缓存功能

          首先,我们需要创建一个 RedisConfig 类,用于配置 RedisTemplate:

          @Configuration
          public class RedisConfig {
              @Value("${spring.redis.host}")
              private String host;
              @Value("${spring.redis.port}")
              private int port;
              @Value("${spring.redis.timeout}")
              private Integer timeout;
              @Value("${spring.redis.password}")
              private String password;
              @Value("${spring.redis.database}")
              private Integer database;
              @Bean
              public RedisConnectionFactory redisConnectionFactory() {
                  RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port);
                  config.setDatabase(database);
                  config.setPassword(RedisPassword.of(password));
                  LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config);
                  connectionFactory.setTimeout(timeout);
                  return connectionFactory;
              }
              @Bean
              public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
                  RedisTemplate redisTemplate = new RedisTemplate();
                  redisTemplate.setConnectionFactory(connectionFactory);
                  // 设置key和value的序列化方式
                  redisTemplate.setKeySerializer(new StringRedisSerializer());
                  redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
                  return redisTemplate;
              }
          }
          

          在上述代码中,我们通过@Configuration 注解将 RedisConfig 类标识为配置类,并通过@Bean 注解分别注册了 redisConnectionFactory 和 redisTemplate 对象。在 redisTemplate 方法中,我们设置了 key 和 value 的序列化方式,这里使用了 StringRedisSerializer 和 GenericJackson2JsonRedisSerializer。

          接下来,我们可以在需要使用缓存的地方注入 RedisTemplate 对象,并调用相应的方法进行 Redis 操作。例如:

          @RestController
          public class UserController {
              @Autowired
              private RedisTemplate redisTemplate;
              @GetMapping("/user/{id}")
              public User getUserById(@PathVariable("id") String id) {
                  String key = "user:" + id;
                  User user = (User) redisTemplate.opsForValue().get(key);
                  if (user != null) {
                      return user;
                  } else {
                      user = userService.getUserById(id);
                      if (user != null) {
                          redisTemplate.opsForValue().set(key, user);
                      }
                      return user;
                  }
              }
          }
          

          在上述代码中,我们通过 RedisTemplate 的 opsForValue 方法获取 ValueOperations 对象,并调用 get 方法从 Redis 中获取缓存数据。如果数据不存在,则从数据库中

          觉得有用的话点个赞 👍🏻 呗。

          ❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

          💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

          🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

          【Redis系列】Spring Boot 集成 Redis 实现缓存功能

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]