SpringBoot整合Cache缓存技术(二十一)中

简介: 二. Spring Cache 的概念二.一 几个重要概念&缓存注解二.二 @Cacheable/@CachePut/@CacheEvict 主要的参数二.三 SpEL上下文数据三. SpringCache 的注解用法三.一 @Cacheable三.二 @CachePut 缓存更新

二. Spring Cache 的概念

二.一 几个重要概念&缓存注解

8.png

二.二 @Cacheable/@CachePut/@CacheEvict 主要的参数

0.png

二.三 SpEL上下文数据

Spring Cache提供了一些供我们使用的SpEL上下文数据,下表直接摘自Spring官方文档:

2.png

注意:

1.当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。 如

@Cacheable(key = "targetClass + methodName +#p0")

2.使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。 如:

@Cacheable(value="users", key="#id")
@Cacheable(value="users", key="#p0")

SpEL提供了多种运算符

3.png

三. SpringCache 的注解用法

通常情况下, 传入的参数为 key, 返回的结果为 value

三.一 @Cacheable

    @Override
    // 指定了参数为 id:  变成了:  value::id 的key值
    @Cacheable(value=KEY_PRE,key = "#id")
    public User findById(int id) {
        return userMapper.findById(id);
    }

进行测试 传入的参数 是 40

4.png

当参数有多个时

 @Cacheable(value = KEY_PRE)
    @Override
    public List<User> findByNameAndSex(String name, String sex) {
        return userMapper.findByNameAndSex(name,sex);
    }

不指定 key 时 (传入参数 name为 周小欢 sex为 女 时), 默认的生成的缓存 key为:

user_::top.yueshushu.learn.service.UserServiceImpl.findByNameAndSex.周小欢女

可以 通过 key 进行指定

 @Cacheable(value = KEY_PRE,key = "#name")
    @Override
    public List<User> findByNameAndSex(String name, String sex) {
        return userMapper.findByNameAndSex(name,sex);
    }

生成 后的 key 为: user_::周小欢

key值 可以进行拼接

 @Cacheable(value = KEY_PRE,key = "#name+#sex")

生成后的key 为: user_::周小欢女

也可以使用 #p+参数序号 来指定

@Cacheable(value = KEY_PRE,key = "#p0+#p1")

生成的key 是: user_::周小欢女

也可以使用 SpEL 上下文进行处理

    @Override
    @Cacheable(value = KEY_PRE,key="#root.targetClass+#root.methodName+#id")
    public User findById(int id) {
        return userMapper.findById(id);
    }

传入参数是 40 的话,


生成的 key 是: user_::class top.yueshushu.learn.service.UserServiceImplfindById40


也可以指定 条件 condition 当条件满足时,才使用缓存。


传入 id 为 40, <30为false, 即条件为 false

@Cacheable(value = KEY_PRE,key="#root.targetClass+#root.methodName+#id",
condition ="#id<30" )

重新运行

5.png发生会查询数据库,不走缓存。 即使Redis里面有这个 key

unless 表示条件不满足时,使用缓存

    @Override
    @Cacheable(value = KEY_PRE,key="#root.targetClass+#root.methodName+#id",
    unless ="#id<30" )
    public User findById(int id) {
        return userMapper.findById(id);
    }

三.二 @CachePut 缓存更新

常用于修改缓存里面的内容。

设置 id=40 的用户的缓存, key为: user_::40

    @Override
    @Cacheable(value = KEY_PRE,key="#id" )
    public User findById(int id) {
        return userMapper.findById(id);
    }

6.png

修改用户的信息, 注意, 这个修改方法有返回值 User, 并不是以前的 void

    @Override
    @CachePut(value = KEY_PRE,key = "#user.id")
    public User updateUser(User user) {
        userMapper.updateUser(user);
        //更新全部的缓存信息
        return user;
    }

