首页 > 数据库 >redis缓存恢复-2022新项目

redis缓存恢复-2022新项目

时间:2022-09-03 14:11:44浏览次数:57  
标签:transmitActivityTotal 缓存 redis 更新 缓存数据 2022 数据 字典

一、业务场景

  Web项目开发中,为了加快数据处理的的效率,大量的使用了各种缓存,缓存技术主要使用的是redis。导致出现的小小的

问题是对redis缓存形成了一个比较强的依赖,并且有的数据暂时是没有同步到业务数据库当中进行存储的,有不少数据都是直

接从缓存中获取。这种处理方式确实加快了数据的处理效率,可是也存在一些问题。

二、需求分析

  当前由于系统要进行迁移,以前保存在一台服务器上面的redis中的数据,是不可能迁移的。即使运维人员愿意迁移,操作起来

也是相当的麻烦。还有一个问题,如果发现缓存中的数据存在异常,如何使用某种机制去自动更新缓存或者是手动更新缓存数据,让

缓存中的数据和数据库中的最终趋于一致,并且保证数据的正确性呢?这就需要做缓存恢复。

三、解决方案

  缓存恢复只针对时效性比较长的数据,如果某些缓存数据几分钟更新一次,或者十几分钟更新一次,这种缓存数据就可以考虑不用

恢复。对于某些没有失效时间限制的一些缓存数据,就需要做这种处理。需要使用的地方:一种情况是系统迁移的时候;一种情况是缓存

数据出现问题,需要采取某种措施更新缓存的时候。下面就来聊聊两种缓存更新的方式。

.方式一:通过接口请求更新缓存.

这种方式比较常规,就是写一个普通的接口,发一个请求到后台,传递对应的参数进行缓存更新操作。这种操作方式是立马全量更新

所有的缓存数据。对于数据量不大的业务比较适合,更新的时间也不会太久,预估可能就一两分钟的样子。可是当数据量很大的时候,

比如少说几十万甚至更多的数据都需要添加到缓存中,这种应该如何处理呢?

public boolean updateTest() {
Map<Integer, List<TransmitActivityTotal>> transmitActivityTotalMap = new HashMap<>(30);
List<TransmitActivityTotal> transmitActivityTotals = null;
StopWatch stopWatch = new StopWatch();
stopWatch.start();
try {
// 查询数据
for(int i = 0; i < 30; i++){
// 根据不同的分表信息查询不同的数据
transmitActivityTotals = null;
transmitActivityTotalMap.put(i, transmitActivityTotals);
}

// 处理数据
if (transmitActivityTotalMap.isEmpty()) {
return false;
}
Map<Long, Integer> idTotalMap = new HashMap<>();
Integer total = null;
for(Map.Entry<Integer, List<TransmitActivityTotal>> item : transmitActivityTotalMap.entrySet()) {
for(TransmitActivityTotal transmitActivityTotal : item.getValue()) {
total = transmitActivityTotal.getTotal() == null ? Integer.valueOf(0) : transmitActivityTotal.getTotal();
if (idTotalMap.keySet().contains(transmitActivityTotal.getId())) {
// 再次添加 原有数据 + 新数据
idTotalMap.put(transmitActivityTotal.getId(), idTotalMap.get(transmitActivityTotal.getId()) + total);
} else {
// 首次添加
idTotalMap.put(transmitActivityTotal.getId(), total);
}
}
}

for(Map.Entry<Long, Integer> item : idTotalMap.entrySet()) {
// 使用redis进行 恢复缓存 操作
log.info("id-->{}, 数量--->", item.getKey(), item.getValue());
}
stopWatch.stop();
log.info("缓存恢复耗时--->{}毫秒", stopWatch.getLastTaskTimeMillis());
return true;
} catch (Exception ex) {
stopWatch.stop();
log.error("缓存更新异常--->{}", ex);
return false;
}
}

方式二:通过数据字典表来控制缓存的更新。

自己目前所参与开发的项目,在项目启动的时候,会将所有的数据字典信息添加到缓存当中,并且会隔几分钟去更新一次数据字典数据。

就是利用这一点来增量更新缓存信息,比如每次只更新某个用户相关的操作数据,而不是一次性更新所有用户的数据。减轻了服务器的压力,

