背景:
系统遇到性能问题,瓶颈定位在数据库大表的频繁查询。解决方案采用hibernate加二级缓存的方法。但修改后测试性能不仅没有如预期上升反而大幅下降。
反思:
缓存机制的有效程度是数据敏感的,也就是不同数据操作下,结果可能大不相同。“命中率”可以解释缓存使用的有效程度。
参考:
https://blog.csdn.net/Alex_lagou/article/details/90694665
https://blog.csdn.net/luyaran/article/details/84875989
缓存命中率:命中率指的就是请求缓存次数和缓存返回正确结果的次数的一个比例,这个比例越高,就表明缓存的使用率越高。
缓存键的集合大小:缓存中的每个对象都是通过缓存键进行识别的,形如(Key, Value)。键是缓存中唯一的识别符,定位一个对象的唯一方式就是对缓存键进行精确的匹配。
性能影响:要尽可能减少缓存键的数量,键的数量越少,缓存的效率越高。设计缓存的时候要关注缓存键是如何进行设计的,它的整个的集合范围,限定在一个既能够高效使用,又可以减少它的数量,这个时候缓存的性能是最好的。
缓存最大数据量:是指在缓存中能处理元素的最大对象个数或者说所能使用的最大空间。通常来讲,各种缓存机制都会对缓存的最大数据量进行限制,可以是固定大小的存储空间、集合个数,或者是由操作系统所能处理和分配的存储空间决定。
缓存对象的生存时间:称为TTL。与之有关的是缓存更新策略一般有以下三种:
- FIFO(first in first out),也就是说,最先进入缓存的数据,在缓存空间不够的情况下,将会被先清除
- LFU(less frequently used),这里是说,最少使用的元素会先被清理,这里需要标记元素使用情况
- LRU(least recently used),这个说的是最近最少使用的元素会先被清理,需给元素标记时间戳,距离当前时间最远的元素,将会先被清理
性能影响:对象缓存的时间越长,被重用的可能性就越高。
超过缓存机制所允许的最大数据量,系统会进行相应的处理,一般有四种处理方式:
- 停止缓存服务,把所有的缓存数据清空
- 拒绝写入,不再对缓存数据进行更新
- 根据缓存更新策略,清除旧数据
- 在第三点的基础上,将淘汰的数据备份,腾出新的空间
Ehcache
参考:https://www.cnblogs.com/leehongee/archive/2012/03/23/2413106.html