- 博客(323)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注

原创 基于redis+lua实现抢红包业务(java实现附代码)
抢红包的关键我认为在抢红包业务里面,主要有以下几个关键问题:1、多个人同时抢一个红包存在的数据竞争问题(并发问题)2、判断一个人是否已抢过该红包 (可见性问题)3、拼手气红包的分配算法4、红包抢到后钱怎么到账?数据竞争问题当多个人同时抢同一个红包时,会存在数据竞争,这个好理解。那么什么发生了竞争?首先红包个数会有竞争,当两个人同时抢最后一个红包时,只有一个人能抢到红包,类似于秒杀系统中的库存,如果没有解决好竞争问题,就会出现诸如超卖或少卖的问题。解决竞争问题的主要思路:1、单线程执行(如加互
2021-09-11 23:17:01
1192

原创 Innodb - buffer pool(5.7.21版本)
参考:MySQL 是怎样运行的MySQL 实战 45 讲前言缓存,在计算机科学中可以说是无处不在。缓存的存在,大大缓解了CPU、内存、磁盘,性能差距过大的问题。常见的缓存,如:CPU高速缓存 :提高了RAM(内存)的访问效率。操作系统IO缓存:提高了操作系统写入磁盘的效率。各类缓存系统:Redis、Memcached等,提高了数据库,磁盘的访问效率。今天我们要聊的是Innodb的buffer pool,相比于上述提到的缓存,其他的原理,目标都是一致的,那就是缓和不同硬件之间性能差距大的矛盾
2021-04-26 09:42:23
355

原创 Mysql基于成本的优化(一条查询语句是如何选择执行计划的)[文末有问题]
如果你对mysql如何生成执行计划,如何选择走哪个索引这类问题比较感兴趣的话,请你继续看下去:本文将会讲解:mysql查询会有哪些成本?mysql执行计划生成的步骤?mysql查询会有哪些成本?我们知道,mysql的数据和索引是存储在磁盘上的,我们查询数据是,需要将数据页从磁盘上读出,这里就是IO成本。数据或索引读出后,需要检测记录是否满足对应的搜索条件(where条件)、对结果集进行排序等,这里就涉及到CPU成本。所以,在考虑mysql查询时,我们主要考虑的是IO成本与CPU成本。一般我
2021-03-12 17:32:38
532
1

原创 线程池ThreadPoolTaskExecutor使用不当的惨痛教训
问题现场:配置:生产环境nginx做负载均衡,后端三台服务器,这样一个传统的集群架构。现象:平时系统正常时,没怎么发现问题。最近随着业务量增大,我们以及依赖的一些第三方服务接连出现各种各样的服务超时,不可用的情况。最终我们也没有幸免,因为我们的业务依赖第三方接口的成分较大,属于一个用户接收,用户渠道的角色。这也就意味着如果第三方服务不可用,我们的相应服务也将不可用了。没错,最终我们的系统挂了!原因:原因是服务里面的一个接口不可用了,调用总是超时。而接口调用是在一个异步线程池中进行的。 <b
2020-11-26 09:28:50
13845
2

原创 TCP协议三次握手,四次挥手(WireShark)
TCP协议说起TCP三次握手,四次挥手,是面试的常客。TCP(Transmission Control Protocol),传输控制协议,是ISO模型中传输层的协议,有着控制IP层数据包传输的可靠性,记录两端传输端口号等作用。WireShark工具WireShark是一个抓包工具,可以对网卡上的网络请求进行抓取分析。可以看到每层协议的数据报文,如图。三次握手言归正传,为了建立可靠的连接,TCP采用三次握手的方法。#mermaid-svg-mq4P1YzJg7pNT2FJ .label{font
2020-10-16 14:22:27
2111
2

原创 Spring Bean加载过程(源码解读)
BeanFactory与ApplicationContext区别BeanFactory是ApplicationContext的一个子集,BeanFactory只提供简单容器的功能,就像只有一个水桶,水桶里面只装了水。(水桶就像beanFactory,水就是bean)。ApplicationContext除了有容器功能以外,还提供了国际化,事件监听等,就像水桶了除了装了水,还有鱼,虾。Spring Bean加载过程言归正传,看bean的加载过程。我们只要选一个BeanFactory(单纯的水桶)作为例子
2020-10-15 12:55:53
536

原创 内存分析工具MAT分析内存溢出问题
MAT下载安装:1.在eclipse中安装插件 2.下载独立MAT:下载地址:http://www.eclipse.org/mat/downloads.phpMAT分析的是hprof文件,hprof文件记录了JVM内存溢出时的堆信息,通过分析该文件我们可以分析溢出原因。JVM参数配置:-Xms10M -Xmx10M -XX:+HeapDumpOnOutOfMemoryEr...
2019-07-30 17:22:32
2814
原创 因Groovy脚本引起的JVM内存泄漏
我们有一个内容平台,负责内容的全生命周期的管理,内容包含帖子、短视频这些。有一部分数据来自于外部数据源同步,在使用sls日志监听的数据同步中,其中有一个逻辑是。对于不同站点这里的规则不同,为了配置方便,引入了Groovy脚本。上线一段时间后,随着同步数据量的增大,每过几天会出现服务器JVM内存打满,且时间一般集中在凌晨数据同步期间。Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。
2025-01-23 15:46:09
1246
原创 聊聊专注力
简单来说,就是集中注意力做一件事情。道理十分简单,当注意力集中时,我们会全力以赴,做到最好。与之相反的,就是“分心”。最近刚好是年中绩效评价,在和老板的沟通中,提到的一种重要的词眼:“价值判断”,回想起来这半年,其实我做了很多很多事,每天上班处理几十个事情,不同的事情在处理中又会被另一件事打断,难以专注。可是在老板看来,他并不想你做那么多事,他想要的,是你能在当前层级把最有价值的几件事情做到优秀,做到极致。在这个问题上,分为两部分,一个是判断有价值的事,第二个就是通过专注力,把事情做到优秀。
2024-08-11 16:27:56
594
1
原创 读《Python量化炒股入门与实战技巧》有感 - 聊聊对量化投资的一些浅见
本书1-10章 写了Python的数据结构与语言本身相关内容,对入门者的确比较实用。以及量化这块常用的Python包:Numpy、Pandas、Marplotlib。第11-19章:是与量化相关的一些内容,包含基础数据的获取方式、选股的策略、择时的策略、常用的技术指标、如何利用量化平台进行策略回测、策略因子分析,以及最后常见策略的实践讲解。具体的开发语言不在这里赘述,是通用的计算机能力,可以在课后学习。书中推荐的是聚宽的量化平台:https://www.joinquant.com/
2024-07-21 16:02:20
796
1
原创 记一次Mysql大批量数据更新
背景因公司业务架构变更,需要对原有账户累计收益进行备份,削弱老业务对新业务的影响。而原有用户累计收益数据约为7000w,因为处于业务过渡阶段,所以希望以一种临时的手段去存储数据,最终讨论得出,在用户表新增一个字段old_balance来存储这个数据。大表加字段一开始以为加字段会锁表,使得线上服务不可用。但后来发现是不需要的。Mysql支持在增加列的过程中并发DML。Mysql5.6官方文档 https://dev.mysql.com/doc/refman/5.6/en/innodb-online
2021-11-04 19:31:08
3740
原创 动态规划 (118杨辉三角)
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例 1:输入: numRows = 5输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入: numRows = 1输出: [[1]]提示:1 <= numRows <= 30Related Topics 数组 动态规划/** * 思路: * 动态规划,定义一个arr[numRows][.
2021-10-17 11:56:56
864
原创 多线程(H2O 生成、打印零与奇偶数)
1117. H2O 生成现在有两种线程,氧 oxygen 和氢 hydrogen,你的目标是组织这两种线程来产生水分子。存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。这些线程应该三三成组突破屏障并能立即组合产生一个水分子。你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。换句话说:如果一个氧线程到达屏障时没有氢线程到达,
2021-10-16 22:55:45
578
原创 二叉树、N叉树
429. N 叉树的层序遍历给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[[1],[3,2,4],[5,6]]示例 2:输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,
2021-10-16 18:02:52
387
原创 网卡Inter (R) Wi-Fi 6 AX201突然故障 错误代码10,无法找到无线网络,蓝牙也无效了
问题描述说来也是坑,简直就莫名其妙。早上在工位上,电脑一切正常(一直用的是无线网络),然后周五准备开周会了,所以拔掉电脑外接设备(电源线,鼠标,外接显示器)拿起电脑到会议室。到了会议室之后,无线网断开了(但一般是不会断开的,都在公司范围内),所以选择重连,但发现已经没有无线网络列表了。电脑机型:联想YOGA 14s 2021初步尝试1、关闭开始飞行模式 - 无果2、重启并重启 (因为前两天已经提醒过有windows更新,趁这个机会就更新并重启了)- 无果3、下载鲁大师、驱动精灵、联想驱动管
2021-10-16 12:10:11
54395
36
原创 递归(回溯算法)
递归算法的常用解题思路:1、写出递推公式2、确定递归出口3、根据递推公式写出代码589. N 叉树的前序遍历给定一个 N 叉树,返回其节点值的 前序遍历 。N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。进阶:递归法很简单,你可以使用迭代法完成此题吗?示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[1,3,5,6,2,4]示例 2:输入:root = [1,null,2,3,4,5,null,null
2021-10-09 23:45:22
393
原创 滑动窗口 - 无重复字符最长子串 字符串的排列子串
3. 无重复字符的最长子串给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度
2021-09-21 14:31:10
244
原创 双指针 - 归并排序、移动元素、链表中点、链表中删除指定位置元素
977. 有序数组的平方给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。/示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]示例 2:输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]提示:1 <= nums.length <= 104-
2021-09-17 19:42:43
338
原创 二分查找Java
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。示例 1:输入:n = 5, bad
2021-09-16 18:07:11
171
原创 RocketMq事务消息(分布式事务解决方案)
从问题出发阅读本文后,我们将了解以上两个问题的答案。1、RocketMq生产者组(producer group)的设定有什么用?2、一个订单处理的场景,消费者订阅了订单topic,但总担心丢消息。于是为了防止丢消息,每天都会通过定时任务做一致性校验,这是最佳方案吗?这还得从基于消息队列实现实现分布式事务的解决方案说起。常见的分布式事务包括 2PC、3PC、TCC、本地消息表、消息事务、最大努力通知。今天我们主要讲讲本地消息表、消息事务两种方案。本地消息表本地消息表的大致流程是这样的。pub
2021-09-07 00:16:54
8968
原创 org.apache.rocketmq.store.dledger.DLedgerCommitlogTest.testTruncateCQ
背景:Windows10 构建 rocketMq最新版本(4.9.2),在执行DLedgerCommitlogTest测试用例时报错:-------------------------------------------------------------------------------Test set: org.apache.rocketmq.store.dledger.DLedgerCommitlogTest------------------------------------------
2021-08-29 23:08:51
220
转载 springboot+mybatis-plus 数据表字段是关键字的问题解决
项目里有个数据表 yy_key_value, 字段有 key、value,保存一些基本参数数据。原来使用框架是 springmvc+mybatis,sql 语句写到 xml 文件里,包括基本的 DML 语句(这样不好。。),涉及到 key 字段时,加了 ``, 如下select key,value from yy_key_value where key=?这样是没问题的(key 是 mysql 里的关键字,直接写会报错)但最近项目升级,使用了 springboot+mybatis-plus 框架,可
2021-08-18 16:27:37
1740
原创 Mysql 定义字段括号中长度 int (3) 和 int (10) 有区别吗?
误区:括号中的数据表示类型的长度, 实际上括号中的长度与字段所占字节大小并没有关系。论证:论点1:括号中数字不是表示字段类型长度创建 student,student2 表分别定义一个 student,student2 表create table student(id int(3) not null primary key,name varchar(20));create table student2(id int(10) not null primary key,name varchar(20
2021-07-27 16:36:28
767
原创 Redis的keys命令到底有多慢?
keys命令的用法:keys pattern查找符合正则匹配的key的列表。扫描对象是Redis服务中所有的key,想想都很慢对不对?同时执行keys命令的同时,Redis进程将被阻塞,无法执行其他命令,假如超过了哨兵的down-after-milliseconds配置,还会进行主从切换,切换过程中,如果主节点恢复正常,还可能出现脑裂等一系列问题。所以,生产环境中,建议直接禁用keys命令。Keys命令的替代方案1、scan扫描,避免阻塞2、将需要统计的数据放入一个set中 (但是这样可能出
2021-07-24 23:55:25
1560
1
原创 一次因分页查询引发的数据漏处理问题
背景活动期间,需要对满足活动条件的用户发放购物券。券是凌晨发的,早上过来发现有一个符合条件的用户没发。在日志中也找不到对应的发券日志,感觉这条数据就像蒸发了一样。既然没有数据处理日志,大概率就是数据压根就没查出来嘛。把视线转移到查找需要发放奖励的数据上来select * from activity_statistics where status = ?1 order by id limit ?2,?3这是一条活动数据的查询sql,其中包含了数据的状态status。在发券结束之后,会将数据的st
2021-06-03 20:16:48
1273
原创 Redis - 通过SortedSet实现排行榜功能(解决同score下按照时间顺序排名)
背景618活动需要设计一个用户排行榜的功能,考虑到redis有SortedSet数据结构(由跳表 + 字典实现),比较适合实现排行榜。遇坑需求的场景是,如果两个用户的订单数量相同,那么先到达该订单数量的用户排在前面。一开始我先考虑的问题是:在SortedSet中,如果score相同,是怎么排序的呢?后来知道,如果score相同是按照member的字典顺序,即a排在b的前面,1排在2的前面。那我是不是可以把时间戳加到SortedSet的member中,如 时间戳_用户id。为了让时间戳小的排在前
2021-06-02 13:15:41
3364
原创 Redis序列化反序列化不一致 - String类型值多了双引号问题
问题背景:A服务写入Redis的数据,B服务读出后,value值多了个双引号。如 “String” 获取到的是 ““String””。问题原因:A服务添加了一个redisTemplate Bean配置:@Configurationpublic class RedisTemplateConfig { @Bean(name = "redisTemplate") public RedisTemplate setRedisTemplate(RedisConnectionFactory re
2021-06-01 20:38:00
6544
6
转载 Impossible WHERE noticed after reading const tables
阿里云反馈的慢 SQL,执行计划返回如下:Impossible WHERE noticed after reading const tablessql 很简单:SELECT * FROM deposit_transaction WHERE request_Id = 'XXX'而且该表的 request_id 创建了唯一索引:很明显,这个字段是保持幂等操作的,通过数据库的唯一索引实现;每次数据落地前,都要执行该 SQL 查询是否记录存在,而数据库做幂等兜底;如果 request_id
2021-05-11 09:41:06
222
转载 MySQL ADD COLUMN 给表增加列 指定位置 AFTER FIRST
前言ALTER TABLE test ADD COLUMN id INT UNSIGNED NOT NULL auto_increment PRIMARY KEY FIRST给表添加列是一个常用的操作,MySQL 增加列的时候可以指定此列的位置语法给指定位置加列需要两个关键字:FIRST 和 AFTERFIRST 表示增加此列为第一个列AFTER 表示增加在某个列之后注意 MySQL 增加列指定位置时没有 BEFORE 的用法,第一列可以使用 FIRST, 非第一列使用 AFTER。语法
2021-04-06 09:34:05
14678
1
原创 Zookeeper实现选举 - 源码解读
Zookeeper实现选举选举的使用场景设计模式源码解读选举的使用场景在分布式环境下,为了保证系统的高可用性,我们必须消除单点,其中一个主要的解决方案就是建立集群。集群有多个提供相同服务的机器组成,在这样场景下,又会出现一致性问题,原因是我们无法保证多台机子上的数据是一致的。在这种情况下,我们可以通过一主多从的方案,通过主节点来进行读写操作,从节点只进行读操作的方式,通过主从复制来尽可能保证一致性。那么如何来决定谁来当主节点呢?这就是我们今天要讲的 — 选举设计模式在zookeeper选举的逻辑中
2021-03-28 15:26:04
361
1
原创 zookeeper集群搭建示例
zookeeper集群搭建下载zookeeperzookeeper配置启动节点客户端连接集群集群高可用测试下载zookeeper参考通过Zookeeper实现分布式锁示例zookeeper配置将zookeeper的安装包解压后复制三份,或者你准备三个配置文件即可,今天我们将搭建一个三节点的zookeeper集群:配置如下:节点1:# The number of milliseconds of each ticktickTime=2000# The number of ticks that
2021-03-24 12:48:35
518
原创 zookeeper实现一主多从协同服务的示例
zookeeper实现一主多从协同服务的示例介绍前期准备实现只能有一个master主节点实现对worker节点的监控介绍本文介绍zookeeper如何实现对一主多从的集群进行协同,要求系统中只能有一个master,master能实时监控系统中worker的情况。前期准备需要安装zookeeper,配好配置文件,启动zkServer.sh服务。可以参考:通过Zookeeper实现分布式锁示例实现只能有一个master启动两个zkCli.sh服务,其中一个客户端创建/master节点,此时另外一个就
2021-03-24 10:04:41
501
原创 通过Zookeeper实现分布式锁示例
通过Zookeeper实现分布式锁下载安装Zookeeper:通过Zookeeper实现分布式锁示例:获取锁设置监听释放锁下载安装Zookeeper:下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.6.2/我下载了最新的apache-zookeeper-3.6.2-bin.tar.gz通过tar命令进行解压,然后修改conf/zoo_sample.cfg为conf/zoo.cfg,并修改里面的配置。datadir为存储zook
2021-03-23 20:58:46
287
原创 optimizer trace 查看Mysql如何选择执行计划的过程
前面几篇讲了Mysql基于成本的优化,也看了执行计划,今天我们来看看Mysql提供的更详细的执行计划生成过程。optimizer traceoptimizer trace由来:optimizer trace的使用方式:optimizer trace实践:小结optimizer trace由来:1、我们平时查看SQL的执行计划,但是执行计划是相对粗略的,只告诉你使用了什么索引,采用了什么方式。但是没有告诉你它为什么选择这种查询方式。2、所以,在MySQL 5.6之后,提供了个optimizer tra
2021-03-19 12:21:25
834
原创 计算机科学速成课(观后感)
电子计算机的发展电子计算机在20世纪40、50年代,经历了从机械继电器 -> 真空三极管 -> 晶体三极管的变化。机械继电器通过电磁铁+机械的方式控制开关的开闭。真空三极管通过电子的释放控制开关的开闭。晶体三极管通过半导体控制开关的开闭。温暖的计算机会吸引虫子,有一次检修人员在修理故障继电器时找到的一个虫子,这也就是bug一词的由来。布尔逻辑与逻辑门计算机采用二进制而不是三进制、五进制的原因:避免电流大小不均的干扰 + 二进制有了一套完整的数学体系 - 布尔代数有一下几种常见
2021-03-18 11:16:58
840
原创 问题分析:Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.
今天在测试环境,测试报了这样一个错,是jedis报的,不知道怎么解决,我也是搞了好一会,最后发现问题了,做如下总结:本文将会讲解:问题总结发现问题排查问题问题定位发现问题org.springframework.dao.InvalidDataAccessApiUsageException: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Comman
2021-03-17 09:07:24
902
原创 Mysql 查询优化器有哪些优化手段?
当我们往黑窗口输入一条SQL给Mysql执行,Mysql 查询优化器会按照一定的规则帮我们对SQL进行重写,优化,本文将会讲解:Mysql基于规则的优化条件化简:常量表检测外连接消除子查询不相关标量子查询标量相关子查询IN子查询优化临时表半连接的实现方法半连接的使用条件:小结条件化简:条件化简就是我们平时很常见的消除一些冗余的条件,如:移除不必要的括号常量传递比如:a = 5 AND b > a可以转换为a = 5 AND b > 5等值传递比如:a = b and b = c
2021-03-16 14:51:32
653
原创 Innodb统计信息是如何收集的
如果你对mysql中Innodb的统计信息感兴趣,那么请你继续看下去,本文将会讲解:Innodb统计信息不同的统计信息存储方式如何查看统计信息定期更新统计信息innodb_stats_method 的使用小结不同的统计信息存储方式Innodb统计信息存储方式主要分为两种:1、永久性的统计数据(统计数据存储在磁盘上)2、非永久性的统计数据(统计数据存储在内存中)我们知道,Innodb收集与存储统计信息是以表为单位的,可通过innodb_stats_persistent来修改表的统计信息是存在磁盘上
2021-03-15 16:03:20
299
1
小熊造报文(适用于模拟报文的循环制作)
2020-05-28
阿里云服务器上的tomcat项目配置访问,(只差一步)
2017-11-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人