文章目录
缓存处理
1 redis和SpringDataRedis
为了提高查询的性能,我们通常采用Redis缓存解决。
- Redis环境搭建
我们以docker的形式搭建Redis 服务
docker run ‐di ‐‐name=tensquare_redis ‐p 6379:6379 redis
- SpringDataRedis
Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作。
2 实现文章的缓存处理
2.1 查询文章操作缓存
- 在tensquare_article 的pom.xml引入依赖
...... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> - 修改application.yml ,在spring节点下添加配置
spring: ...... redis: host: 192.168.1.194 - 修改ArticleService 引入RedisTemplate,并修改findById方法
这样在查询的时候,就会自动将文章放入缓存@Autowired private RedisTemplate redisTemplate; ...... /** * 根据ID查询实体 * @param id * @return */ public Article findById(String id) { //从缓存中提取 Article article=(Article)redisTemplate.opsForValue().get("article_"+id); // 如果缓存没有则到数据库查询并放入缓存 if(article==null) { article = articleDao.findById(id).get(); redisTemplate.opsForValue().set("article_" + id, article); } return article; }
2.2 修改或删除后清除缓存
......
/**
* 修改
* @param article
*/
public void update(Article article) {
redisTemplate.delete( "article_" + article.getId() );//删除缓存
articleDao.save(article);
}
/**
* 删除
* @param id
*/
public void deleteById(String id) {
redisTemplate.delete( "article_" + id );//删除缓存
articleDao.deleteById(id);
}
......
2.3 缓存过期处理
修改findById方法 ,设置1天的过期时间
redisTemplate.opsForValue().set("article_" + id, article,1,TimeUnit.DAYS);
为了方便测试,我们可以把过期时间改为10秒,然后观察控制台输出
redisTemplate.opsForValue().set("article_" + id, article,10,TimeUnit.SECONDS);
测试接口,调用查,改,删的api,观察控制台输出的sql语句次数。
2.4 SpringDataRedis使用说明
stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间
stringRedisTemplate.opsForValue().get("test")//根据key获取缓存中的val
stringRedisTemplate.boundValueOps("test").increment(-1);//val做-1操作
stringRedisTemplate.boundValueOps("test").increment(1);//val +1
stringRedisTemplate.getExpire("test")//根据key获取过期时间
stringRedisTemplate.getExpire("test",TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位
stringRedisTemplate.delete("test");//根据key删除缓存
stringRedisTemplate.hasKey("546545");//检查key是否存在,返回boolean值
stringRedisTemplate.expire("red_123",1000 , TimeUnit.MILLISECONDS);//设置过期时间
stringRedisTemplate.opsForSet().add("red_123", "1","2","3");//向指定key中存放set集合
stringRedisTemplate.opsForSet().isMember("red_123", "1")//根据key查看集合中是否存在指定数据
stringRedisTemplate.opsForSet().members("red_123");//根据key获取set集合
3 Spring Cache处理活动信息的缓存
Spring Cache使用方法与Spring对事务管理的配置相似。Spring Cache的核心就是对某个方法进行缓存,其实质就是缓存该方法的返回结果,并把方法参数和结果用键值对的方式存放到缓存中,当再次调用该方法使用相应的参数时,就会直接从缓存里面取出指定的结果进行返回。
常用注解:
@Cacheable:使用这个注解的方法在执行后会缓存其返回结果。@CacheEvict:使用这个注解的方法在其执行前或执行后移除Spring Cache中的某些
元素。
3.1 活动子模块代码生成
- 使用代码生成器生成招聘微服务代码 tensquare_gathering
- 拷贝到当前工程,并在父工程引入。
- 修改Application类名称为GatheringApplication
- 修改application.yml 中的端口为9005 ,url 为jdbc:mysql://192.168.184.134:3306/tensquare_gathering?characterEncoding=UTF8
- 进行浏览器测试
- 给service加上事务注解@Transactional
- 修改BaseExceptionHandler的注解
@ControllerAdvice改为@RestControllerAdvice,去掉方法上的@ResponseBody
3.2 活动详情的缓存实现
步骤:
- 我们在tensquare_gathering的pom.xml中引入SpringDataRedis
...... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> - 修改application.yml ,在spring节点下添加配置
spring: ...... redis: host: 192.168.1.194 - 为GatheringApplication添加
@EnableCaching开启缓存支持@SpringBootApplication @EnableCaching public class GatheringApplication {......} - 在GatheringService的findById方法添加缓存注解,这样当此方法第一次运行,在缓存中没有找到对应的value和key,则将查询结果放入缓存。
...... /** * 根据ID查询实体 * @param id * @return */ @Cacheable(value="gathering",key="#id") public Gathering findById(String id) { return gatheringDao.findById(id).get(); } ...... - 当我们对数据进行删改的时候,需要更新缓存。其实更新缓存也就是清除缓存,因为清除缓存后,用户再次调用查询方法无法提取缓存会重新查找数据库中的记录并放入缓存。
在GatheringService的update、deleteById方法上添加清除缓存的注解。...... /** * 修改 * @param gathering */ @CacheEvict(value="gathering",key="#gathering.id") public void update(Gathering gathering) { gatheringDao.save(gathering); } /** * 删除 * @param id */ @CacheEvict(value="gathering",key="#id") public void deleteById(String id) { gatheringDao.deleteById(id); } ......
十次方00、总目录
https://blog.youkuaiyun.com/amingccc/article/details/84260613
本文详细介绍如何利用Redis和Spring Data Redis优化文章查询性能,包括缓存处理、缓存过期及活动信息缓存实现,通过具体代码示例展示了缓存机制在微服务架构中的应用。
838

被折叠的 条评论
为什么被折叠?



