redis缓存神器:@Cacheable注解

这篇具有很好参考价值的文章主要介绍了redis缓存神器:@Cacheable注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在之前的文章中,我们写了redis结合springboot做缓存分页的方法:

在 Spring Boot 中结合 Redis 进行缓存分页数据,可以通过以下步骤实现:

  1. 在 pom.xml 文件中添加 Redis 相关依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 在 application.properties 文件中配置 Redis 连接信息:

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
  1. 创建一个 RedisTemplate 对象,用于操作 Redis 缓存:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}
  1. 在 Service 层中,使用 RedisTemplate 对象进行缓存操作。例如,对于分页查询操作,可以将查询结果缓存到 Redis 中,下次查询时先从 Redis 中获取数据,如果缓存中不存在,则进行数据库查询,并将查询结果缓存到 Redis 中:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private UserDao userDao;

    @Override
    public List<User> getUsersByPage(int pageNum, int pageSize) {
        String key = "user:page:" + pageNum + ":" + pageSize;
        List<User> users = (List<User>) redisTemplate.opsForValue().get(key);
        if (users == null) {
            PageHelper.startPage(pageNum, pageSize);
            users = userDao.getUsers();
            PageInfo<User> pageInfo = new PageInfo<>(users);
            redisTemplate.opsForValue().set(key, pageInfo, 1, TimeUnit.MINUTES);
        }
        return users;
    }
}

在上述代码中,使用了 PageHelper 插件进行分页查询,并将查询结果缓存到 Redis 中,缓存时间为 1 分钟。下次查询时,如果缓存中存在数据,则直接从缓存中获取,避免了频繁查询数据库的操作。

以上就是 Spring Boot 结合 Redis 进行缓存分页数据的实现方法。需要注意的是,缓存的数据需要根据实际情况进行设置过期时间,避免缓存数据过期后仍然被使用。

但是,以上代码还是存在问题的,如果page数据发生了变化怎么办,redis获取的还是老数据啊!

所以,我们需要在数据更新的时候,也要更新缓存里面的数据。

这一节我们来唠唠怎么更新缓存和简化这些操作。

Spring Boot提供了一个注解@EnableCaching来启用缓存功能。在启用缓存功能后,可以使用注解来对某个方法进行缓存。

  1. 首先,在pom.xml文件中添加redis依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 在application.properties文件中配置redis连接信息:

spring.redis.host=127.0.0.1
spring.redis.port=6379
  1. 在启动类上添加@EnableCaching注解,开启缓存功能:

@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  1. 在需要进行缓存的方法上添加@Cacheable注解:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    @Cacheable(value = "userCache", key = "#id") // 添加缓存注解
    public User getUserById(Long id) {
        return userDao.getUserById(id);
    }
}

其中,@Cacheable注解有两个重要的参数:value和key。value表示缓存的名称,如果没有指定则使用默认缓存;key表示缓存的key值,可以使用SpEL表达式来表示。

这样,当第一次调用getUserById方法时,会将返回结果缓存起来,下次再调用该方法时,直接从缓存中获取结果,而不是执行方法体。如果需要更新缓存,可以调用@CachePut注解或@CacheEvict注解来实现。

需要注意的是,在使用@Cacheable注解时,被缓存的方法不能抛出异常,否则会导致缓存失效。

当使用@Cacheable注解后,如果需要更新缓存,可以通过调用@CachePut注解来更新缓存。

  1. @CachePut注解的使用方法和@Cacheable注解类似。在需要更新缓存的方法上添加@CachePut注解,并指定value和key值。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(Long id) {
        return userDao.getUserById(id);
    }

    @Override
    @CachePut(value = "userCache", key = "#user.id")
    public User updateUser(User user) {
        userDao.updateUser(user);
        return user;
    }
}
  1. 在更新数据时,先调用更新方法updateUser,然后再调用查询方法getUserById,此时会更新缓存中的数据。

// 更新用户信息
User user = new User();
user.setId(1L);
user.setName("new name");
userService.updateUser(user);

// 查询用户信息,会从缓存中获取
User userFromCache = userService.getUserById(1L);
  1. 如果需要删除缓存中的数据,可以通过调用@CacheEvict注解来实现。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(Long id) {
        return userDao.getUserById(id);
    }

    @Override
    @CachePut(value = "userCache", key = "#user.id")
    public User updateUser(User user) {
        userDao.updateUser(user);
        return user;
    }

    @Override
    @CacheEvict(value = "userCache", key = "#id")
    public void deleteUserById(Long id) {
        userDao.deleteUserById(id);
    }
}
  1. 在删除数据时,先调用删除方法deleteUserById,然后再调用查询方法getUserById,此时会重新从数据库中获取数据。文章来源地址https://www.toymoban.com/news/detail-462697.html

