redis缓存神器:@Cacheable注解

news/2024/11/25 19:50:42/

在之前的文章中,我们写了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 {@Beanpublic 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 {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Autowiredprivate UserDao userDao;@Overridepublic 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 {@Autowiredprivate 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 {@Autowiredprivate 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 {@Autowiredprivate 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,此时会重新从数据库中获取数据。

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

http://www.ppmy.cn/news/82481.html

相关文章

科研热点|国家自然科学基金项目评审请托行为禁止清单正式发布!

5月24日&#xff0c;《国家自然科学基金项目评审请托行为禁止清单》正式发布&#xff01;与5月16日发布的《国家自然科学基金项目评审请托行为禁止清单(征求意见稿)》相比&#xff0c;新增了多项内容&#xff0c;如一&#xff08;四&#xff09;、二&#xff08;五&#xff09;…

清除浮动的方法

目录 清除浮动 2.1 清除浮动的方法 — ① 直接设置父元素高度 2.2 清除浮动的方法 — ② 额外标签法 2.3 清除浮动的方法 — ③ 单伪元素清除法 2.4 清除浮动的方法 — ④ 双伪元素清除法 2.5 清除浮动的方法 — ⑤ 给父元素设置overflow : hidden 清除浮动 ➢ 含义&#…

简单分享在微信上扫码点餐小程序怎么做

目前市场上有很多扫码点餐的小程序系统&#xff0c;制作方法有三种&#xff1a; 1、使用微信商家推出的扫码点餐小程序&#xff0c;上传营业执照和食品经营许可证就可以开通使用&#xff0c;然后上传自己的菜品信息就可以了&#xff0c;功能相对比较简单。 2、购买餐饮系统公司…

Http协议网络读卡器Aspx网页Request获取刷卡数据Response回应驱动显示

中文液晶显示http协议网络读卡器是一款能利用现有的计算机网络&#xff0c;不需要独立布线就可以组成一个高性能低成本实时联网ID卡管理系统的端终设备&#xff0c;刷卡后即时向远程计算机传送卡号信息&#xff0c;电脑对刷卡信息处理后可即时向读卡器发送相应的显示及响应提示…

巧用bash的eval命令解析配置文件

背景 最近工作上经常需要导出硬件模块的寄存器&#xff0c;而导出脚本在HAPS&#xff08;一种FPGA仿真平台&#xff09;的执行速度很慢&#xff0c;一开始我以为是执行导出的定制版lookat命令有问题&#xff0c;加了每个步骤的时间戳后没发现问题&#xff0c;于是转而寻找整个…

Cisco Identity Services Engine (ISE) 3.2 Patch2 发布 - 思科身份服务引擎

Cisco Identity Services Engine (ISE) 3.2 Patch2 发布 - 思科身份服务引擎 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-ise-3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 工作场所零信任安全的核心所在 …

MQTT Part 5 主题和最佳实践

主题 主题是一个UTF-8字符串&#xff0c;代理用它来过滤每个连接的客户端的消息。 主题由一个或多个主题级别组成。 每个主题级别之间由正斜杠&#xff08;主题级别分隔符&#xff09;分隔。 与消息队列相比&#xff0c;主题非常轻量级。 客户端不需要在发布或订阅之前创建所需…

VC GDI双缓冲绘图

VC GDI双缓冲绘图 VC GDI双缓冲绘图创建内存DC和内存图片&#xff0c;缺一不可最好是封装一下内存绘制绘制效果 关键是不闪烁PS 重绘机制 VC GDI双缓冲绘图 双缓冲绘图&#xff0c;知道这个知识点&#xff0c;每次用的时候还得踩一遍坑&#xff0c;真是服&#xff0c;总结记录…