Redis 实现缓存 Spring Cache框架的使用

       在我们做项目的时候,往往会遇到访问数据库的操作,如果重复的进行某一个操作,会反复访问数据库,造成运行速度缓慢,这时候我们就需要使用缓存数据,减少数据库查询的操作。因为redis是基于内存的数据库,直接存储在内存上的,所以查询会很方便。

一:实现思路

       例如一个商城系统,我们查询某一种商品的时候,我们要访问后端服务,然后检查缓存是否存在,如果缓存存在,就进行读取数据,如果缓存不存在就查询数据库,然后将查到的数据库的内容载入到缓存中。

二:实现操作

        Redis实现缓存操作,我们基本上使用Spring Cache框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

     Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如:
· EHCache

· Caffeine

· Redis

  在 yml件中配置redis和数据库的的参数(具体内容参考上一篇文章

 首先我们需要在pom.xml文件中引入Cacheredis的依赖

 <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的数据,因为没有缓存数据,调用方法并将方法返回值放到缓存中。

感谢大佬们的阅读,有不足的或者不懂得欢迎评论区或者私信提问,有问必答,希望大家多多关注,我会持续更新的!!

  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值