// 删除用户信息
userService.deleteUserById(1L);

// 查询用户信息,会重新从数据库中获取
User userFromDB = userDao.getUserById(1L);

到了这里,关于redis缓存神器:@Cacheable注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring 中的 @Cacheable 缓存注解,太好用了!

    第一个问题,首先要搞明白什么是缓存,缓存的意义是什么。 对于普通业务,如果要查询一个数据,一般直接select数据库进行查找。但是在高流量的情况下,直接查找数据库就会成为性能的瓶颈。因为数据库查找的流程是先要从磁盘拿到数据,再刷新到内存,再返回数据。磁

    2024年02月16日
    浏览(29)
  • SpringBoot缓存注解@Cacheable之自定义key策略及缓存失效时间指定

    1. 项目依赖 本项目借助 SpringBoot 2.2.1.RELEASE  +  maven 3.5.3  +  IDEA  +  redis5.0 进行开发 开一个 web 服务用于测试 1. key 生成策略 对于 @Cacheable 注解,有两个参数用于组装缓存的 key cacheNames/value: 类似于缓存前缀 key: SpEL 表达式,通常根据传参来生成最终的缓存 key 默认的 redisK

    2024年02月19日
    浏览(30)
  • redis(12):springboot使用redis注解做缓存

    1 新建springboot项目   2 相关注解 @EnableCaching 在启动类上加上注解启动缓存 #作用在你要缓存的数据上 @Cacheable(key=\\\"#id\\\",cacheNames=\\\"com.sxt.service.impl.MenuServiceImpl\\\") @Cacheput 解决脏读 @CachEvict(解决脏读) @Cacheconfig(全局的配置缓存) 3 修改yml

    2024年02月15日
    浏览(33)
  • Spring Boot 中的 @Cacheable 注解

    在 Spring Boot 中,缓存是一个非常重要的话题。当我们需要频繁读取一些数据时,为了提高性能,可以将这些数据缓存起来,避免每次都从数据库中读取。为了实现缓存,Spring Boot 提供了一些缓存注解,其中最常用的是 @Cacheable 注解。 @Cacheable 注解用于标记一个方法需要被缓存

    2024年02月12日
    浏览(51)
  • 一文掌握SpringBoot注解之@Cacheable 知识文集(1)

    🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论⭐收藏 🔎 SpringBoot 领域知识 🔎 链接 专栏 SpringBoot 专业知识学习一 SpringBoot专栏 Sprin

    2024年01月20日
    浏览(34)
  • SpringBoot 缓存之 @Cacheable 详细介绍

    1、缓存介绍 Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术。并支持使用 JCache(JSR-107)注解简化我们的开发。 其使用方法和原理都类似于 Spring 对事务管理的支持。Spring Cache 是作用在方

    2024年04月27日
    浏览(23)
  • 【springboot】缓存之@Cacheable、@CachePut、@CacheEvict的用法

    一、注解参数说明 1.1 属性说明 1.1.1 value/cacheNames 属性 1.这两个属性代表的意义相同 2.用来指定缓存组件的名称,将方法的返回结果存进缓存的名称 3.定义为数组时,可以存到多个缓存key中 1.1.2 key属性 1.指定缓存数据的key 2.redis作为缓存时,redis中的key为value::key 3.方法没有参

    2024年02月06日
    浏览(44)
  • 转载 spring @Cacheable扩展实现缓存自动过期时间以及自动刷新

    用过spring cache的朋友应该会知道,Spring Cache默认是不支持在@Cacheable上添加过期时间的,虽然可以通过配置缓存容器时统一指定。形如 复制 但有时候我们会更习惯通过注解指定过期时间。今天我们就来聊一下如何扩展@Cacheable实现缓存自动过期以及缓存即将到期自动刷新 2 实现

    2024年02月03日
    浏览(30)
  • @EnableCaching、@Cacheable的介绍,及Redis在SpringBoot中的使用教程

    首先说明这两个注解都是spring提供的,可以结合不同的缓存技术使用。(这里将顺便结合Redis进行讲解) 1.1 @EnableCaching @EnableCaching是开启缓存功能,作用于缓存配置类上或者作用于springboot启动类上。 1.2 @Cacheable @Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也

    2024年01月24日
    浏览(38)
  • TeamView: 为了进一步增强安全性,在发起连接之前,我们希望您先验证您的账户

    TeamViewPC端远程连接另外一台电脑 弹出窗口:为了进一步增强安全性,在发起连接之前,我们希望您先验证您的账户 电脑浏览器自动跳转到手机号验证页面,输入正确的手机号后,点击验证却一直提示 手机号无效、手机号未知等异常。 复制验证链接到手机 https://login.teamviewer.

    2024年02月14日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包