【开发问题记录】01—大量数据同时插入数据库导致的时间戳重复问题

需求背景
用户登录之后将其云端收藏的内容同步到本地数据库且保持和原收藏顺序一致, 比如在电脑上登录之后显示的收藏顺序A->B->C 切换到手机登录之后的顺序预期也是A->B->C, 之后的查询就可以不依赖云端接口而是直接查本地数据库

代码抽象
针对这个场景我们抽象出来一段 伪代码

 fun test() {// list是云端服务器返回的数据 按照顺序 ABCval list = mutableListOf<String>("A", "B", "C")list.forEach{// 本地数据库插入这条记录和 对应的更新时间, 以便后续查询的时候可以直接读取数据库dao.insertItem(it,System.currentTimeMillis())}}

看起来没有什么问题吧? 插入一条就更新本条的时间戳~

实际上遇到了坑——时间戳重复

2023-07-30 23:11:12.601  9952-9952    A time = 1690729872601
2023-07-30 23:11:12.601  9952-9952    B time = 1690729872601
2023-07-30 23:11:12.601  9952-9952    C time = 1690729872601

数据库插入的操作执行地很快导致 多条记录在同一ms内执行, 当你再去查询数据库的收藏顺序时就无法保证一定是按照ABC返回的

解决办法
1 下标去重法 推荐指数 5颗星 ⭐️⭐️⭐️⭐️⭐️

val list = mutableListOf<String>("A", "B", "C")
val time = System.currentTimeMillis()
list.forEachIndexed { index, s ->Log.i("TAG", "$s time = ${time + index}")}
2023-07-30 23:21:13.927 11181-11181   A time = 1690730473927
2023-07-30 23:21:13.927 11181-11181   B time = 1690730473928
2023-07-30 23:21:13.927 11181-11181   C time = 1690730473929

2 延时去重法 推荐指数 1颗星 ⭐️
空耗cpu性能1ms 极端条件下考虑

fun test() {val list = mutableListOf<String>("A", "B", "C")list.forEachIndexed { index, s ->Thread.sleep(1)Log.i("TAG", "$s time = ${System.currentTimeMillis()}")}}
2023-07-30 23:29:01.444 11997-11997   A time = 1690730941444
2023-07-30 23:29:01.445 11997-11997   B time = 1690730941445
2023-07-30 23:29:01.446 11997-11997   C time = 1690730941446

3 纳秒去重法 推荐指数 2颗星 ⭐️⭐️
因为获取纳秒本身就是一个消耗性能的方式, 因此也不推荐

fun test() {val list = mutableListOf<String>("A", "B", "C")list.forEachIndexed { index, s ->val nTime = System.nanoTime()Log.i("TAG", "$s time = $nTime")}}
2023-07-30 23:26:30.382 11810-11810   A time = 1809472049499997
2023-07-30 23:26:30.382 11810-11810   B time = 1809472049659074
2023-07-30 23:26:30.382 11810-11810   C time = 1809472049687304

也可以从数据库的查询上考虑如何解决: 时间戳相同的情况下,如何自定义返回顺序。这个我还没有研究明白,欢迎大家补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/16410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rsync 远程同步

1.简介 rsync&#xff08;Remote Sync&#xff0c;远程同步&#xff09; 是一个开源的快速备份工具&#xff0c;可以在不同主机之间镜像同步整个目录树&#xff0c;支持增量备份&#xff0c;并保持链接和权限&#xff0c;且采用优化的同步算法&#xff0c;传输前执行压缩&#…

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】 1 实现\封装Message模块 zinx/ziface/imessage.go package zifacetype IMessage interface {GetMsdId() uint32GetMsgLen() uint32GetMsgData() []byteSetMsgId(uint32)SetData([]byte)SetData…

淘宝10年架构演进

目录 1. 概述 2. 基本概念 3. 架构演进 3.1 单机架构 3.2 第一次演进&#xff1a;Tomcat与数据库分开部署 3.3 第二次演进&#xff1a;引入本地缓存和分布式缓存 3.4 第三次演进&#xff1a;引入反向代理实现负载均衡 3.5 第四次演进&#xff1a;数据库读写分离 3.6 第…

C语言第十三课--------初阶指针的认识--------重要部分

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

CTF:信息泄露.(CTFHub靶场环境)

CTF&#xff1a;信息泄露.&#xff08;CTFHub靶场环境&#xff09; “ 信息泄露 ” 是指网站无意间向用户泄露敏感信息&#xff0c;泄露了有关于其他用户的数据&#xff0c;例如&#xff1a;另一个用户名的财务信息&#xff0c;敏感的商业 或 商业数据 &#xff0c;还有一些有…

无涯教程-jQuery - Ajax Tutorial函数

AJAX是用于创建交互式Web应用程序的Web开发技术。如果您了解JavaScript,HTML,CSS和XML,则只需花费一个小时即可开始使用AJAX。 为什么要学习Ajax? AJAX代表 A 同步 Ja vaScript和 X ML。 AJAX是一项新技术,可借助XML,HTML,CSS和Java Script创建更好,更快,更具交互性的Web应用…

x264低时延低码率高质量调参

h264解码延迟优化_H264编码参数优化&#xff1a; 参考文章&#xff1a;Video Codecs Analysis and Tuning &#xff0c;文档下载地址&#xff1a;http://www.yuvsoft.com/pdf/x264_parameters_comparison.pdf 文章中详细比较了48种不同x264参数组合&#xff0c;比较得到如下6类…

QT数据库编程

ui界面 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QButtonGroup> #include <QFileDialog> #include <QMessageBox> MainWindow::MainWindow(QWidget* parent): QMainWindow(parent), ui(new Ui::M…

FFmpeg 音视频开发工具

目录 FFmpeg 下载与安装 ffmpeg 使用快速入门 ffplay 使用快速入门 FFmpeg 全套下载与安装 1、FFmpeg 是处理音频、视频、字幕和相关元数据等多媒体内容的库和工具的集合。一个完整的跨平台解决方案&#xff0c;用于录制、转换和流式传输音频和视频。 官网&#xff1a;http…

uni-ajax网络请求库使用

uni-ajax网络请求库使用 uni-ajax是什么 uni-ajax是基于 Promise 的轻量级 uni-app 网络请求库,具有开箱即用、轻量高效、灵活开发 特点。 下面是安装和使用教程 安装该请求库到项目中 npm install uni-ajax编辑工具类request.js // ajax.js// 引入 uni-ajax 模块 import ajax…

微信小程序测试要点

一、什么是小程序&#xff1f; 可以将小程序理解为轻便的APP&#xff0c;不用安装就可以使用的应用。用户通过扫一扫或者搜索的方式&#xff0c;就可以打开应用。 小程序最主要的特点是内嵌于微信之中&#xff0c;而使用小程序的目的是为了能够方便用户不在受下载多个APP的烦…

【序列化工具JdkSerialize和Protostuff】

序列化工具对比 JdkSerialize&#xff1a;java内置的序列化能将实现了Serilazable接口的对象进行序列化和反序列化&#xff0c; ObjectOutputStream的writeObject()方法可序列化对象生成字节数组 Protostuff&#xff1a;google开源的protostuff采用更为紧凑的二进制数组&#…

自动化测试——接口测试

一、接口分类 1.内部接口&#xff1a;测试被测系统各个子模块之前的接口&#xff0c;或者测试被测系统提供给内部用户系统使用的接口。 2、外部接口&#xff1a;被测系统调用外部的接口&#xff1b;系统对外提供的接口 接口测试重点&#xff1a;检查结论参数传递的正确性&…

5.2.16.静态映射操作LED3

5.2.16.静态映射操作LED3 5.2.16.1、添加驱动中的写函数 (1)先定义好应用和驱动之间的控制接口&#xff0c;这个是由自己来定义的。譬如定义为&#xff1a;应用向驱动写"on"则驱动让LED亮&#xff0c;应用向驱动写"off"&#xff0c;驱动就让LED灭 1. 驱动文…

计算机网络(2) --- 网络套接字

计算机网络&#xff08;1&#xff09; --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm1001.2014.3001.5501 目录 1.端口号 2.TCP与UDP协议 1.TCP协议介绍 1.TCP协议 2.UDP协议 3.理解 2.网络字节序 发送逻辑…

微信小程序 背景图片如何占满整个屏幕

1. 在页面的wxss文件中&#xff0c;设置背景图片的样式&#xff1a; page{background-image: url(图片路径);background-size: 100% 100%;background-repeat: no-repeat; } 2. 在页面的json文件中&#xff0c;设置背景图片的样式&#xff1a; {"backgroundTextStyle&qu…

Go 下载安装教程

1. 下载地址&#xff1a;The Go Programming Language (google.cn) 2. 下载安装包 3. 安装 &#xff08;1&#xff09;下一步 &#xff08;2&#xff09;同意 &#xff08;3&#xff09;修改安装路径&#xff0c;如果不修改&#xff0c;直接下一步 更改后&#xff0c;点击下一…

代码随想录算法训练营第三十天 | 单调栈系列复习

单调栈系列复习 每日温度未看解答自己编写的青春版重点题解的代码日后再次复习重新写 下一个更大元素 I未看解答自己编写的青春版重点题解的代码日后再次复习重新写 下一个更大元素II未看解答自己编写的青春版重点题解的代码日后再次复习重新写 接雨水未看解答自己编写的青春版…

Maven 插件安装 Maven Helper插件安装 成功解决IDEA2022 Plugins 连不上、打不开

IDEA Maven Helper插件&#xff08;详细使用教程&#xff09;_程序之大道至简的博客-CSDN博客 成功解决IDEA2022 Plugins 连不上、打不开_idea插件市场连不上_loulanyue_的博客-CSDN博客

计算机毕设 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长…