buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

如何精准做到合同到期后不再发生业务?还是邻家系统做得真好!

本文以“合同”为例,来探讨特定应用场景的程序设计方案。

合同数据包含生效日 和 到期日。
到了合同的到期日,合同涉及的业务就不能再做了。

这是企业应用系统中常见的应用场景。
即:

  1. 业务发生时,要判断对应的合同是否有效
  2. 合同到期时,要标记为“已到期”

我们先定义合同的数据结构:

名称 类型 说明
contactId int 合同id
effectiveTime date 生效日
expiredTime date 到期日
status char 合同状态。INIT:初始-EFFECTIVE:生效中-EXPIRED:已到期

接着,我们定义合同服务类

interface contactService {
	// 判断合同是否有效
	boolean contactIsEffective(contactId);
	// 标记到期合同的状态为“已到期”
	void processExpiredcontacts();
}

当合同到期后,系统要标记合同的状态为“已到期”,我们的程序怎么实现呢?
这里需要考虑的一个重点是,要保证上面的第一点“到期的合同不能再发生业务”,否则就是系统bug了。


使用定时任务,大家自然而然会想到。

每天凌晨0:00定时跑批,检查系统里是否有当日到期的合同,到期则将status由“EFFECTIVE”改为“EXPIRED”。

这里会存在一个问题,就是无法精准控制合同有效期的问题。毕竟定时任务执行也有耗时的,在这期间被调用的 contactIsEffective(contactId) 会存在错误地返回true的情况。

这个问题怎么解决?

更坏的情况,假如,合同到期的粒度不是date,而是更细粒度的hour/minute,例如 某合同的到期时间是"2025-02-21 17:20:00",上面的定时任务,就更吃力了。

所以,怎么解决呢?


邻家系统一招搞定,简直不要太帅。

在 contactService#contactIsEffective 方法里,获取指定的合同记录后,当 status=EFFECTIVE 时,则再判断一下 expiredTime, 如果 expiredTime≥当前时间,则触发合同状态的变更,并返回false。(注:这里只谈程序实现思路,对于并发调用的控制等方面,本文不做讨论)

是不是很简单?是的,亲爱的你,有没有想起缓存技术中,缓存过期的惰性删除策略呢?是不是有异曲同工之妙呢!





ref:缓存过期的惰性删除(Lazy Deletion)策略

posted on   buguge  阅读(6)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2018-02-27 支付结果回调通知的安全控制(嘘,一般人我不告诉他~~)
点击右上角即可分享
微信分享提示