这种处理方式也更加的符合实际需求。举一个简单的示例,首先考虑兼容性问题,在设计的时候可以在数据字典中添加一个值,当这个值

为OLD的时候,就使用旧有的逻辑,直接从缓存中获取数据;如果是新系统,则可以在页面中将这个数据字典表的值设置为NEW,这时就

使用新的逻辑,先从数据库中去查询数据,然后将查询结果保存在缓存中。这样设计就能够兼容之前的系统,也可以进行系统的迁移。这里

还存在一个问题,就是使用新系统时,不可能每次都去查询数据库,然后将数据存入缓存中。这时就可以添加第二个数据字典值,称它为数

据版本吧,比如设置为100,也是先从缓存中获取这个数据字典值a,然后从缓存中获取获取数据版本值b,判断值a和值b是否一致。一致

则直接返回缓存数据。不一致则查询数据库,然后更新缓存,并且将缓存中的数据版本的值更新为数据字典的值。这样在后台管理系统中,

更新数据版本的值,就可以动态的更新缓存数据的值,并且每次更新的缓存数据量很少。

这种设计稍微有些复杂,还是需要好好理解,自己最开始的时候也是没有理解这种缓存恢复的方式。去询问负责人之后,才搞清楚是如何

进行设计的。明白之后才开始写代码,最后进行测试,测试结论通过。

标签:transmitActivityTotal,缓存,redis,更新,缓存数据,2022,数据,字典
From: https://www.cnblogs.com/yilangcode/p/16652501.html

相关文章

  • 2022-2023-1 20221301 《计算机基础与程序设计》第1周学习总结
    2022-2023-120221301《计算机基础与程序设计》第1周学习总结安装Linux操作系统,学习Linux基础这个作业属于哪个课程<班级的链接>(2022-2023-1-计算机基础与程序设计)......
  • NOI 2022梦游记
    Day1:开场看了一下T1,会了nlog线段树合并摩尔投票做法。然后开T2,看了30min不会,润回T1。9:00的时候过了T1,再来看T2。看到10:00还是不会,开始打表。看表看到11:00还是不会。猛......
  • 2022-2023-1 20221420 《计算机基础与程序设计》第1周学习总结
    第一章1.1出现量子计算机之前还会不会有新一代计算机。1.2下一代软件是否有可能实现编程的简易化,实现人人可编程。第二章2.1会不会出现三进制或者其他进制的计算机。2.2......
  • 适合初学者的 7 个有趣的 CSS 项目创意和主题 [2022]
    适合初学者的7个有趣的CSS项目创意和主题[2022]任何想成为网页设计师的人都必须了解CSS的重要性。您的网站可以使用CSS进行创造性的设计和布局,使其具有独特的外......
  • NOI2022游记
    就简单记录一下两天比赛的过程。Day1比赛前想的是要尽快切完前两题,第三题多打一点部分分,争取拿到250+。打开题面,发现有一个交互题,简单扫了一眼,就大概知道这题非常毒瘤,应......
  • 2022.36 AIOT 概念
    AIoT融合AI技术和IoT技术,通过物联网产生、收集来自不同维度的、海量的数据存储于云端、边缘端,再通过大数据分析,以及更高形式的人工智能,实现万物数据化、万物智联化。物联网......
  • 前端面试题 JavaScript 基础 —— 2022-09-03
    每日3题13以下代码执行后,控制台中的输出内容为?Object.prototype.a=1;Function.prototype.b=2;functionF(){}varf=newF();console.log(F.a);console.lo......
  • Redisson 分布式锁-简单使用
    Redission分布式锁一、引jar包<!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-st......
  • kali linux 2022 下安装vmware遇到vmmon、mvnet缺少问题
    #从github上下载$gitclonehttps://github.com/mkubecek/vmware-host-modulescd./vmware-host-modules#进入你clone的文件夹下:这个版本号根据你下载的版本定$git......
  • 2022年9月3日
      不要高估你和任何人的关系,不要低估人性!不念过往,不畏将来,活在当下!开心过好每一天!  纵有疾风起,人生不言弃!  如果事与愿违,上天必另有安排! 苦难是未来惊喜的......