当前位置: 首页 > news >正文

个人网站备案 备注/大丰seo排名

个人网站备案 备注,大丰seo排名,二维码生成器哪个好用,长春网站建设外包目录 1.为什么要解决数据重复插入 2.解决方案实战 3.可落地小总结 一、为什么要解决数据重复插入? 问题起源:当前端发起多次重复请求给服务器提交数据。 后端服务也很简单,伪代码如下: public class SignLogService {public …

目录

1.为什么要解决数据重复插入
2.解决方案实战
3.可落地小总结

一、为什么要解决数据重复插入?

问题起源:当前端发起多次重复请求给服务器提交数据。

后端服务也很简单,伪代码如下:

public class SignLogService {public void saveSignLog(SignLogDO log) {// 简单插入做记录SignLogDAO.insert(log);}
}

发现数据库会存在重复数据行,提交时间一模一样,但业务需求是不能有多余的 log 出现,这明显是个问题。

问题是:重复请求导致的数据重复插入。这问题造成的后果很明显:

  • 数据冗余,可能不单单多一条
  • 有些业务需求不能有多余数据,造成服务问题

问题如图所示:

解决方式:如何将 同请求 A,不执行插入,而是读取前一个请求插入的数据并返回。

解决后流程应该如下:

二、解决方案实战

1、单库单表解决方案

  • 唯一索引 + 唯一字段
  • 幂等

上面说的那种业务场景:signlog 表会有 userid、signid、signtime 等,那么每次签到,每个人每天只有一条签到记录。

数据库层采取唯一索引的形式,保证数据记录唯一性,即 UNIQUE 约束,UNIQUE 约束唯一标识数据库表中的每条记录。

另外,userid,signid,sign_time 三个组合适唯一字段。

创表的伪代码如下:

 CREATE TABLE sign_log(id int NOT NULL, user_id int NOT NULL, sign_id int, sign_time int, CONSTRAINT unique_sign_log UNIQUE(user_id, sign_id, sign_time)
)

重点是 CONSTRAINT unique_sign_log UNIQUE(user_id,sign_id,sign_time)。

有个小问题,数据量大的时候,每条记录都会有对应的唯一索引,比较耗资源。

那么这样就行了吗?

答案是不行,服务不够健壮。

第一个请求插入成功,第二个请求直接报错,Java 服务会抛出 DuplicateKeyException 。

简单的幂等写法操作即可,伪代码如下:

public class SignLogService {public SingLogDO saveSignLog(SignLogDO log) {// 幂等处理SignLogDO insertLog = null;try {insertLog = signLogDAO.insert(log);} catch (DuplicateKeyException e) { insertLog = selectByUniqueKeys(userId, signId, signTime);}return insertLog;}
}

的确,流量不是很大,也不算很高并发,重复写问题,这样处理即可。

那真正的大流量、高并发场景下,该如何解决?

2、分库分表解决方案

流量大了后,单库单表会演变成分库分表。那么基于单表的唯一索引形式,在碰到分表就无法保证呢,插入的地方可能是两个分表 A1 和 A2。

解决思路:将数据的唯一性条件放到其他存储,并进行锁控制

还是上面的例子,每天,每次签到,每个人只有一条签到记录,那么使用分布式锁 Redis 的解决方案。

大致伪代码如下:

a.加锁

// 加锁
jedis.set(lockKey, requestId, "NX", "PX", expireTime);
  • lockKey 最简单的是 userid + signid + sign_time
  • expireTime 设置为一天

b.解锁

// 解锁
jedis.eval(script, lockKey, requestId);

c.幂等代码加强

public class SignLogService {public SingLogDO saveSignLog ( SignLogDO log ) {// 幂等校验SignLogDO existLog  = selectByUniqueKeys (userId,signId,signTime);if(Objects.nonNull(existLog)){return existLog;}// 加锁jedis.setSignLogDO insertLog = signLogDAO.insert(log);// 解锁jedis.evalreturn insertLog;}
}

这个方案供大家参考下。

三、可落地小总结

解决方案实战中,了解具体术。归纳如下:

  • 幂等:保证多次同一请求后结果一致
  • 并发控制:单表唯一索引、分布式多表分布式锁
  • 降级兜底方案:分布式锁锁失效 – 考虑乐观锁兜底

其他幂等策略,汇总资料

  • 【总结】高并发-幂等实现方案:https://blog.csdn.net/hemin1003/article/details/82882873
  • 幂等策略介绍:https://blog.csdn.net/hemin1003/article/details/72834265

 

http://www.lbrq.cn/news/1269973.html

相关文章:

  • 无锡定制网站制作公司/百度搜索指数在线查询
  • 保密和档案网站建设方案/中国舆情网
  • 网页设计与网站建设步骤/百度一下京东
  • 网站建设功能描述书/站长工具seo优化系统
  • 网站ftp根目录/今天重大新闻国内最新消息
  • 外贸社交网站排名/晋江怎么交换友情链接
  • 桂林网站seo/网络广告营销策划方案
  • wordpress 4.8教程/杭州seo排名
  • 大连模板建站软件/河南最新消息
  • 邢台网络公司做网站/简单的个人网页制作html
  • 做网站 单页数量/百度账号申诉
  • 加快网站集约化建设总结/百度优化seo
  • iis默认网站停止/seo是什么岗位的缩写
  • 对网站建设服务公司的看法/百度引擎提交入口
  • 介绍几个有趣的网站/深圳网络营销外包公司推荐
  • 简述企业网站的基本功能/网络营销方式方法
  • 产品网站有哪些/软件开发流程八个步骤
  • 昆明网站建设要多少钱/新东方考研班收费价格表
  • 做网站容易吧/拼多多跨境电商平台
  • 住房城乡建设部网站/百度百家官网入口
  • 优化网站建设哪家专业/域名买卖交易平台
  • 花生壳域名做网站/媒体推广
  • 改进网站建设/开网店怎么推广运营
  • 二手书交易网站开发现状/苏州网站关键字优化
  • 做网站网站/北京seo报价
  • 做网站素材网/仁茂网络seo
  • 做网站 郑州公司哪家好/百度推广助手电脑版
  • 网站建设专题/学做网站需要学什么
  • 怎样做分销网站/网上营销方式和方法
  • 浙江华企做网站/外链网站是什么
  • 驾驶场景玩手机识别:陌讯行为特征融合算法误检率↓76% 实战解析
  • FFmpeg+javacpp中纯音频播放
  • 在纯servlet项目中,使用@WebFilter定义了多个filter,如何设置filter的优先级
  • 每日面试题18:基本数据类型和引用数据类型的区别
  • Text2SQL 智能问答系统开发-预定义模板(二)
  • 常用设计模式系列(十七)—命令模式