在我们做项目的时候,往往会遇到访问数据库的操作,如果重复的进行某一个操作,会反复访问数据库,造成运行速度缓慢,这时候我们就需要使用缓存数据,减少数据库查询的操作。因为redis是基于内存的数据库,直接存储在内存上的,所以查询会很方便。
一:实现思路
例如一个商城系统,我们查询某一种商品的时候,我们要访问后端服务,然后检查缓存是否存在,如果缓存存在,就进行读取数据,如果缓存不存在就查询数据库,然后将查到的数据库的内容载入到缓存中。
二:实现操作
Redis实现缓存操作,我们基本上使用Spring Cache框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如:
· EHCache
· Caffeine
· Redis
在 yml文件中配置redis和数据库的的参数(具体内容参考上一篇文章)
首先我们需要在pom.xml文件中引入Cache和redis的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
下面我们先简单介绍一下 Spring Cache的常用注解
@EnableCaching 开启缓存注解功能,通常加在启动类上
@Cacheable 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
@CachePut 将方法的返回值放到缓存中
@CacheEvict 将一条或多条数据从缓存中删除
三:代码实现
@CachePut
例如,我们在一个user Controller层中 我们实现新增的操作的时候,就可以精准的获取到返回值然后获取到缓存中 我们使用了@CachePut 注解将方法的返回值放到缓存中。
@PostMapping
@CachePut(cacheNames = "userCache",key = "#user.id")//SPEL语言
//返回值放到缓存 如果使用Spring cache缓存数据 key的生成:userCache::
public User save(@RequestBody User user){
userMapper.insert(user);
return user;
}
启动springboot工程后,我们通过接口文档来进行测试数据 注意!!我们在启动springboot项目的时候,一定要先在启动类上面添加@EnableCaching 注解
以上是启动类的代码 记得一定要先添加@EnableCaching注解
然后可以在ARDM(有不懂的具体可以看上一篇文章,点赞加关注发app链接)中可以查询Redis中的数据 可见缓存中已经添加了新增的这个元素
@CacheEvict 将一条或多条数据从缓存中删除
@DeleteMapping
@CacheEvict(cacheNames = "userCache",key = "#id")//清理缓存
public void deleteById(Long id){
userMapper.deleteById(id);
}
当我们操作这个接口的时候删除数据,可以根据此数据的id来进行删除缓存
查看缓存中,那一条缓存数据已经被删除!
如果删除多条数据的时候 @CacheEvict 后面的参数应该为 allEntries=true 删除所有的键值对
@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache",allEntries = true)//删除所有的键值对
public void deleteAll(){
userMapper.deleteAll();
}
@Cacheable 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
@GetMapping
@Cacheable(cacheNames = "userCache",key = "#id")//反射Springcache创建一个代理对象查询redis
public User getById(Long id){
User user = userMapper.getById(id);
return user;
我们提前在缓存中新增两条数据 id是6和7,然后清空idea控制台日志
当我们调用这个接口的时候
发送完请求,响应回来了数据,但是idea控制台上并没有输出内容,就是因为加入了@Cacheable 注解,先查询缓存中是否有数据,如果有数据,则直接返回缓存数据。
当我们提交id为8(缓存中没有id为8的数据)的请求时
控制台输出了内容
缓存中新增了id为8的数据,因为没有缓存数据,调用方法并将方法返回值放到缓存中。
感谢大佬们的阅读,有不足的或者不懂得欢迎评论区或者私信提问,有问必答,希望大家多多关注,我会持续更新的!!!