• slim
    2019-03-02
    老师请问这条配置有什么用:spring.cache.cache-names=coffee。
    我的理解是这条配置和注解@CacheConfig(cacheNames = "caffee")中的配置是重复的;
    可是去掉cacheNames或@CacheConfig都会报错,反而注释掉spring.cache.cache-names没什么影响。

    作者回复: 它们是不一样的,spring.cache.cache-names=coffee,是用来配置默认缓存的,启动时会把其中指定的缓存创建出来,运行时的缓存不能超出我这指定的范围(有同学反馈这个与底层的缓存实现有关,因此补充一下,比如Simple的不能超过,但Redis的可以),不配的话就看代码里用到哪些动态创建。@CacheConfig用来配置类级别共享的缓存配置,配置不在@CacheConfig里,就需要加在@Cacheable里。

    
     13
  • lovetyt
    2019-04-10
    老师 那如果我这边的proxyTargetClass用了默认值false,还是可以正常的运行是为什么呢?是因为spring自动在JDK动态代理和CGLIB之间转换了嘛?如果是这样相当于加上proxyTargetClass=True是我们不让spring去做转换而是直接强制转换的意思嘛

    作者回复: 你是说你没有配置proxyTargetClass,所以Spring用了默认的false?事实上,虽然你没有配置,但Spring Boot替你配了,你可以DEBUG一下看看你的Bean是不是被CGLIB增强了,即使你最后想尽一切办法设置成了false,Spring在判断你的Bean没有实现任何接口后,还是会给你设置为true,详见ProxyProcessorSupport.evaluateProxyInterfaces中有一行proxyFactory.setProxyTargetClass(true)。去年还有人给Spring Boot提过类似的issue,https://github.com/spring-projects/spring-boot/issues/12194 。

    
     7
  • WL
    2019-03-05
    想请教一下老师, 使用缓存和后面redis的缓存抽象时, key是这样的coffee::SimpleKey [], 想问一下这个key是什么类型, 我用get命令取不到, 用type命令查看类型也保存

    作者回复: 就是个string,你取不到是因为代码里设置了个比较短的过期时间5000,一下子就过期了,你把这个值设长点,然后就能看到了。

    
     4
  • 锋芒
    2019-03-03
    老师, 你好请问:Spring 在aop中获取@CacheConfig注解值时,怎么判断用jvm缓存, 还是用redis缓存呢 ?不需要显性设置选择缓存的类型吗 ?

    作者回复: Spring Boot会根据Classpath里的内容自动来判断的,有Redis相关类和配置时会用Redis。你可以用spring.cache.type来指定类型

    
     4
  • 小白
    2019-04-16
    老师,请教几个问题,百度的不是很明白,恳求解答一下
    1.@CacheConfig(cacheNames = "") 这种是修饰在类上的,可以详细解释一下么?这个cacheNames有什么用处呢?百度了一下说的不是很理解(有时候一个类中可能会有多个缓存操作,而这些缓存操作可能是重复的。这个时候可以使用@CacheConfig)
    2.@Cacheable(key = "")这个key是什么?用不用这个缓存不是看这个方法的参数么?
    3.调用方法缓存的时候,如果真实结果发生了改变,这个缓存是自动无效然后重新走一遍流程,然后把结果放到缓存里的么?还是说真实结果对他是无感的,只有设定了过期时间之后才能重新缓存?
    展开
    
     3
  • Vintage
    2019-04-02
    老师,如何去实现多级缓存,第一级内存,二级redis,三级数据库

    作者回复: 第三级已经不是缓存了,就是击穿后访问数据库了。至于前两级,如果你不打算自己手工编写,想用Spring的缓存抽象,可以看看CompositeCacheManager

    
     3
  • 齐红飞
    2019-04-02
    老师,数据被缓存到什么地方了,是不是对内存消耗比较大,缓存时,对数据大小有什么比较常规的推荐吗

    作者回复: 如果是默认的,那就在JVM里,如果你用的是Redis的缓存,那就存在Redis里,缓存就是用空间换时间。如果是放在Redis里的,Value很大就会带来一定的反序列化开销,Redis本身对大Key操作也有开销,尽量不要太大。另外,一定要设置过期时间,哪怕你的东西不变,可以设置一个比较长的时间,后面续期,也不要不设,除非你很确定,你就是永久的。

    
     3
  • wj
    2019-03-26
    老师,使用redis缓存时不需要指定何种存储类型么?是默认string类型,key为coffee?

    作者回复: 默认Spring会用序列化的方式来做转换,你可以设置大家都序列化成JSON,后面的课程的例子里我们会讲到怎么设置Redis的序列化和反序列化方式。

    
     3
  • bigbaldy
    2019-03-09
    老师好,请问如何给不同的cacheName设置不同的缓存配置,例如不同的ttl,不同的redis.host

    作者回复: 可以看下CompositeCacheManager,这里可以组合多个CacheManager,每个都能用不同的配置

    
     3
  • 远东通信-应用软件
    2019-07-13
    reloadCoffee怎么知道清理的是findAllCoffee?是因为加了类CacheConfig注解吗?

    作者回复: 因为默认用的是SimpleKeyGenerator,只看参数,大家都没参数就都是SimpleKey.EMPTY,所以直接就把无参数的缓存给清掉了。至于清哪个Cache,是因为加了CacheConfig

    
     2
  • 2018
    2019-05-08
    老师,如果@Cacheable修饰的方法中有多个sql 的调用,会把所有的sql的结果都做缓存嘛?

    作者回复: 这个注解缓存的是方法的结果,不管方法里是做什么的。

    
     2
  • 成立-Charlie
    2019-10-06
    老师,Spring的cache和hibernate的二级缓存是一回事吗?

    作者回复: 两个没什么关系

    
     1
  • jh.mai
    2019-09-11
    请问一下老师, 我有一个需求,需要缓存标准的三级地址数据(是全国的三级地址), 现在的时候方式是用redis,但是老师提过,如果是超过一天时间的缓存,建议放在jvm里面。 我在想,放到jvm里面,因为缓存的数据比较大,会不会存在影响到整个服务的性能。 对于这样的数据,老师可以给一下建议用什么缓存会比较好吗? 希望能得到很好的说明,谢谢!

    作者回复: 堆里缓存的东西多,年老代被占用的空间就会多,如果本身你的系统还是大量使用内存的,就会有点吃力,GC会变得频繁等等的。你可以计算一下,缓存的数据大概有多少MB,如果很大,可以设置LRU策略,并不用把所有的内容都放在JVM里,可以结合JVM和Redis,JVM内部没命中的,再访问Redis,替换掉很久没用的缓存。仅供参考。

     1
     1
  • 荣思敏
    2019-08-18
    老师,我差点哭了.......
    您之前解释说是用来配置默认缓存的,启动时会把其中指定的缓存创建出来,运行时的缓存不能超出我这指定的范围;
    spring.cache.cache-names=coffee

    我确定在这里解释的不够准确,我查了官网(不过我英文不好,用翻译软件了...)如果在没用redis的情况下,确实是您说的那种,指定了范围,如果程序中指定的名字不在其中,会报错,已测试。
    If Redis is available and configured, a RedisCacheManager is auto-configured. It is possible to create additional caches on startup by setting the spring.cache.cache-names property and cache defaults can be configured by using spring.cache.redis.* properties. For instance, the following configuration creates cache1 and cache2 caches with a time to live of 10 minutes:
    展开

    作者回复: 这里如果使用的是Simple的缓存,你会发现的确会报错,如果是Redis,不会报错,Redis里会看到你CacheName前缀的缓存,还是和底层的缓存实现有关的。

    
     1
  • kklives
    2019-08-12
    丁老师您好想请教下 我能在项目中同时使用 Spring的缓存抽象(注解方式)和lettuce 客户端吗?

    作者回复: 可以的,你担心的是同时引入Jedis和Lettuce的依赖是吧,最差的情况不就是都自己手写配置Bean么,也不会再差了

    
     1
  • lovetyt
    2019-04-01
    老师能不能讲解一下 这边的 proxyTargetClass=true是什么意思呢,

    作者回复: Spring基于Java接口的动态代理要求你的目标类得要实现接口,动态代理出来的类也是这个接口的实现,但往往很多时候,我们的类是没有实现什么接口的,故意去写一个接口也挺繁琐的,所以proxy-target-class让我们可以直接对类做代理。

    
     1
  • 二木🐶
    2019-03-08
    老师想了解下,这里如果配置了多个redis实例,怎么根据不同业务来配置指定的redis缓存呢

    作者回复: 可以看下CompositeCacheManager,这里可以组合多个CacheManager,每个都能用不同的配置

    
     1
  • HUANGKAIHANG
    2019-03-04
    cache-demo是将数据缓存在JVM,cache-with-redis-demo是将数据缓存在redis。可以这样理解吗?我还想问下,配置文件里的spring.cache.cache-names=coffee和Service类上的注解@CacheConfig(cacheNames = "coffee"),这两处设置有什么实际作用,谢谢老师。

    作者回复: 你的理解是对的。至于spring.cache.cache-names=coffee,是用来配置默认缓存的,启动时会把其中指定的缓存创建出来。@CacheConfig用来配置类级别共享的缓存配置。

    
     1
  • Geek_6df81b
    2020-01-15
    老师,我们如何在不同场景下设置不同的缓存ttl?

    作者回复: 用不同的CacheManager,在@Cachable注解上指定自己的CacheManager

    
    
  • lester
    2020-01-04
    老师好,您多次强调了在redis中要设置过期时间,有这样一个场景,某种促销活动只能在特定时间区间内有效,那么促销活动相关描述的缓存过期时间可否为当前时间与结束时间的时间差(比如相差多少秒)?一般类似场景是这样实现的么?

    作者回复: 那你缓存的是活动的生效和失效时间吧,如果这个值用的频繁,可以考虑缓存在JVM内部。缓存时间方面要看你的情况,有时你在活动结束后也会需要这个值的,比如活动结束后用户又打开了这个页面,你需要判断当前不在活动期。

    
    
我们在线,来聊聊吧