将返回值 放置到缓存里面。

    @Test
    public void updateTest(){
       User user=userService.findById(40);  //id随时更换
       user.setName("我换新的名字了");
       userService.updateUser(user);
       log.info("修改成功{}",user);
       findByIdTest();;
    }

运行处理

7.png

发现缓存里面的内容 也同步进行更新了.

8.png

添加方法时

注意, 方法有返回值, 为 User userMapper.addUser() 方法,会自动回显 id.

所以 key值用的是 #result 结果里面的id

   @CachePut(value=KEY_PRE,key = "#result.id")
    @Override
    public User addUser(User user) {
        userMapper.addUser(user);
        return user;
    }

测试方法

    @Test
    public void insertTest(){
        //1. 构建对象
        User user=new User();
        user.setName("岳泽霖");
        user.setAge(26);
        user.setSex("男");
        user.setDescription("一个快乐的程序员");
        //2. 添加方法
        userService.addUser(user);
        log.info("添加成功,{}",user);
    }

查看控制台输出

9.png

新添加的 用户 id 为56

10.png

根据 id=56 查询的话, 也是直接从缓存里面获取数据.

相关文章
|
3天前
|
缓存 NoSQL Java
SpringBoot实现缓存预热的几种常用方案
SpringBoot实现缓存预热的几种常用方案
|
3天前
|
存储 消息中间件 缓存
Redis缓存技术详解
【5月更文挑战第6天】Redis是一款高性能内存数据结构存储系统,常用于缓存、消息队列、分布式锁等场景。其特点包括速度快(全内存存储)、丰富数据类型、持久化、发布/订阅、主从复制和分布式锁。优化策略包括选择合适数据类型、设置过期时间、使用Pipeline、开启持久化、监控调优及使用集群。通过这些手段,Redis能为系统提供高效稳定的服务。
|
2天前
|
存储 缓存 监控
中间件Read-Through Cache(直读缓存)策略实现方式
【5月更文挑战第11天】中间件Read-Through Cache(直读缓存)策略实现方式
10 4
中间件Read-Through Cache(直读缓存)策略实现方式
|
2天前
|
存储 缓存 监控
中间件Read-Through Cache(直读缓存)策略注意事项
【5月更文挑战第11天】中间件Read-Through Cache(直读缓存)策略注意事项
8 2
|
2天前
|
存储 缓存 中间件
中间件Read-Through Cache(直读缓存)策略工作原理
【5月更文挑战第11天】中间件Read-Through Cache(直读缓存)策略工作原理
8 3
|
3天前
|
缓存 中间件 数据库
中间件Write-Through Cache(直写缓存)策略
【5月更文挑战第7天】中间件Write-Through Cache(直写缓存)策略
16 4
中间件Write-Through Cache(直写缓存)策略
|
3天前
|
存储 缓存 中间件
中间件Read-Through Cache(直读缓存)策略
【5月更文挑战第7天】中间件Read-Through Cache(直读缓存)策略
16 4
中间件Read-Through Cache(直读缓存)策略
|
3天前
|
缓存 NoSQL Java
springboot业务开发--springboot集成redis解决缓存雪崩穿透问题
该文介绍了缓存使用中可能出现的三个问题及解决方案:缓存穿透、缓存击穿和缓存雪崩。为防止缓存穿透,可校验请求数据并缓存空值;缓存击穿可采用限流、热点数据预加载或加锁策略;缓存雪崩则需避免同一时间大量缓存失效,可设置随机过期时间。文章还提及了Spring Boot中Redis缓存的配置,包括缓存null值、使用前缀和自定义过期时间,并提供了改造代码以实现缓存到期时间的个性化设置。
|
3天前
|
缓存 NoSQL Java
Springboot 多级缓存设计与实现
Springboot 多级缓存设计与实现
|
3天前
|
存储 数据采集 缓存
软件体系结构 - 缓存技术(10)布隆过滤器
【4月更文挑战第20天】软件体系结构 - 缓存技术(10)布隆过滤器
22 0