SpringCache分布式缓存学习

摘要:
SpringCache简介Cache接口为缓存的组件规范定义,包含缓存的各种操作集合Cache接口下Spring提供了各种xxcache的实现;如RedisCache,EhCacheCache,ConcurrentMapCache等;每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。

Spring Cache

简介

  • Cache接口为缓存的组件规范定义,包含缓存的各种操作集合
  • Cache接口下Spring提供了各种xxcache的实现;如RedisCache,EhCacheCache,ConcurrentMapCache等;
  • 每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。

image-20200630140504269

引入依赖

<!--引入spring cache-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-cache</artifactId>
		</dependency>

配置

spring.cache.type=redis

开启注解

@EnableCaching

常用注解

  • @Cacheable:触发操作将数据保存到缓存中,参数value指cacheName
  • @CacheEvict:触发操作将数据从缓存中删除(运用于失效模式)
  • @CachePut:不影响方法执行更新(运用于双写模式)
  • @Caching:组合以上多个操作
  • @CacheConfig:再类级别上共享有关缓存的配置

默认配置

  • key自动生成:缓存名字::SimpleKey[]
  • value默认是jdk序列化
  • 默认ttl时间:-1
  • 默认查询数据如果缓存中存在,则不再调用方法,直接将缓存中命中的数据返回

自定义配置

SpringCache分布式缓存学习第2张

  • 指定key:

    • key默认为spel表达式:#root.method.name指用方法名作为key保存在缓存中

      • @Cacheable(value="category",key="#root.methodName")

      image-20200630163456360

    • key是字符串的话额外要加单引号(默认会做表达式解析)

      • @Cacheable(value=“category”,key=“‘catalogJson-cache’”)
    • 缓存key表达为:

      • 指定前缀(前提:有指定前缀并且开启了使用前缀)+指定key名

        image-20200630154750496

      • 推荐: 默认前缀(缓存名字,前提:允许使用前缀,没有指定前缀):: key名字 (并且保存在以指定的缓存名字namespace下,树形结构显示)

        image-20200630154927208

      • key名字(前提:无前缀)

        image-20200630155220833

  • 指定其他信息

    spring.cache.type=redis
    #指定ttl,单位必需(m,s,h,d)
    spring.cache.redis.time-to-live=3600000m 
    spring.cache.redis.key-prefix=CACHE_
    spring.cache.redis.use-key-prefix=true
    #默认允许缓存空值->解决缓存穿透问题,暂时性保存null给其他并发线程返回,以保护数据库
    spring.cache.redis.cache-null-values=true 
    
  • 将value改为json格式(默认Jdk序列化器)

    Redis序列化器:

image-20200630150852638

@EnableCaching
@Configuration
public class MyCacheConfig {

    @Bean
    RedisCacheConfiguration cacheConfiguration(CacheProperties cacheProperties){
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        //entryTtl方法返回一个新的RedisCacheConfiguration对象覆盖原有对象,其他属性方法也是如此
        //cacheConfig=cacheConfig.entryTtl()
        //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;
    }

}

更新缓存数据

1、@CacheEvict

用于缓存失效模式:修改后删除该缓存信息

@CacheEvict 是用来标注在需要清除缓存元素的方法或类上的

  • 单个删除:

    在方法上标注(一般为保存,更新方法)

    @CacheEvict(value="category",key="'getLevel1Categories'")

    表示一旦执行该方法则会从缓存中删除对应的key

  • 批量删除:

    1. @Caching批量操作

      @Caching(evict = {
              @CacheEvict(value="category",key="'getLevel1Categories'"),
              @CacheEvict(value="category",key="'getCatalogJson'")
      })
      
    2. 删除整个namespace(一般统一类型的数据存放在同一个分区中)

      @CacheEvict(value="category",allEntries = true)

      • allEntries:默认为false,当其为true时表示清除缓存中的所有元素
      • beforeInvocation:默认是false,表示执行方法后删除(当方法如果因为抛出异常而未能成功返回时也不会触发清除操作),当指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

2、@CachePut

用于缓存双写模式:修改后立即写入缓存

@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行方法,并将结果(方法返回值)存入指定的缓存中

免责声明:文章转载自《SpringCache分布式缓存学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python笔记:str.contains小坑之 UserWarning To actually get the groups, use str.extract.Oracle 汉字转拼音下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

怎样使java程序减少内存占用(转载)

本文收集网上关于减少java程序占用的一些小知识点 (1)别用new Boolean()。 在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与get都是通过Boolean封装传递的,大部分ORM也是用Boolean来封装boolean类型的,比如: ps.setBoolean("isClosed",new Boolean(t...

如何查看网页缓存的密码

原理其实很简单:input的text与password 1.把鼠标停放在 密码区,单机右键”查看原素“得到的代码 <input name="pwd" type="password" size="15"> 与文本区块进行切换就可以查看出密码了 <input name="pwd" type="text" size="15">...

Linux性能监控

一、CPU 良好状态指标 CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70%。 上下文切换:与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的。 可运行队列:每个处理器的可运行队列<=3个线程。 监控工具 vm...

Java并发机制和底层实现原理

  Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码转化为汇编指令在CPU上执行。Java中的并发机制依赖于JVM的实现和CPU的指令。      Java语言规范第三版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排它锁单独获得这个变量...

分布式算法(一致性Hash算法)

转载:https://www.cnblogs.com/moonandstar08/p/5405991.html 一、分布式算法     在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin)、哈希算法(HASH)、最少连接算法(Least Connection)、响应速度算法(Response Time)、加权法(...

7.模块化封装Storage实现缓存数据持久化

1.模块化封装Storage实现缓存数据持久化 1.在src目录下新建目录model,在model目录下新建js文件取名storage.js var storage={ set(key,value){ // 设置为本地缓存方法 localStorage.setItem(key,JSON.stringify(valu...