dao设计(一),缓存更新事件通知

2024-08-31 05:38

本文主要是介绍dao设计(一),缓存更新事件通知,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

场景: 在缓存应用中,我们常见做法是在增删改时使缓存失效,在查询时优先查询缓存,缓存不存在则从db中获取数据返回并更新缓存,如果我们采用一般常见写法,代码会比较冗余且有很多重复,解决这种重复代码有很多种方法,如采用模板模式,但今天我想要讲的是采用注解加事件通知方法实现。
设计:
1. 设计点在于查询,当我们调用一个查询方法时,我们希望优先查询缓存,缓存不存在则查询db,然后根据db返回结果更新缓存并返回,可以发现,几乎所有的查询方法我们都会有这样的要求。因此我们希望能够拦截想要走缓存的查询方法,此时,采用注解+aop拦截会是很不错的选择。
2. 每个查询的结果都与请求的参数有关,比如查询我的已发货订单集合,需要我的用户ID,已发货类型这2个参数。在我的已发货订单集合这个应用场景中,假设我们系统调用了发货接口,此时订单状态改变,我们需要失效我的发货订单集合这个缓存,但新增订单对此次查询不会产生影响。因此这个场景只需要关注更新这个方法,所以我们可以这么设计,新增和编辑时发出对应的add和update事件,查询我的已发货订单集合需订阅update事件。
3. 订单状态改变需要失效订单集合,简单的方法是将对应的集合数据删了,另一种方法是引入版本号,获取一个缓冲数据前先获取一下版本,然后将版本和数据key前缀组成数据查询key一起去获取数据,这样当我们需要失效数据时,只需要升级一下版本就行,版本用当前时间毫秒数即可。缓存key设计,我们自然希望每次失效的数据量最少,最好仅失效此次相关的数据,比如查询我的已发货订单集合,如果采用版本号设计,我们希望用户id和已发货类型关联的数据都失效,因此key设计成dao名称+方法+用户ID+订单状态,这样刚好失效我的已发货订单集合数据。
4. 从上面key的设计中我们可以看出,为了使key不要重复,我们采用dao名称+方法+参数去拼接,dao名称和方法基本不多,但参数却是千变万化的,对于这种变化的数据,最好能用一种通用方法获取,比如反射。
示例图:
这里写图片描述

这篇关于dao设计(一),缓存更新事件通知的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123041

相关文章

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

如何关闭Mac的Safari通知? 3招教你关闭Safari浏览器网站通知的技巧

《如何关闭Mac的Safari通知?3招教你关闭Safari浏览器网站通知的技巧》当我们在使用Mac电脑专注做一件事情的时候,总是会被一些消息推送通知所打扰,这时候,我们就希望关闭这些烦人的Mac通... Safari 浏览器的「通知」功能本意是为了方便用户及时获取最新资讯,但很容易被一些网站滥用,导致我们

JSR-107缓存规范介绍

《JSR-107缓存规范介绍》JSR是JavaSpecificationRequests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧... 目录1.什么是jsR-1072.应用调用缓存图示3.JSR-107规范使用4.Spring 缓存机制缓存是每一

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red