需求是可以给店铺配置周一至周日每日是否营业,可以选择24小时营业,不营业,多时间段营业,跨天营业。并且这个要考虑时区,不同时区的周一08:00-18:00是不一样的。
最后实现查询店铺时过滤掉不营业的店铺。
配置json,一个对周一至周日多时间段的配置。
{"stopBusiness":false,"timeZone":"Canada/Yukon","weekdayConfig":[{"index":0,"noBusiness":false,"allDay":false,"timeSegment":["15:25-03:00","01:16-07:11"]},{"index":1,"noBusiness":false,"allDay":true,"timeSegment":[]},{"index":2,"noBusiness":false,"allDay":true,"timeSegment":[]},{"index":3,"noBusiness":false,"allDay":false,"timeSegment":["00:51-23:51","15:05-19:05"]},{"index":4,"noBusiness":false,"allDay":true,"timeSegment":[]},{"index":5,"noBusiness":false,"allDay":true,"timeSegment":[]},{"index":6,"noBusiness":false,"allDay":true,"timeSegment":[]}]}
这样的配置是没办法在数据库层面解析判断的,我现在的做法是把时间段转换成一个分钟数组,比如周一的08:00-18:00相当于是560-1080,周二的08:00-18:00相当于是2000-2520
最终生成一个int[] timeSegment = new int[]{560,1080,2000,2520},再把这个时间段根据服务器时区和配置时区的差值做修正,就得到服务器时区下的一个多时段配置。后续判断是否营业只需要看某个时间点是否在timeSegment的某个区间内。
在java端维护所有营业时间数据,每次数据库查询,先在程序中找出所有营业店铺,然后sql中使用
select *** from shop where shop_id in (营业中店铺id列表)
现在有个问题就是,如果店铺量很多时,上千上万个店铺在营业,这个sql就很长,感觉不合理。
如果在数据库中使用一个字段标记是否营业,需要定时任务,不停的修改为营业或者不营业,这个频率应该很低,十几个小时一次。
我很想知道这种场景下,最优的处理方式是什么样子的?这种频繁变动的字段是否合适,是否需要特别处理?是否需要单独一个表(店铺id,营业状态)来处理?
要不就这样,每天凌晨算出当天营业的店铺,塞入缓存。这样想查询结果就可以直接查询缓存就行