如何优雅地编写缓存代码
-
使用缓存的逻辑非常通用,基本都是先查缓存,有直接返回,没有查DB,再放入缓存中。这段通用逻辑散落在系统的各个地方,违反了高内聚低耦合的原则。 -
缓存代码和业务逻辑代码深度耦合在一起,不仅降低了代码的可读性,还额外增加了系统复杂度。 -
如果要切换缓存(MDB->LDB)或者API升级时,所有涉及代码都需要改动。 -
如果要解决缓存击穿、缓存穿透、级联缓存等类似通用问题时,都需要通过框架去解决。
先读取缓存数据,如果有数据则直接返回,如果没有读取到数据,则读取DB数据,等数据返回后,再更新缓存。
这种场景,在日常编码中,很常见,太简单,但是实际的代码确实很不一样,列举如下几种:
▐ 传统写法
使用什么缓存,就直接使用,嵌入到业务代码中。这种代码不管是code review,还是后人学习业务代码时,都不想看,道理很简单,跟实际的业务功能无关,我不想知道你用什么缓存,你是怎么编码缓存代码的。
▐ 高级一点的写法
相比传统的写法,为了解决缓存各种数据格式(List、Map等),各种对象序列化问题(java、json),团队内可以针对缓存这块,封装成简单的API,方便大家使用。使用简单了,但代码依然嵌入在业务代码中,没有剥离出来。
▐ 注解写法
spring cache利用动态代理的方式,在代理类中处理缓存的相关操作,同时调用被代理类中的方法,从而可以使操作缓存的代码和业务代码分离,并且后期需要强化缓存能力时,也只需要修改代理类中的方法即可。
▐ 代码目录
▐ 注解导图
▐ 注解使用示例
@Cacheable(value = "user_cache", unless = "#result == null")
public User getUserById(Long id) {
return userMapper.getUserById(id);
}
@CachePut(value = "user_cache", key = "#user.id", unless = "#result == null")
public User updateUser(User user) {
userMapper.updateUser(user);
return user;
}
@CacheEvict(value = "user_cache", key = "#id")
public void deleteUserById(Long id) {
userMapper.deleteUserById(id);
}
▐ 方案分析
-
多级缓存; -
缓存定期刷新; -
列表缓存; -
缓存cpp保护机制; -
缓存计数。
学习spring cache框架方案,实现自定义cache框架,不仅保留spring cache框架的优点,同时实现spring cache很多缺失的能力,例如缓存击穿、缓存穿透保护,多级缓存等。
▐ 注解代码示例
▐ 方案架构
借助spring cache实现方式,构建自定义缓存框架,扩展了很多注解,例如计数、缓存刷新、列表缓存、分布式锁、多级缓存等,不仅实现了缓存代码和业务代码的分离,同时拓展了spring缓存的能力,极大的提升了代码的可读性,降低了缓存代码维护的效率。
天猫汽车技术团队的使命是极致体验的人车生活,重塑汽车行业,做你身边的贴心汽车管家,皆在打造消费者线上看车买车养车心智,数字化并垂直整合汽车行业,通过模式突破撬动品效合一,提升行业效率,创造行业红利。
本文分享自微信公众号 - 大淘宝技术(AlibabaMTT)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OpenAI、谷歌、微软等共同签署前沿人工智能安全承诺
在日前举办的第二届人工智能安全峰会上,OpenAI、谷歌、微软、xAI 以及智谱 AI 等全球 15 家顶级人工智能公司一道就 AI 开发安全承诺达成一致,签署前沿人工智能安全承诺(Frontier AI Safety Commitments)。 前沿人工智能安全承诺包括以下要点: 确保前沿人工智能安全的负责任治理结构和透明度。 基于人工智能安全框架,负责任地说明将如何衡量前沿人工智能模型的风险。 建立前沿人工智能安全模型风险缓解机制的明确流程。 以去年 11 月在英国举办的首届AI安全峰会发布的《布莱切利宣言》(Bletchley Declaration)为基础,前沿人工智能安全承诺旨在推动全球在人工智能安全方面的合作。 前沿人工智能安全承诺签署方名单如下:
- 下一篇
阿里云数据库 SelectDB 版全面商业化!开启现代化实时数据仓库的全新篇章
2024 年 5 月 21 日,由阿里云联合飞轮科技共同举办的「阿里云数据库 SelectDB 版商业化产品发布会」于线上召开。阿里巴巴集团副总裁、阿里云数据库产品事业部负责人李飞飞宣布,阿里云数据库 SelectDB 版在中国站及国际站全面发布,正式开启商业化的全新篇章! 阿里云数据库 SelectDB 版是专为现代企业量身定制的实时数仓解决方案,植根于开源 Apache Doris 的坚实基础,却不止于此——深度融合云随需而用的特性,依托阿里云基础设施,构建起云原生存算分离的全新架构,面向企业海量数据的实时分析需求,提供极速实时、湖仓融合统一、简单易用的云上数仓服务。 早在 2023 年初,阿里云与飞轮科技开启战略合作,围绕实时数据仓库这一方向不断深耕,探索符合现代化实时数据仓库的新标准。在一年多的时间中,双方的战略合作不断加深: 2023 年 3 月在阿里云瑶池数据库峰会上,阿里云与飞轮科技正式达成战略合作协议,共同研发新一代实时数据仓库“阿里云数据库 SelectDB 版”,为用户提供在阿里云上的全托管服务。 2023 年 8 月,“阿里云数据库 SelectDB 版” 上线开...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启