@Cacheable(value = “mtChannelConfigCache“, sync = true, key = “#sdkType“)这种是直接存在了本地缓存中吧,数据存入后就不会在变更

  1. 缓存存储位置和默认行为理解
    • 当使用@Cacheable注解时,数据存储位置取决于配置的缓存管理器(Cache Manager)。它不一定是本地缓存,也可以是配置为使用分布式缓存(如 Redis)。在没有特殊配置的情况下,可能是存储在内存缓存中,例如 Spring 默认的SimpleCacheManager提供的内存缓存。
    • 关于数据存入后不变更的问题,这是@Cacheable注解的默认行为导致的。其主要目的是为了提高性能,通过减少重复的数据库查询等操作来加速应用程序的响应。但这种设计确实会导致缓存数据和数据库数据不一致的情况,尤其是在数据库数据频繁变化的场景下。
  2. @Cacheable并非是 “垃圾” 的使用方式
    • 性能提升方面:在很多场景下,数据的变化频率相对较低,或者对数据的实时性要求不高。例如,一些配置信息(如系统参数配置、某些相对稳定的业务规则配置)可能一天或者几天才更新一次。在这种情况下,使用@Cacheable可以显著减少数据库查询的次数,从而大大提高应用程序的性能。
    • 缓存更新策略可以自定义:虽然@Cacheable默认不会自动更新缓存以匹配数据库的变化,但可以通过多种方式来实现缓存更新。比如,可以在数据库数据更新的代码位置添加逻辑来清除相关缓存(通过注入CacheManager并操作缓存),或者利用 Spring 的事件机制,在数据库更新事件发生时触发缓存清除或更新。另外,还可以使用一些高级的缓存库(如 Caffeine)提供的自动更新功能,结合 Spring Cache 来实现更灵活的缓存管理。
    • 适合于分布式系统中的缓存共享:当配置为使用分布式缓存(如 Redis)时,@Cacheable可以让多个服务实例共享缓存数据,这对于微服务架构等分布式系统来说是非常有用的。它可以避免不同服务实例重复查询相同的数据,进一步提高系统的整体性能和资源利用率。
`@Cacheable` 和 `@CacheConfig` 都是 Spring Framework 提供的用于支持缓存的注解。 `@Cacheable` 用于标注在方法上,表示该方法的返回结果可以被缓存起来,下次调用该方法时,如果缓存存在该结果,则直接返回缓存中的结果,而不会执行该方法。`@Cacheable` 注解有以下几个常用属性: - `value` 或 `cacheNames`:指定缓存的名称,可以指定多个,用 `,` 分隔; - `key`:指定缓存key,可以使用 SpEL 表达式; - `condition`:指定缓存的条件,可以使用 SpEL 表达式; - `unless`:指定缓存不应该被存储的条件,可以使用 SpEL 表达式; - `sync`:指定是否使用异步模式缓存结果,缺省为 false。 `@CacheConfig` 用于配置缓存的公共属性,可以标注在类上或接口上,表示该类或接口中所有使用 `@Cacheable`、`@CachePut`、`@CacheEvict` 等注解时,缺省的缓存名称和缓存管理器。`@CacheConfig` 注解有以下属性: - `cacheNames`:指定缓存的名称,可以指定多个,用 `,` 分隔; - `cacheManager`:指定缓存管理器的名称; - `keyGenerator`:指定缓存 key 的生成器; - `cacheResolver`:指定缓存解析器; - `condition`:指定缓存的条件,可以使用 SpEL 表达式; - `unless`:指定缓存不应该被存储的条件,可以使用 SpEL 表达式。 使用示例: ```java @CacheConfig(cacheNames = "menus_cache") @Service public class MenuServiceImpl implements MenuService { @Autowired private MenuRepository menuRepository; @Cacheable @Override public List<Menu> findAll() { return menuRepository.findAll(); } @Cacheable(key = "#id") @Override public Menu findById(Long id) { return menuRepository.findById(id).orElse(null); } @CachePut(key = "#menu.id") @Override public Menu save(Menu menu) { return menuRepository.save(menu); } @CacheEvict(key = "#id") @Override public void deleteById(Long id) { menuRepository.deleteById(id); } @CacheEvict(allEntries = true) @Override public void clearCache() { // 清空缓存 } } ``` 在上面的示例中,`@CacheConfig(cacheNames = "menus_cache")` 指定了缓存的名称为 `menus_cache`,因此在 `@Cacheable`、`@CachePut`、`@CacheEvict` 注解中不需要再指定缓存名称。`@Cacheable` 注解用于缓存 `findAll()` 和 `findById()` 方法的返回结果,`@CachePut` 注解用于更新 `save()` 方法的返回结果,`@CacheEvict` 注解用于删除 `deleteById()` 方法的返回结果,`clearCache()` 方法则用于清空缓存。这样,每次调用这些方法时,如果缓存中已经存在结果,则直接返回缓存中的结果,否则执行方法并将结果缓存起来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值