大体量业务数据表迁移方案全量+增量混合迁移
背景分析对大体量业务数据表和归档数据表字段进行查询后,整理出所有非create_time的表如下所示:
大体量业务数据表中非create_time的表:
hy_business_platform_log (LOG_DATE)
ota_eol_message_log (req_time)
归档数据表中非create_time的表:
driving_behavior_xx(create_date)
archive_driving_behavior_xx(create_date)
由于大部分表都有create_time字段,因此全量和增量迁移都基于create_time进行数据分片,具体执行方案如下。
全量迁移:1、数据导入:将临时存储区的全量数据迁移至新建的归档数据库。
创建迁移配置表
1234567891011CREATE TABLE migration_config ( id BIGINT AUTO_INCREMENT PRIMARY KEY, source_db_name VARCHAR(128) NOT NULL C ...
什么是ReentrantLock ?ReentrantLock 其实就是基于 AQS 实现的一个可重入锁,支持公平和非公平两种方式。
内部实现依靠一个 state 变量和两个等待队列:同步队列和等待队列。
利用 CAS 修改 state 来争抢锁。
争抢不到则入同步队列等待,同步队列是一个双向链表。
条件 condition 不满足时候则入等待队列等待,是个单向链表。
是否是公平锁的区别在于:线程获取锁时是加入到同步队列尾部还是直接利用 CAS 争抢锁。
参考图片:
扩展CAS操作CAS 是一种硬件级别的原子操作,它比较内存中的某个值是否为预期值,如果是,则更新为新值,否则不做修改。
工作原理:
比较(Compare):CAS 会检查内存中的某个值是否与预期值相等。
交换(Swap):如果相等,则将内存中的值更新为新值。
失败重试:如果不相等,说明有其他线程已经修改了该值,CAS 操作失败,一般会利用重试,直到成功。
自旋锁自旋锁(Spinlock) 是一种轻量级锁机制。线程在获取锁失败时不会立即进入阻塞状态,而是会在循环中反复尝试获取锁,直到成功。
这种方式避免了线程的上下文切 ...
LM Studio 介绍:LM Studio是一款能够本地离线运行各类型大语言模型的客户端应用,通过LM Studio 可以快速搜索所需的llms类型的开源大语言模型,并进行运行。
通过使用LM Studio 在本地运行大语言模型可以更加快速的运行流畅的提问,并在独立的环境中保障数据不被监听和收集。
特点:本地、独立、离线
官网:https://lmstudio.ai/
参考文档:docs
步骤:首先进入官网Download下载页面,选择自己电脑的操作系统点击下载安装包
下载完成之后根据步骤安装好后双击进入
点击右上角的Skip onboarding跳过
接着点击UI界面中间的“Select a model to load”,开始搜索模型,第一次搜索会显示No result found,列表可以看到,但无法进行下载模型。这个时候不要慌,因为https://huggingface.co/ 在国内是无法访问的
在软件内部获取模型的是通过https方式来访问的,全局代理也没有过去,因此科学上网也用不了
这时候只能用国内的同步的镜像: hf-mirror.com,用于替换镜像 huggi ...
如何避免用户重复下单(多次下单未支付,占用库存)场景回顾
在稀有商品抢购或秒杀场景中,一个用户多次下单未支付可能是恶意锁库存或损坏其他用户的权益,因此需要避免用户重复下单。
1)首先前端需要进行按钮控制
在用户点击“下单”按钮后,可以通过前端控制按钮状态,比如变为“处理中”或“请稍等”,避免用户在等待过程中多次点击按钮,导致重复下单请求发送到后端。但是前端的操作无法完全避免重复请求,因此需要与后端的幂等控制结合,以确保不会因多次点击创建多个订单。
2)在每次下单请求中生成一个唯一的requestId或token
用户进入订单页面前,前端会先请求后端生成这次请求的唯一的requestId或token,然后在每次下单请求中带上这个唯一的requestId或orderToken。这样后端可以通过检测该标识是否已存在,来决定是否创建新订单。这样,无论用户重复点击几次下单按钮,仅会创建一次订单。
以上两步能阻挡绝大部分用户正常操作下的重复下单行为,如果一些用户通过 api 请求,或者后退页面再次点击下单进入,还是可以重复下单,不过一般这种设计已经可以杜绝稀有商品抢购或秒杀场景的恶意锁库存了, ...
白嫖华为云400元代金卷各位码友们,白嫖ESC服务器的活动来啦,可以免费领取1年的华为云服务器,给你的项目上线或者搭建私人博客~
具体奖励:
两个都选代金卷的话还是很香的
给大家看看之前白嫖代金卷领的服务器:
之前活动领取的包,皮质,质量还是不错的
前置条件首先点击报名链接报名:https://edu.huaweicloud.com/signup/c586933f7a12484aa2afb4696d2629e8?medium=share_kfzlb&invitation=d2139abb8e254557b3dd2af10685bdd9
具体步骤一:完成任意云实验
打开报名链接,找到云实验的实验列表:
完成五个实验其中一个就可以抽奖,这里我选的是最后一个:
点击开始实验之后,根据窗口左侧的实验手册按步骤来就能过,大概用时10分钟,相信聪明的码友们都没问题o.o
实验完成后点击链接抽奖:https://survey.huaweicloud.com/survey/#/qtn?id=7af9f98b8b904c2fb8603742bd112b5d
这里选择自己做的实验
...
需求背景对于有会员系统或付费机制的项目,为了保证单个用户的账号权益不会被滥用,并且提升系统的安全性,我们通常会限制 单个账号在同一时间只能在一台设备上登录。为此,我们需要给系统添加共享账号的检测能力
系统设计该需求建立在使用 Cookie/Session 登录的情况下,使用 token 登录不完全适用
业务流程分析假设在已有的项目中,我们已经集成了 Spring Session 进行登录。让我们先来梳理一下现在的流程:1.前端发送登录请求给后端,传递用户名、密码等参数。2.后端校验登录参数是否合法,如果没问题,则将用户登录态保存到 Redis(可以使用 spring-session-data-redis 库自动实现),并且将 cookie 返回给前端。3.之后的请求会携带 Cookie,后端可以根据 Cookie(Session)从 Redis 获取到已保存的用户登录态,从而判断当前用户是否登录、已登录用户的信息等。
如图所示:
核心实现思路就上述的登录逻辑而言,我们没有采取任何措施去限制同一账号只能在单个设备登录,理论上一个账号就可以被任意个用户同时共享使用。这可能会导致 ...
MySQL 连接池是什么?存储连接的池子,本质上是一种资源复用技术。
作用:节约连接创建的成本,提升流程处理的效率。
注意:连接池是在 MySQL 的客户端一侧。
连接池的价值短连接在高并发场景下反复建立连接成本很高,使用长连接用完后不关闭。
价值:实现连接资源的复用
连接池常见参数参数控制 MySQL 的连接复用策略,一般由客户端引擎(Java 库)实现。
通常客户端支持的主要参数:
最大空闲连接数/连接池个数(长连接个数): 连接池中最多有多少个空闲连接,
理解为:一共可以维护多少个长连接来节约连接建立的成本。
空闲时间(长连接的持续性):表面了连接池中的连接在空闲时在池子里面可以摸鱼多久,便于节约资源。1-10s 左右
最小连接数:连接池中最小的空闲连接,当连接数小于这个值时,连接池会自动创建新的连接来进行补充。
作用:保持连接池处于就绪状态。
使用场景:需要的长连接比较多,且请求是周期性的。eg.晚上跑脚本触发请求。
初始化连接数:意义不大,由最小连接数补齐。
Druid 的连接池参数(Java)
maxActive:连接池中的最大连接个数,也就是我 ...
1.Redis中常见的数据类型有哪些?
String:可以存储任何类型的数据,最大长度为512MB
使用场景:缓存 Session、Token、图片地址、序列化后的对象、页面单位时间的访问数、分布式锁等
Set:存储无序且不重复的字符串集合,使用哈希表实现可以基于 Set 轻易实现交集、并集、差集的操作,支持快速查找和去重操作
使用场景:文章点赞、共同好友(交集)、共同粉丝(交集)等
zSet:存储有序的字符串集合,类似于set但是增加了权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表
使用场景:各种排行榜、优先级任务队列等
Hash:存储键值对,适合用于存储对象
使用场景:用户信息、商品信息、文章信息、购物车信息等
List:集合,使用双向链表实现,可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。
使用场景:最新文章、最新动态、消息队列等
2.Redis为什么这么快主要有以下几个方面原因:
基于内存存储:Redis大部分数据都存储在内存中,相较于传统的基于磁盘的数 ...
前言:我们有个上线到个人服务器的项目,如果想测试QPS,该怎么做?做法->选择一个合适的压力测试工具:
Apache JMeter:功能强大,支持多种协议(推荐)
wrk:轻量级工具,适合 HTTP 性能测试
ab(ApacheBench):简单易用,适合基础 HTTP 测试
k6:现代化工具,支持编程测试脚本
Locust:基于 Python,适合复杂测试场景
这里我们选择wrk进行压力测试,wrk是一个轻量级的工具,比较适合我们这种小型单体项目的测试
准备步骤:
首先准备一台Linux/Mac
在服务器上安装wrk,这里以阿里云部署的centos7.9为例
一.wrk安装在 CentOS 上安装 wrk 可以通过以下步骤完成:
1. 安装依赖运行以下命令,确保系统已安装必要的工具和库:
123sudo yum groupinstall "Development Tools" -ysudo yum install epel-release -ysudo yum install git gcc make openssl-devel -y
...
1.InnoDB聚簇索引和非聚簇索引的区别InnoDB的底层是用B+树实现的,所以聚簇索引和非聚簇索引在默认情况下也是使用B+树实现,但是存在一定的差别,如下表所示:
区别
聚簇索引
非聚簇索引
叶子节点存储内容
完整数据
主键、索引列
在表中是否唯一
是
否
适用场景
范围查询、排序操作
快速查找数据
因为B+树的叶子节点之间是通过双向链表连接的,所以对于存储了数据行的聚簇索引来说在特定范围内进行数据查询和对数据进行排序操作不用修改数据的结构,IO次数减少查询速度快。而对于非聚簇索引,因为存储的是主键和索引列,想要通过非聚簇索引来查找完整的数据内容会增加回表的次数,造成IO次数的开销,因此查找完整的数据比较慢,但是用于快速查找特定数据,根据主键和索引列匹配数据会比聚簇索引快。
2.存储引擎有哪些?它们之间有什么区别?常见的存储引擎有MyISAM、InnoDB、Memory
在MySQL 5.5版本之前,默认的存储引擎是MyISAM
在MySQL 5.5版本之后,默认的存储引擎变为了InnoDB
而Memory是MySQL 3.23版本中引入的使用内存缓存数据, ...