请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Guava本地缓存实际使用上碰到的疑问

图片描述
视频中您提到了guava cache在使用缓存时,在调用cache.get()方法时,如果缓存中没有此key对应的值,则默认调用截图中的重写方法来查询数据库中的内容,这里有一个疑问,因为他属于匿名内部类重写方法,除了key之外无法传递其他的参数了 所以我再这里使用了自定义类来实现CacheLoader类的方式来完成 如图
图片描述
但是这样的话 代表每个需要缓存的操作都需要自定义一个类来对应进行操作(使用的dao层类不一、参数不一)
这样的操作个人觉得很复杂 必要性也不大 所以想咨询老师 这里如何进行操作和您在股票实战时是如何处理的

2.麻烦您看一下这样图片描述
如果调用getIfPresent方法得到缓存中没有所需要的数据(返回null),判断如果为null的时候就说明没有数据,则调用get方法来通过数据库获取,再put进缓存 这样两次调用get的相关方法 是否多余 有何改进的地方呢

谢谢老师~

正在回答

1回答

你好,股票项目里其实我都只使用的getIfPresent,判断为null时去数据库加载,并更新到缓存里供使用。这样做是基于很多前提的:首先大部分数据都会命中缓存,查询db很少(由于在各个环节引入大量缓存),我这边核心数据存储其实都是先放入redis的,所有查询也基于redis,基本上不用担心db并发查询带来的流量上涨。而对db操作流量最大的时间是放在闭市后的凌晨大部分都在睡觉。
我个人感觉这些东西没固定要求该如何写,懂得了api,根据自己的场景去分析使用就可以了。

0 回复 有任何疑惑可以回复我~
  • 提问者 寒暄丶 #1
    您好  那还有一个疑问是    在load函数中  只能使用的参数为一个  但是一般我们查询数据库需要spring自动注入的dao层类还有可能有别的参数  这种情况下  我只能想到用继承的方式自定义类加载来实现  但是也导致了每个都需要进行继承  很繁琐  所以产生了困惑
    回复 有任何疑惑可以回复我~ 2018-12-25 08:48:01
  • 提问者 寒暄丶 #2
    现在的做法是创建一个CacheUtil,在使用缓存的service上自动注入该util类,重写load函数中默认只返回null,不做数据库操作,然后再用getIfPresent方法,在null的情况下,直接查询数据库,这样可以做到这个工具类的通用,有一个问题,如果两个service都注入了该CacheUtil,如何保证两个为同一个CacheUtil呢 (感觉demo演变到实际应用还是要解决不少问题的)
    回复 有任何疑惑可以回复我~ 2018-12-25 09:24:01
  • Jimin 回复 提问者 寒暄丶 #3
    如果走spring注入的话本身就是单例的。上面那个回复,感觉你理解的有点偏差,本身对于cache而言,肯定只能是一个参数,这不是使用方不方便的问题,cache本身就是根据key去查对应的value,只是不存在key时你如果为这个key指定一个值。
    回复 有任何疑惑可以回复我~ 2018-12-25 09:44:20
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信