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

相关文章

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

使用Spring Cache时设置缓存键的注意事项详解

《使用SpringCache时设置缓存键的注意事项详解》在现代的Web应用中,缓存是提高系统性能和响应速度的重要手段之一,Spring框架提供了强大的缓存支持,通过​​@Cacheable​​、​​... 目录引言1. 缓存键的基本概念2. 默认缓存键生成器3. 自定义缓存键3.1 使用​​@Cacheab

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论