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

简介: 三.三 @CacheEvict 清空缓存三.四 @CacheConfig 在类上统一设置三.五 @Caching 多注解组合

三.三 @CacheEvict 清空缓存

根据id 清空缓存 返回值可以是 void

    @Override
    @CacheEvict(value = KEY_PRE,key = "#id")
    public void deleteUser(int id) {
        userMapper.deleteById(id);
    }

清空缓存

   @Test
    public void deleteTest(){
        userService.deleteUser(56); //id随时更换
    }

11.png

发现数据库里面没有 id=56 的记录了, redis缓存里面也没有 key为 user_:: 56 的记录了。

findById 中 id=40 和 findAll() 生成两个缓存

12.png

删除时, 使用 allEntries=true 属性

    @Override
    @CacheEvict(value = KEY_PRE,key = "#id",allEntries = true)
    public void deleteUser(int id) {
        userMapper.deleteById(id);
    }

运行删除 id=56(已经不存在这条记录信息了)

13.png

发现, 会清空当前数据库下所有的缓存信息。 所以,这个属性 allEntries 不要乱用。

三.四 @CacheConfig 在类上统一设置

我们发现, 我们设置缓存时, 每一个方法,无论是 findById , 还是 deleteUser, updateUser , 都使用了一个前缀 value=KEY_PRE, 这个值是 user_ 可不可以将这个前缀统一设置呢?

可以使用 @CacheConfig 注解在类上来简化缓存的开发.

@Service
@Log4j2
@CacheConfig(cacheNames ={"user_"})
public class UserServiceImpl implements UserService {
    ... 
}    

这样在 方法上,就可以省略掉 以前的 value 属性。

    @Override
    @Cacheable(key="#id" )
    public User findById(int id) {
        return userMapper.findById(id);
    }
    @Override
    @Cacheable(key = "#root.targetClass+#root.methodName")
    public List<User> findAll() {
        return userMapper.findAll();
    }
    @Cacheable(key = "#root.targetClass+#root.methodName")
    @Override
    public List<User> findByNameAndSex(String name, String sex) {
        return userMapper.findByNameAndSex(name,sex);
    }

14.png

与以前是相同的效果。

可以一个实体类,设置一个相应的前缀信息。

三.五 @Caching 多注解组合

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Caching {
  Cacheable[] cacheable() default {};
  CachePut[] put() default {};
  CacheEvict[] evict() default {};
}

里面包含了三个常用的注解

    @Caching(
            cacheable = {
                    @Cacheable(key = "#name"),  // 放置缓存到 name
                    @Cacheable(key="#sex")     // 放置缓存到 sex , id的缓存用  put更新
            },
            put = {
                    @CachePut(key="#id")    //同时更新 id缓存
            }
    )
    @Override
    public List<User> findByNameAndSexAndId(String name, String sex, Integer id) {
        return userMapper.findByNameAndSexAndId(name,sex,id);
    }

会同时将查询的信息 放置到 name 属性的缓存, sex属性的缓存里面, 同时更新 id属性的缓存信息。

测试类

    @Test
    public void findNameAndSexAndIdTest(){
        log.info(">>>>>>>>目前数据库中存在的用户信息:");
        List<User> userList=userService.findByNameAndSexAndId("欢欢","女",40);
        userList.forEach(n->log.info(n));
    }

查看缓存的信息

15.png

这些就是 Spring Cache 的基本用法.

相关文章
|
3天前
|
缓存 NoSQL Java
SpringBoot实现缓存预热的几种常用方案
SpringBoot实现缓存预热的几种常用方案
|
3天前
|
存储 消息中间件 缓存
Redis缓存技术详解
【5月更文挑战第6天】Redis是一款高性能内存数据结构存储系统,常用于缓存、消息队列、分布式锁等场景。其特点包括速度快(全内存存储)、丰富数据类型、持久化、发布/订阅、主从复制和分布式锁。优化策略包括选择合适数据类型、设置过期时间、使用Pipeline、开启持久化、监控调优及使用集群。通过这些手段,Redis能为系统提供高效稳定的服务。
|
1天前
|
存储 缓存 监控
中间件Read-Through Cache(直读缓存)策略实现方式
【5月更文挑战第11天】中间件Read-Through Cache(直读缓存)策略实现方式
10 4
中间件Read-Through Cache(直读缓存)策略实现方式
|
1天前
|
存储 缓存 监控
中间件Read-Through Cache(直读缓存)策略注意事项
【5月更文挑战第11天】中间件Read-Through Cache(直读缓存)策略注意事项
8 2
|
1天前
|
存储 缓存 中间件
中间件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