跟各位交流一下缓存的最佳用法

在实际开发中,缓存的使用无可避免,但怎样才算最佳姿势,把缓存的作用发挥到最大呢?

  1. 对于单个对象的缓存

     

    这种情况应该是最简单的,使用唯一的Key将对象添加进去

    然后在对象状态改变时,再根据Key将对象更新或者移除

    这些都是缓存最基本的用法


  2. 对于集合对象的缓存

     

    这种情况就稍微有点复杂了

    最省事的办法,当然也是简单粗暴的将整个集合对象都添加到缓存

    但如果集合中某个元素对象的状态发生了改变,就不太好处理了

    如果这个元素对象被缓存的集合很少,倒还可以逐个对这些集合对象进行更新

    但如果很多,或者不可预知,那数据一致性问题就会出现了

     

    那如果换个方式,不再将整个集合对象存入缓存

    而是将其中的每个元素都按照集合的KV分别进行缓存,这样一来当元素对象的状态发生改变时,只需要更新特定KV的缓存就行了

    当然,这种方式想要从缓存整个获取集合对象时,还需要进行封装,稍显麻烦

     

  3. 对于列表对象的缓存


    由于没有Key,所以列表对象与集合对象又不一样,不能直接将列表元素拆分

    但是可以将列表对象进行一次转换:List<Obj> ===> List<String>

    其实就是将列表元素对象,换成对象主键,比如ID

    之后的用法就和集合类似了,只是在添加和查询缓存时,都需要进行封装


  4. 如何才能实现按需缓存


    其实在生产环境里,某一个对象是否需要缓存,应该是DBA的活

    他可以根据RDB的活动日志提供依据

    但现在的情况是,由设计或编码人员在开发环境来决定某对象是否缓存,至少我们公司是这样。等部署到生产环境之后,由于各种原因,有效缓存的命中率经常出现偏差,需要修改程序来适应


    所以隔一段时间就会想起来,如何实现可配置的按需缓存,可惜能力有限一直没有突破


以上是本人关于缓存的一些想法,其实到目前为止,自己绝大多数情况还是简单粗暴的用法,说了这么多,只是想知道大家都是怎么做的,有没有更好的办法

评论区

潇洒太爷

2018-05-22 11:45

可以看看这个 http://www.jfinal.com/feedback/291

JFinal

2018-05-22 11:51

缓存的使用,粒度可粗可细,成本可高可低,需要视不同的场景选择最划算的方案

我这里简要说一个简单有效的方案:
1:对于 bean/model,使用 cache.put(id, bean) 的方式来缓存

2:在 Service 层添加 XxxService.get(List idList) 以及 get(Integer id) 的业务方法,该方法自动处理缓存的问题,外界通过 id 号就可以透明化地获取到 model/bean ,完全无需在关心 cache

3:对于 List beanList 这类列表,里头的 bean/model 只放 id 号,也就是一个 List idList

4:任何对于列表的查询,都只返回 select id,返回数据以后,再通过 XxxService.get(List idList) 获取数据

这样做的主要好处是,避免了各处分别缓存 model/bean 后需要数据同步的问题,也就是说 bean/model 只在内存中缓存一份来共享,更新缓存只需要更新一处

当然,还有别的一些好处,大家可以多多思考一下

netwild

2018-05-22 13:51

@潇洒太爷 看过了,跟我说的有些类似,看来这种情况很普遍

netwild

2018-05-22 13:52

@JFinal 跟我想的不谋而合,感谢老大的回复

kyytyp

2018-05-23 11:47

很多数据 还要关联的 而且还不是通过id关联的 感觉处理挺麻烦的

热门分享

扫码入社