在实际开发中,缓存的使用无可避免,但怎样才算最佳姿势,把缓存的作用发挥到最大呢?
对于单个对象的缓存
这种情况应该是最简单的,使用唯一的Key将对象添加进去
然后在对象状态改变时,再根据Key将对象更新或者移除
这些都是缓存最基本的用法
对于集合对象的缓存
这种情况就稍微有点复杂了
最省事的办法,当然也是简单粗暴的将整个集合对象都添加到缓存
但如果集合中某个元素对象的状态发生了改变,就不太好处理了
如果这个元素对象被缓存的集合很少,倒还可以逐个对这些集合对象进行更新
但如果很多,或者不可预知,那数据一致性问题就会出现了
那如果换个方式,不再将整个集合对象存入缓存
而是将其中的每个元素都按照集合的KV分别进行缓存,这样一来当元素对象的状态发生改变时,只需要更新特定KV的缓存就行了
当然,这种方式想要从缓存整个获取集合对象时,还需要进行封装,稍显麻烦
对于列表对象的缓存
由于没有Key,所以列表对象与集合对象又不一样,不能直接将列表元素拆分
但是可以将列表对象进行一次转换:List<Obj> ===> List<String>
其实就是将列表元素对象,换成对象主键,比如ID
之后的用法就和集合类似了,只是在添加和查询缓存时,都需要进行封装
如何才能实现按需缓存
其实在生产环境里,某一个对象是否需要缓存,应该是DBA的活
他可以根据RDB的活动日志提供依据
但现在的情况是,由设计或编码人员在开发环境来决定某对象是否缓存,至少我们公司是这样。等部署到生产环境之后,由于各种原因,有效缓存的命中率经常出现偏差,需要修改程序来适应
所以隔一段时间就会想起来,如何实现可配置的按需缓存,可惜能力有限一直没有突破
以上是本人关于缓存的一些想法,其实到目前为止,自己绝大多数情况还是简单粗暴的用法,说了这么多,只是想知道大家都是怎么做的,有没有更好的办法