关于涉及到区间类型数值的缓存

场景是这样的:目前数据库里有每年公司节假日的日期信息(按天存储),现在需要计算一段时间内有多少天是节假日

比如:2021.1.1 ~ 2021.6.23 内,有多少天是公司规定的节假日

方案一:

直接按天缓存,key为日期,value为该日期是否为节假日,这样我们按所求时间,遍历一遍缓存,判断key 对应的value,即可获得范围内节假日天数

注意:需要缓存范围内所有的日期,不能只缓存节假日

​ (假如只缓存节假日,如果在缓存里查找不到,不能判断该key是过期了还是说非节假日)

优点:实现逻辑简单,缓存命中率高,全部拿出来遍历一遍即可

缺点:需要缓存的key太多了,需要多次调用缓存

方案二:

按左右区间进行缓存,key为[start_time,end_time] ,value为区间内包含多少天节假日

优点:value直接是所求的数值,拿出即可使用

缺点:命中率可能不高,假如目前有365天数据,那么key会有365 + 364 + 363 +… + 1种,一旦数据量提升,这样缓存的命中率过低

方案三:

在方案二的基础上,按照某个时间定点差值去存,key为 [选定的时间点,query_time],value为时间点到query_time这段时间内包含的节假日天数,假如目前求的是2020-1-10 ~ 2021-5-12 这段时间内节假日天数,那么我们可以统一选定一个时间点,比如2018-1-1,然后针对这个可以存两个key,一个为[2018-1-1,2020-1-10],另一个key为[2018-1-1,2021-5-12],到时候这两个key对应的value相减,即可求得答案。

优点:存的key数量不会像方案二一样膨胀,而且操作方便,取出两个value相减即可

缺点:普通做法只需要查一次数据库,这套方案在不命中的时候需要查两次数据库(需要求出两个key),所以在不命中的时候代价翻倍 了,而且和方案一一样,相对的key数量还是偏多了

最终方案:

从实际场景出发,涉及到的数据量不大,可以把查数据库的时间分摊到内存计算的时间上,直接把数据库的数据分摊放到缓存里,key为year,value为year对应的所有日期信息

优点: 按year年存储,涉及key的数量不多,而且缓存命中率高

缺点: 从缓存里拿出的数据不能直接使用,需要用代码按范围去过滤下(但是目前这个场景涉及的数据量不大,所以计算时间可以忽略不计)

关于涉及到区间类型数值的缓存相关推荐

  1. Python:一行代码将以e为结尾的科学计算法类型的数值转为小数点类型数值

    Python:一行代码将以e为结尾的科学计算法类型的数值转为小数点类型数值 目录 一行代码将以e为结尾的科学计算法类型的数值转为小数点类型数值 一行代码将以e为结尾的科学计算法类型的数值转为小数点类型 ...

  2. Excel如何为介于区间的数值设置背景颜色?

    今天小编要和大家分享的是,Excel如何为介于区间的数值设置背景颜色? (方方格子插件) 1.先看动图演示吧 ​ 2.操作之前呢ctrl+A选中所有的数据 ​ 3.然后选择方方格子操作命令按钮 ​ 4 ...

  3. C语言int类型数值溢出会怎么样

    c语言int类型数值占四个字节,就是32位.有符号能表示的范围为-2147483648 ~ 2147483647,无符号数表示的范围0~4294967295. 大于0的数: #include<s ...

  4. C++: double类型数值比较

    C++中double类型数值显示的为省略一些位数后的值,可能会出现两个值显示相同却在比较大小时不相等的情况 通常double类型的数值比较是限定一个范围,两数误差在允许范围内则认为这两个double类 ...

  5. android 开发中将十六进制 颜色代码 转换为int类型数值

    转载自:http://blog.csdn.net/ganlijianstyle/article/details/7597653 Android  开发中 将 十六进制 颜色代码 转换为  int   ...

  6. 常见网站各种类型页面的缓存时间及涉及的http头

    HTML缓存时间(单位秒): 根据内容的不同,缓存的时间也是不一样的,有些内容需要实时更新的,缓存时间为:43s,像图片这些内容缓存时间会长的多:134754s或者176716s,甚至更多 HTML页 ...

  7. JS-数据类型-数值Number

    参考文章:数值 1.概述 1.1整数和浮点数 JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型: 123; // 整数123 0.456; // 浮点数0 ...

  8. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

  9. java double==Double_java之double类型数值的比较

    先看demo: public classL26 {/***@paramargs*/ public static voidmain(String[] args) {//TODO Auto-generat ...

  10. JAVA:货币金额类型、精确小数类型数值的定义BigDecimal和基本运算操作

    1.精确小数类型需要用BigDecimal类型 在JAVA中有8种基本数据类型(boolean, byte, short, int, long, float, double, char),其中floa ...

最新文章

  1. 汽车高级驾驶辅助系统ADAS激光雷达创新者Cepton与Growth Capital达成企业合并协议
  2. JAVA《第一次作业》
  3. php 获取日期标签的值,在php中获取标签的选定索引值
  4. 在线小词典(mysql扩展库操作)
  5. 首个JDK 10(18.3)发行候选版(内部版本43)展示了新的版本控制方案
  6. 今天的圆圆的深圳4j
  7. 软工作业4:词频统计
  8. 李宏毅机器学习--课后作业HW_1
  9. RQNOJ 30 愚蠢的矿工 解题报告
  10. etal斜体吗 参考文献_期刊论文的参考文献格式
  11. 微计算机cpu是指什么,微处理器和CPU的不同是什么
  12. 浅谈Single-Pass算法
  13. 开博第一篇,为什么要开通博客,开通博客的申请理由
  14. 计算机专业顶岗实训,计算机专业学生的顶岗实习
  15. 一些常用的电脑词汇解释
  16. 保姆级教程|昨晚撸了一个ChatGPT群聊机器人
  17. cad角度命令怎么输入_新手入门,学习CAD必须掌握,教你使用标注命令,绘图效率翻一倍...
  18. 我是如何拿到腾讯头条美团小米的offer从小厂跳到大厂的?终局之战
  19. 中国CAR-T细胞疗法成果首登Nature,我们与背后公司聊了聊技术进展|量子位·对撞派 × 邦耀生物...
  20. windows在bat脚本中给系统添加.reg注册文件

热门文章

  1. 金蝶迷你版所有数据引出excel没有反应,如何处理
  2. C++学习(11)(综合题)
  3. 2021年中国异戊酰氯市场趋势报告、技术动态创新及2027年市场预测
  4. JAVA 清理垃圾文件简单实现
  5. 局域网即时通讯软件的实现
  6. JavaSE基础案例之模拟斗地主
  7. 计算机网络经典面试题:在浏览器中输入URL并按下回车后会发生什么?
  8. Ant Design vue v-decorate 进行数据绑定
  9. TANGENT_SPACE_ROTATION的解释
  10. 亲自用鸿蒙跑了个“hello world”!跑通后,我特么开始怀疑人生....