- 博客(321)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 基于redis+lua实现抢红包业务(java实现附代码)
抢红包的关键我认为在抢红包业务里面,主要有以下几个关键问题:1、多个人同时抢一个红包存在的数据竞争问题(并发问题)2、判断一个人是否已抢过该红包 (可见性问题)3、拼手气红包的分配算法4、红包抢到后钱怎么到账?数据竞争问题当多个人同时抢同一个红包时,会存在数据竞争,这个好理解。那么什么发生了竞争?首先红包个数会有竞争,当两个人同时抢最后一个红包时,只有一个人能抢到红包,类似于秒杀系统中的库存,如果没有解决好竞争问题,就会出现诸如超卖或少卖的问题。解决竞争问题的主要思路:1、单线程执行(如加互
2021-09-11 23:17:01 1084
原创 RocketMq事务消息(分布式事务解决方案)
从问题出发阅读本文后,我们将了解以上两个问题的答案。1、RocketMq生产者组(producer group)的设定有什么用?2、一个订单处理的场景,消费者订阅了订单topic,但总担心丢消息。于是为了防止丢消息,每天都会通过定时任务做一致性校验,这是最佳方案吗?这还得从基于消息队列实现实现分布式事务的解决方案说起。常见的分布式事务包括 2PC、3PC、TCC、本地消息表、消息事务、最大努力通知。今天我们主要讲讲本地消息表、消息事务两种方案。本地消息表本地消息表的大致流程是这样的。pub
2021-09-07 00:16:54 8816
原创 Redis - 通过SortedSet实现排行榜功能(解决同score下按照时间顺序排名)
背景618活动需要设计一个用户排行榜的功能,考虑到redis有SortedSet数据结构(由跳表 + 字典实现),比较适合实现排行榜。遇坑需求的场景是,如果两个用户的订单数量相同,那么先到达该订单数量的用户排在前面。一开始我先考虑的问题是:在SortedSet中,如果score相同,是怎么排序的呢?后来知道,如果score相同是按照member的字典顺序,即a排在b的前面,1排在2的前面。那我是不是可以把时间戳加到SortedSet的member中,如 时间戳_用户id。为了让时间戳小的排在前
2021-06-02 13:15:41 3052
原创 Innodb - buffer pool(5.7.21版本)
参考:MySQL 是怎样运行的MySQL 实战 45 讲前言缓存,在计算机科学中可以说是无处不在。缓存的存在,大大缓解了CPU、内存、磁盘,性能差距过大的问题。常见的缓存,如:CPU高速缓存 :提高了RAM(内存)的访问效率。操作系统IO缓存:提高了操作系统写入磁盘的效率。各类缓存系统:Redis、Memcached等,提高了数据库,磁盘的访问效率。今天我们要聊的是Innodb的buffer pool,相比于上述提到的缓存,其他的原理,目标都是一致的,那就是缓和不同硬件之间性能差距大的矛盾
2021-04-26 09:42:23 286
原创 Innodb统计信息是如何收集的
如果你对mysql中Innodb的统计信息感兴趣,那么请你继续看下去,本文将会讲解:Innodb统计信息不同的统计信息存储方式如何查看统计信息定期更新统计信息innodb_stats_method 的使用小结不同的统计信息存储方式Innodb统计信息存储方式主要分为两种:1、永久性的统计数据(统计数据存储在磁盘上)2、非永久性的统计数据(统计数据存储在内存中)我们知道,Innodb收集与存储统计信息是以表为单位的,可通过innodb_stats_persistent来修改表的统计信息是存在磁盘上
2021-03-15 16:03:20 242 1
原创 Mysql基于成本的优化(一条查询语句是如何选择执行计划的)[文末有问题]
如果你对mysql如何生成执行计划,如何选择走哪个索引这类问题比较感兴趣的话,请你继续看下去:本文将会讲解:mysql查询会有哪些成本?mysql执行计划生成的步骤?mysql查询会有哪些成本?我们知道,mysql的数据和索引是存储在磁盘上的,我们查询数据是,需要将数据页从磁盘上读出,这里就是IO成本。数据或索引读出后,需要检测记录是否满足对应的搜索条件(where条件)、对结果集进行排序等,这里就涉及到CPU成本。所以,在考虑mysql查询时,我们主要考虑的是IO成本与CPU成本。一般我
2021-03-12 17:32:38 478 1
原创 mysql索引访问方式实践 (const、ref、range、index、all、index merge)
如果你对mysql索引访问方式还一知半解,请继续看下去,相信本文会对你有帮助:本文会讲解:mysql索引的实现方式mysql有哪些索引访问方式mysql索引的实现方式Mysql索引的数据结构采用的是B+树,B+树是一棵多路搜索树。类似这样。在Innodb存储引擎中,又可分为聚簇索引(主键索引)与非聚簇索引,聚簇索引的非叶子结点记录的是索引,叶子结点记录了对应的数据行。非聚簇索引与聚簇索引不一样的是,它的叶子结点记录的是普通索引列与主键的对应关系。而在Myisam存储引擎中,就全是非聚簇
2021-03-11 11:06:02 17690 3
原创 JDK1.8之前,HashMap#get操作死循环问题剖析
JDK1.8之前,HashMap#get操作死循环问题剖析写在前面问题原因1、头插法:2、在并发环境下使用非线程安全的类具体成环的情况分析问题答疑写在前面1、HashMap本身是线程不安全的(不管哪个jdk版本),所以请不要在并发访问的场景下直接使用HashMap。2、如果在并发访问的场景下,建议采用concurrentHashMap。问题原因1、头插法:我们知道,在jdk1.8之前,hashMap的put操作,或扩容操作,针对hash冲突时采用的是拉链法(将冲突的对象以链表的形式串联起来),新
2020-12-23 15:15:43 3262 6
原创 记一次因EJB调用引起的CPU飙升问题
记一次因EJB调用引起的CPU飙升问题问题现象排查步骤问题发现问题分析问题现象近期,一个新上线的项目线上出现了“启动后cpu就飙升到100%”的问题。内存状况基本维持正常且gc日志正常。首先怀疑的情况是某个代码死循环了,如递归,while循环等,导致cpu空转。之前其他项目部署采用的都是weblogic+jdk1.8进行部署的。出现问题的环境:docker + tomcat + jdk1.8 + wlfullclient(为了支持原有的ejb接口调用)针对此种场景,我们首先将问题定位(以下步骤不
2020-12-23 13:26:20 377 2
原创 线程池ThreadPoolTaskExecutor使用不当的惨痛教训
问题现场:配置:生产环境nginx做负载均衡,后端三台服务器,这样一个传统的集群架构。现象:平时系统正常时,没怎么发现问题。最近随着业务量增大,我们以及依赖的一些第三方服务接连出现各种各样的服务超时,不可用的情况。最终我们也没有幸免,因为我们的业务依赖第三方接口的成分较大,属于一个用户接收,用户渠道的角色。这也就意味着如果第三方服务不可用,我们的相应服务也将不可用了。没错,最终我们的系统挂了!原因:原因是服务里面的一个接口不可用了,调用总是超时。而接口调用是在一个异步线程池中进行的。 <b
2020-11-26 09:28:50 13601 2
原创 spring aop源码解读(Advice、Pointcut、Advisor)
spring aop介绍面向切面编程是一种编程思想,解决的场景是将项目中一些零散的,通用的逻辑从原业务逻辑的硬编码调用中脱离出来,并在运行时再动态的编织进去。这就是面向切面技术,如日志,注解等功能就经常采用切面技术。spring aop是spring的一项核心功能,采用的是动态代理的思想,主要有jdk自身的动态代理和cglib动态代理两种。说到代理,我们看下代理模式的类图:进入正题我们知道了spring aop的实现是基于动态代理的,代理可以在原有目标对象的前后增加一些逻辑以实现需求,那具体是怎
2020-11-19 10:32:16 1420 2
原创 CyclicBarrier源码解读
CyclicBarrier本意是循环栅栏,顾名思义,它可以循环使用。它是一个同步辅助器,它允许一个或多个线程阻塞等待直到其他线程执行完一系列的操作之后到达一个共同的屏障再继续执行。有点类似百米跨栏,按时你每跨一个栏必须等待其他选手也到跨栏处。CountDownLatch与它有点类似,但CountDownLatch只能使用一次。可以参考:CountDownLatch源码解读CyclicBarrier的实现不再是基于AbstractQueuedSynchronizer,而是采用ReentrantLock与
2020-11-11 19:31:25 273
原创 CountDownLatch源码解读
CountDownLatch本意是倒数计时,它是一个线程同步的辅助工具。它允许一个或多个线程阻塞等待直到其他线程执行完一系列的操作之后再继续执行。几个主要的api:await()方法:阻塞等待,直到state等于0。(它是基于AbstractQueuedSynchronizer实现的)await(long timeout, TimeUnit unit):定时等待,直到state等于0或超时。countDown():将state减1,当state减到0之后,await阻塞的线程可以继续执行。说起
2020-11-11 17:15:19 224
原创 ReentrantLock源码解读(condition原理)
回顾ReentrantLock源码解读(lock、unlock原理)前面我们看了ReentrantLock的加锁解锁原理,明白了ReentrantLock通过AbstractQueuedSynchronizer实现了保护临界区的功能。让一个线程尝试去获取锁的时候,如果当前锁已经被其他线程占用,那么该线程就会阻塞,加入到阻塞队列中。直到持有锁的线程调用unlock,释放锁之后才会从阻塞队列中唤醒一个线程进入临界区。阻塞队列不止一个上面我们提到,如果所以被其他线程占用,尝试加锁的线程将会被加入到阻塞队列
2020-11-01 19:54:22 742 2
原创 ReentrantLock源码解读(lock、unlock原理)
ReentrantLock简介ReentrantLock是JDK中JUC包下的工具类,顾名思义,它是可重入的,同一个线程可以多次获取锁。借助它可以实现只有一个线程同时访问临界区。推荐的使用方式: * class X { * private final ReentrantLock lock = new ReentrantLock(); * // ... * public void m() { * lock.lock(); // block until condition h
2020-10-30 19:27:17 335
原创 线程的两阶段终止模式(中断)
Java 中线程的生命周期Java 语言中线程共有六种状态,分别是:1、NEW(初始化状态)2、RUNNABLE(可运行 / 运行状态)3、BLOCKED(阻塞状态)4、WAITING(无时限等待)5、TIMED_WAITING(有时限等待)6、TERMINATED(终止状态)他们之间的关系转换如以下状态转换图:TERMINATED(终止状态)今天主要讲线程如何从Runnable状态如何变为终止状态。第一种:线程的任务执行完了,就进入了terminated状态。(这个好理解,我们
2020-10-30 09:14:12 704
原创 TCP协议三次握手,四次挥手(WireShark)
TCP协议说起TCP三次握手,四次挥手,是面试的常客。TCP(Transmission Control Protocol),传输控制协议,是ISO模型中传输层的协议,有着控制IP层数据包传输的可靠性,记录两端传输端口号等作用。WireShark工具WireShark是一个抓包工具,可以对网卡上的网络请求进行抓取分析。可以看到每层协议的数据报文,如图。三次握手言归正传,为了建立可靠的连接,TCP采用三次握手的方法。#mermaid-svg-mq4P1YzJg7pNT2FJ .label{font
2020-10-16 14:22:27 2034 2
原创 Spring Bean加载过程(源码解读)
BeanFactory与ApplicationContext区别BeanFactory是ApplicationContext的一个子集,BeanFactory只提供简单容器的功能,就像只有一个水桶,水桶里面只装了水。(水桶就像beanFactory,水就是bean)。ApplicationContext除了有容器功能以外,还提供了国际化,事件监听等,就像水桶了除了装了水,还有鱼,虾。Spring Bean加载过程言归正传,看bean的加载过程。我们只要选一个BeanFactory(单纯的水桶)作为例子
2020-10-15 12:55:53 497
原创 java多线程总结 - 原理篇
synchronized关键字java关键字,用于并发线程的同步执行。主要用在:修饰对象:当线程进入该代码块,该线程就会持有对象的锁。当其他线程准备进入该代码块时,就会被阻塞。线程会进入对象的等待队列,知道上一个线程执行结束,释放锁。修饰类静态方法:进入被synchronized修饰的静态方法的线程会持有当前类锁,其他线程无法进入当前类的其他方法。直到上个线程释放类锁。修饰synchronized实现原理(熟悉程度60%)1、如果持有对象的锁:在JVM中,每个对象的头部会有一块记录锁状态的区域,
2020-09-23 10:11:21 207
原创 内存分析工具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 2734
原创 利用Comparator对枚举类型进行排序的实现(ComparatorChain、BeanComparator、FixedOrderComparator)
背景: 工作中遇到按照类的某个属性排列,这个属性是个枚举类型(完全是自定义的,没有明显的比较标志),现要按照要求的优先级排列。 如一个苹果类有大小和甜度属性,大小有“特大”,“大”,“中”,“小”,“很小”的等级,甜度有“很甜”,“甜”,“不甜”的等级,现要求你按从小到大的顺序,同时从不甜到甜的顺序进行排列。解决方案: 刚开始看到会一头雾水,...
2018-11-14 20:57:43 2037
原创 聊聊专注力
简单来说,就是集中注意力做一件事情。道理十分简单,当注意力集中时,我们会全力以赴,做到最好。与之相反的,就是“分心”。最近刚好是年中绩效评价,在和老板的沟通中,提到的一种重要的词眼:“价值判断”,回想起来这半年,其实我做了很多很多事,每天上班处理几十个事情,不同的事情在处理中又会被另一件事打断,难以专注。可是在老板看来,他并不想你做那么多事,他想要的,是你能在当前层级把最有价值的几件事情做到优秀,做到极致。在这个问题上,分为两部分,一个是判断有价值的事,第二个就是通过专注力,把事情做到优秀。
2024-08-11 16:27:56 451
原创 读《Python量化炒股入门与实战技巧》有感 - 聊聊对量化投资的一些浅见
本书1-10章 写了Python的数据结构与语言本身相关内容,对入门者的确比较实用。以及量化这块常用的Python包:Numpy、Pandas、Marplotlib。第11-19章:是与量化相关的一些内容,包含基础数据的获取方式、选股的策略、择时的策略、常用的技术指标、如何利用量化平台进行策略回测、策略因子分析,以及最后常见策略的实践讲解。具体的开发语言不在这里赘述,是通用的计算机能力,可以在课后学习。书中推荐的是聚宽的量化平台:https://www.joinquant.com/
2024-07-21 16:02:20 460
原创 记一次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 3377
原创 动态规划 (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 800
原创 多线程(H2O 生成、打印零与奇偶数)
1117. H2O 生成现在有两种线程,氧 oxygen 和氢 hydrogen,你的目标是组织这两种线程来产生水分子。存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。这些线程应该三三成组突破屏障并能立即组合产生一个水分子。你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。换句话说:如果一个氧线程到达屏障时没有氢线程到达,
2021-10-16 22:55:45 531
原创 二叉树、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 328
原创 网卡Inter (R) Wi-Fi 6 AX201突然故障 错误代码10,无法找到无线网络,蓝牙也无效了
问题描述说来也是坑,简直就莫名其妙。早上在工位上,电脑一切正常(一直用的是无线网络),然后周五准备开周会了,所以拔掉电脑外接设备(电源线,鼠标,外接显示器)拿起电脑到会议室。到了会议室之后,无线网断开了(但一般是不会断开的,都在公司范围内),所以选择重连,但发现已经没有无线网络列表了。电脑机型:联想YOGA 14s 2021初步尝试1、关闭开始飞行模式 - 无果2、重启并重启 (因为前两天已经提醒过有windows更新,趁这个机会就更新并重启了)- 无果3、下载鲁大师、驱动精灵、联想驱动管
2021-10-16 12:10:11 50221 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 347
原创 滑动窗口 - 无重复字符最长子串 字符串的排列子串
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 191
原创 双指针 - 归并排序、移动元素、链表中点、链表中删除指定位置元素
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 296
原创 二分查找Java
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。示例 1:输入:n = 5, bad
2021-09-16 18:07:11 130
原创 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 182
转载 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 1644
原创 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 671
原创 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 1420 1
原创 一次因分页查询引发的数据漏处理问题
背景活动期间,需要对满足活动条件的用户发放购物券。券是凌晨发的,早上过来发现有一个符合条件的用户没发。在日志中也找不到对应的发券日志,感觉这条数据就像蒸发了一样。既然没有数据处理日志,大概率就是数据压根就没查出来嘛。把视线转移到查找需要发放奖励的数据上来select * from activity_statistics where status = ?1 order by id limit ?2,?3这是一条活动数据的查询sql,其中包含了数据的状态status。在发券结束之后,会将数据的st
2021-06-03 20:16:48 1142
原创 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 6383 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 195
小熊造报文(适用于模拟报文的循环制作)
2020-05-28
阿里云服务器上的tomcat项目配置访问,(只差一步)
2017-11-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人