SpringBoot2.X整合Spring-Cache缓存开发的实现

SpringBoot2.X整合Spring-Cache缓存开发的实现

目录

引入依赖

配置

测试使用缓存

@Cacheable注解的使用

@CacheEvict注解的使用

@Caching注解的使用

@CachePut注解的使用

Spring-Cache的不足

读模式

写模式

总结

引入依赖 <!-- 引入redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 引入SpringCache --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> 配置

自动配置
CacheAutoConfiguration会导入 RedisCacheConfiguration;自动配置好了缓存管理器RedisCacheManager

配置使用redis作为缓存

spring.cache.type=redis 测试使用缓存

@Cacheable: Triggers cache population. 触发将数据保存到缓存的操作

@CacheEvict: Triggers cache eviction. 触发将数据从缓存删除的操作

@CachePut: Updates the cache without interfering with the method execution.不影响方法执行更新缓存

@Caching: Regroups multiple cache operations to be applied on a method.组合以上多个操作

@CacheConfig: Shares some common cache-related settings at class-level.在类级别共享缓存的相同配置

@Cacheable注解的使用

config中开启缓存功能 @EnableCaching

只需要使用注解就能完成缓存操作

/**  * 1、每一个需要缓存的数据我们都来指定要放到哪个名字的缓存。【缓存的分区(按照业务类型分)】  * 2、@Cacheable({"category"})  *      代表当前方法的结果需要缓存,如果缓存中有,方法不再调用。  *      如果缓存中没有,会调用方法,最后将方法的结果放入缓存。  * 3、默认行为  *      1)、如果缓存中有,方法不用调用。  *      2)、key默认自动生成:格式:缓存的名字::SimpleKey [](自主生成的key值) 例:category::SimpleKey []  *      3)、缓存的value值,默认使用jdk序列化机制。将序列化后的数据存到redis  *      4)、默认ttl时间:-1;  *  *   自定义:  *      1)、指定生成的缓存使用的key key属性指定,接受一个SpEl @Cacheable(value = {"category"}, key = "#root.method.name")                  key的SpEl可以参考:https://docs.spring.io/spring-framework/docs/5.2.19.RELEASE/spring-framework-reference/integration.html#cache-spel-context  *      2)、指定缓存的数据的存活时间 spring.cache.redis.time-to-live=3600000  *      3)、将数据保存为json格式  *  *  * @return  */ @Cacheable(value = {"category"}, key = "#root.method.name") @Override public List<CategoryEntity> findCatelog1() {   System.out.println("查询数据库---");   return baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", 0)); }

指定缓存数据的存活时间

spring.cache.redis.time-to-live=3600000

将数据保存为json格式:配置

@EnableConfigurationProperties(CacheProperties.class) @Configuration @EnableCaching // 开启缓存 public class MyCacheConfig {     /**      * 配置文件中的东西没有用上      *      * 1、原来和配置文件绑定的配置类是这样的      *      @ConfigurationProperties(prefix = "spring.cache")      *      public class CacheProperties      *      * 2、要让他生效      *      @EnableConfigurationProperties(CacheProperties.class)      * @return      */     @Bean     public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {         RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();         config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));         config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));         // 将配置文件中的所有配置都生效         CacheProperties.Redis redisProperties = cacheProperties.getRedis();         if (redisProperties.getTimeToLive() != null) {             config = config.entryTtl(redisProperties.getTimeToLive());         }         if (redisProperties.getKeyPrefix() != null) {             config = config.prefixKeysWith(redisProperties.getKeyPrefix());         }         if (!redisProperties.isCacheNullValues()) {             config = config.disableCachingNullValues();         }         if (!redisProperties.isUseKeyPrefix()) {             config = config.disableKeyPrefix();         }         return config;     } }

缓存的其他自定义配置

# 如果指定了前缀就用我们指定的前缀,如果没有就默认使用缓存的名字作为前缀 # spring.cache.redis.key-prefix=CACHE_ # 默认就使用分区名 spring.cache.redis.use-key-prefix=true # 是否缓存空值。防止缓存穿透 spring.cache.redis.cache-null-values=true @CacheEvict注解的使用

数据一致性中的失效模式

/** * 使用失效模式:先删除缓存,在访问系统获得缓存 * findCatelog1:缓存时的key名 * value = "category" 需要与缓存时的名称相同 * 存储同一个类型的数据,都可以指定成同一个分区。分区名默认就是缓存的前缀 */ // @CacheEvict(value = "category", key = "'findCatelog1'")// 删除具体key的缓存 @CacheEvict(value = "category", allEntries = true)// 指定删除某个分区下的所有数据 @Transactional @Override public void updateCascade(CategoryEntity category) { this.updateById(category); categoryBrandRelationService.updateCategory(category.getCatId(), category.getName()); }

数据一致性中的双写模式,使用@CachePut注解

@Caching注解的使用 /** * @CacheEvict: 失效模式:先删除缓存,在访问系统获得缓存 * 1、同时进行多种缓存操作 @Caching * 2、指定删除某个分区下的所有数据 * @param category */ @Caching(evict = { @CacheEvict(value = "category", key = "'findCatelog1'"),// 删除缓存 @CacheEvict(value = "category", key = "'getCatalogJson'"),// 删除缓存 }) @Transactional @Override public void updateCascade(CategoryEntity category) { this.updateById(category); categoryBrandRelationService.updateCategory(category.getCatId(), category.getName()); } @CachePut注解的使用

数据一致性中的双写模式

@CachePut // 双写模式时使用 Spring-Cache的不足 读模式

缓存穿透:查询一个null数据。解决:缓存空数据:spring.cache.redis.cache-null-values=true

缓存雪崩:大量的key同时过期。解决:加随机时间,加上过期时间。spring.cache.redis.time-to-live=3600000

缓存击穿:大量并发同时查询一个正好过期的数据。解决:加锁。SpringCache默认是没有加锁的。

@Cacheable(value = {"category"}, key = "#root.method.name", sync = true)

sync = true 相当于是加本地锁,可以用来解决击穿问题

写模式

读写加锁

引入Canal,感知到MySQL的更新去更新数据库

读多写多,直接去数据库查询就行

总结

常规数据(读多写少,即时性,一致性要求不高的数据),完全可以使用Spring-Cache。写模式:只要缓存的数据有过期时间就足够了

到此这篇关于SpringBoot2.X整合Spring-Cache缓存开发的实现的文章就介绍到这了,更多相关SpringBoot Spring-Cache缓存 内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    电脑cache文件夹|电脑里cache

    电脑cache文件夹|电脑里cache,,电脑里cache高速缓冲存储器(Cache)实际上是为了把由DRAM组成的大容量内存储器都看做是高速存储器而设置的

    SpringBoot自动配置的实现原理是什么

    SpringBoot自动配置的实现原理是什么,配置,组件,文件,方法,注册,获取,一、什么是springboot自动配置SpringBoot通过@EnableAutoConfiguration注

    SpringBoot启动流程是什么

    SpringBoot启动流程是什么,应用程序,方法,组件,上下文,对象,配置,SpringBoot启动过程简介SpringBoot应用程序的启动过程可以分为以下几个步骤:加

    cache、rom、ram的特点是什么

    cache、rom、ram的特点是什么,内存,硬盘,数据,运行,丢失,容量,cache的特点:在CPU与主存储器之间设置的一个一级或两级高速小容量存储器,其信息是

    qycache是什么文件

    qycache是什么文件,文件,缓存,爱奇艺,爱奇艺视频,回收站,音乐,qycache是爱奇艺的缓存文件夹,该文件夹是观看爱奇艺视频时自动缓存的,当删掉整个爱

    [Curator] Node Cache 的使用与分析

    [Curator] Node Cache 的使用与分析,缓存,节点,Node Cache 使用节点数据作为本地缓存使用。这个类可以对节点进行监听,能够处理节点的增删

    docker build 的 cache 机制

    docker build 的 cache 机制,镜像,命令,cache 机制注意事项 可以说,cache 机制很大程度上做到了镜像的复用,降低存储空间的同时,还大大缩短了

    WinXP系统下MSOCache是什么文件夹

    WinXP系统下MSOCache是什么文件夹,文件夹,文件,本文目录WinXP系统下MSOCache是什么文件夹MSOCache文件夹是干什么的MSOcache是什么文件能

    Cache是什么

    Cache是什么,地址,主存,主存储器,转换,容量,存储器,基本概念在计算机存储系统的层次结构中,介于中央处理器和主存储器之间的高速小容量存储器。