数字中国·星火文集 | 应用程序缓存服务的实现
- 发布时间:2022-06-21
- 来源:
- 大 中 小
- 打印
应用程序缓存服务的实现
神州控股
李小非
我们软件开发人员经常会遇到这样的情况。当业务累积的数据量越来越大时,打开有大量元素的页面或者大批量数据业务逻辑处理,如果没有缓存,感觉页面十分卡顿,用户体验很差,这个时候往往就要上缓存,来改善用户体验了。下面我把使用缓存的一些经验跟大家做个分享。
缓存就像是业务系统的润滑剂,它能让系统运行更加顺畅。那么哪些数据需要缓存起来呢?每个系统都有字典型数据,这类数据的特点是不常变更,数据量基本也是恒定的,在前后台程序处理中访问频率极高,这类是必须缓存的数据,直接缓存在内存中效果更佳。另外还有基础数据,修改频率相对低,但数据量不断的在增加,个别情况下会爆增,页面和代码处理中访问频率也极高,根据访问频率此类数据也需要缓存,但因为可能会出现爆炸式增长,放入内存可能会导致内存溢出,怎么办呢?解决此问题不得不提缓存实现的有两种方式:内存缓存和集中式缓存。
● 内存缓存是缓存数据直接放在内存中,这种方式访问速度快性能最佳,缺点是缓存数据量过大时容易导致内存溢出,分布式环境中需要设计缓存刷新机制来规避脏数据问题。目前比较成熟的内存缓存框架有Caffine Cache,Ehcache,Guava Cache等。
● 集中式缓存是缓存服务端单独部署,分布式环境中各应用通过网络获取缓存,这种缓存方式性能不如内存缓存,但缓存不占用应用服务器内存空间,数据集中存放,缓存的清除和更改时也不会出现各个应用获取到的数据不一致的情况。目前大多数应用使用Redis,Memcache做缓存中间件。
经过实践,我们根据内存缓存和集中式缓存的优缺点,我们通常会使用Redis+Caffine Cache来实现缓存服务。服务包含缓存配置维护,缓存数据维护,缓存自动加载,缓存自动更新。
● 新增缓存配置微服务,此服务配置缓存的过期策略,内存缓存最大数据量,缓存级别(集中式缓存,内存缓存和混用)等
● 缓存数据维护:添加查看和清除缓存的页面,方便运维手动数据库修改数据后,刷新缓存。
● 缓存获取根据配置缓存级别判断是否启用内存缓存和集中式缓存。缓存数据获取流程如下:
● 缓存自动加载
重新定义缓存数据加载接口,支持批量自动加载缓存。在没获取到缓存数据的时候,服务会自动从数据库加载,一行应用代码就能获取到需要的数据。
● 缓存自动更新
应用数据被修改时,通过Redis的发布订阅功能通知各应用,应用自动清空内存缓存和集中式缓存。
另外,缓存使用起来之后,要注意下面这些点:
1、使用内存缓存,需要注意内存溢出,内存缓存数不不易配置过大
2、分布式环境中下使用内存缓存,需要考虑同步措施,避免出现不同集群缓存数据不一致的情况。
3、集中式缓存使用时需要考虑到网络和序列化开销。
4、集中式缓存需要考虑单点问题,必要时需要考虑搭建集中式缓存集群,避免单点故障和网卡流量被占满的情况。
5、使用中需要监测缓存命中率,命中率低的数据没必要使用缓存
6、缓存的粒度越小越好,粒度越小命中率越高
以上就是我日常使用缓存技术的一些感悟,不足之处,请大家指正。