首页 > 数据库 >redis-SpringCache-简介

redis-SpringCache-简介

时间:2023-03-20 21:02:02浏览次数:34  
标签:缓存 SpringCache 简介 cache redis key spring config

image.png

整合&体验@Cacheable

引入依赖

<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>

自动配置 使用redis

application.properties 设置 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  在类级别共享缓存的相同配置

使用缓存
开启缓存注解 并使用注解 
@EnableCaching
启动程序
@Cacheable({"category"})
@Override
实现类

//每一个需要缓存的数据我们都来指定要放到那个名字的缓存。[缓存的分区 (按照业务类型分)]
//代表当前方法的结果需要缓存,如果缓存中有,方法不用调用。如果缓存中没有,会调用方法,最后将方法的结果放入缓存

自定义缓存 SPEL 语法

指定生成的缓存使用的key -》 key属性指定 接受一个sqel 指定缓存的数据的存话时间 配置文件中设置失效时间 -》spring.cache.redis.time-to-live=360000 //毫秒 将数据保存为Json格式 @Cacheable(value = {"category"},key ="#root.method.name" ) //key ="'level1Categorys'" CacheAutoConfiguration->RedisCacheConfiguration 自动配置->RedisCacheManager->初始化缓存-> ->初始化所有的缓存-)每个缓存决定使用什么配置- ->如果redisCacheConfiguration有就用已有的,没有就用默认配置 ->想改缓存的配置,只需要给容器中放一-个RedisCacheConfiguration即可 ->就会应用到当前RedisCacheManager管理的所有缓存分区中

redis 客户端倒计时TTL 不生效 自定义配置

MyCacheConfig

//CacheProperties.class 生效 配置redisProperties 开启功能
@EnableConfigurationProperties(CacheProperties.class)
@EnableCaching
@Configuration
public class MyCacheConfig {
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){
        //改造 覆蓋原來的
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        //传入序列化器K V
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        // GenericJackson2JsonRedisSerializer转换json序列化
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        //装配CacheProperties 获取redist 使下面生效
        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.type=redis
#缓存过期时 毫秒单位
spring.cache.redis.time-to-live=3600000
#开启缓存前缀 不指定默认使用缓存名字
spring.cache.redis.key-prefix=CAHCE_
spring.cache.redis.use-key-prefix=false
#是否缓存空数,防止缓存穿透
spring.cache.redis.cache-null-values=true

#规定规范 
#开启缓存前缀 不指定默认使用缓存名字
#spring.cache.redis.key-prefix=CAHCE_
spring.cache.redis.use-key-prefix=true
层次分明

image.png

//@CacheEvict  删除缓存  CacheEvict 删除缓存 并指定删除哪个
@CacheEvict(value = {"category"}, key = "'getLevel1Categorys'")
@Override

//同时进行多种缓存操作
@Caching(evict = {
        @CacheEvict(value = {"category"}, key = "'getLevel1Categorys'"),
        @CacheEvict(value = {"category"}, key = "'getCatalogJson'")
})
或
@CacheEvict(value = "category", allEntries = true) //删除分区下面的所有缓存

springcache不足

缓存穿透:查询-个nul数据。解决:缓存空数据; 解决ache- null-values=true
缓存击穿:大量并发进来同时查询一个正好过期的数据。解决:加锁; ? 默认不加锁 sync = true 
   @Cacheable(value = {"category"}, key = "#root.method.name",sync = true)
缓存雪崩:大量的key同时过期。解决:加随机时间。加上过期时间  解决spring.cache.redis.time-to-live=3600000

代码

//远程调用加入缓存 当前被调用的方法的参数列表
    @Cacheable(value = "attr",key = "'attrinfo:'+#root.args[0]")
    @Override
    public AttrRespVo getAttrInfo(Long attrId) 
//同时进行多种缓存操作
//@Caching(evict = {
//        @CacheEvict(value = {"category"}, key = "'getLevel1Categorys'"),
//        @CacheEvict(value = {"category"}, key = "'getCatalogJson'")
//})
@CacheEvict(value = "category", allEntries = true) //删除分区下面的所有缓存
@Transactional //事务
@Override
public void updateCascade(CategoryEntity category)
//每一个需要缓存的数据我们都来指定要放到那个名字的缓存。[缓存的分区 (按照业务类型分)]
//代表当前方法的结果需要缓存,如果缓存中有,方法不用调用。如果缓存中没有,会调用方法,最后将方法的结果放入缓存
@Cacheable(value = {"category"}, key = "#root.method.name",sync = true) //key ="'level1Categorys'"
@Override
public List<CategoryEntity> getLevel1Categorys()

标签:缓存,SpringCache,简介,cache,redis,key,spring,config
From: https://blog.51cto.com/u_15993308/6138624

相关文章

  • Spring Http Invoker使用简介
    [color=red]SpringHTTPinvoker是spring框架中的一个远程调用模型,执行基于HTTP的远程调用(意味着可以通过防火墙),并使用java的序列化机制在网络间传递对象。这需要在......
  • Redis整数集合
    集合键的底层实现之一,当集合只包含整数值元素,且报价函的元素不多时,就会使用整数集合作为集合键的底层实现。intset实现typedefstructintset{ uint32_tencoding;//......
  • redis存储session如何查询当前请求的sessionID
    redis存储session如何查询当前请求的sessionID问题项目登录信息session使用的redis存储,在排查bug过程中需要查询缓存;发现无法知道,当前的浏览器请求获取到的缓存信息;解......
  • linux安装redis
    redis-server../redis.conf开启服务,进程得守护着,命令终端不能退出redis-server&../redis.conf开启服务,进程不用留在终端打开的效果解决办法:https://www.......
  • Redis类型(type)与编码(encoding)
    本文已收录至Github,推荐阅读......
  • X60(L415)钢板简介、X60执行标准、X60期货订轧
    一、X60(L415)管线钢简介:L415就是X60,X60属于管线钢,钢的牌号表示方法:L:代表输送管线Line的首位英文字母,415:代表钢板规定的屈服强度值,X:代表管线钢,60:代表钢板规定的屈服强度值,单......
  • Redis类型(type)与编码(encoding)
    本文已收录至Github,推荐阅读......
  • 15CrMo钢板简介、15CrMo期货订轧、15CrMo执行标准
    一、15CrMo钢板简介:15CrMo钢板定为于合金结构钢板,15CrMo钢板生产执行标准为;WYJ舞阳专用技术条件。由于钢中含有较高含量的Cr、C和其它合金元素,钢材的淬硬倾向较明显,焊接性......
  • Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)
    文章目录​​1.Sa-Token介绍​​​​2.登录认证​​​​2.1登录与注销​​​​2.2会话查询​​​​2.3Token查询​​​​3.权限认证​​​​3.1获取当前账号权限码......
  • MongoDB简介及SpringBoot整合
    一、概述MongoDB中的记录是一个文档,它是一个数据结构组成字段和值对。MongoDB文档类似于JSON。对象。字段的值可能包括其他文档、数组、和文档数组:数据库(Database):和关系型......