原文: https://juejin.cn/post/6983582201690456071 前言 最近在做需求的时候,涉及到登录token,产品提出一个问题:能不能让token过期时间长一点,我频繁的要去登录...前端:后端,你能不能把token 过期时间设置的长一点。 后端:可以,但是那样做不安全,你可以用更好的方法。 前端:什么方法?...实现思路 方法一 后端返回过期时间,前端判断token过期时间,去调用刷新token接口 缺点:需要后端额外提供一个token过期时间的字段;使用了本地时间判断,若本地时间被篡改,特别是本地时间比服务器时间慢时...方法三 在响应拦截器中拦截,判断token 返回过期后,调用刷新token接口 实现 axios的基本骨架,利用service.interceptors.response 进行拦截 import axios...当刷新请求的接口返回来后,我们再调用resolve,逐个重试。
} cancelledKeys = 0; needsToSelectAgain = false; // 处理IO事件所需的时间和花费在处理...final long ioTime = System.nanoTime() - ioStartTime; // 执行 task 任务,判断执行 task 任务时间是否超过配置的比例...如果 ioRatio 100, 则优先处理所有的IO任务,处理完所有的IO事件后,才会处理所有的Task 任务,但处理所有的Task 任务的时候会判断执行 Task 任务的时间比率,如果超过配置的比率则中断处理...)) { break; } //如果线程被中断则重置selectedKeys,同时break出本次循环,所以不会陷入一个繁忙的循环...4、既没有到期的定时任务、也没有可执行的Task,则调用 selector.select(timeoutMillis) 方法阻塞,等待注册到 Selector 上感兴趣的事件。
如果计数器非0,那么await会一直阻塞,知道计数器为0,或者等待中的线程中断,或者等待超时。...这在测试n个线程并发执行某个任务所需要的时间是很有用。如果不适用闭锁,先启动的线程必将领先后启动的线程。...Semaphore中管理着一组虚拟的许可(premit),许可的初始数量可通过构造函数来制定。在执行操作时可以首先获得许可(只要还有剩余的许可),并在使用后释放许可。如果没有许可将被阻塞。...CyclicBarrier: CyclicBarrier可以使一定数量的参与方反复在栅栏处聚集,它在并发的迭代算法中非常有用:这种算法通常将一个问题拆分为一系列相对独立的子问题。...如果对await的调用超时,或者await阻塞的线程被中断,那么认为栅栏被打破了,所有阻塞的await都将终止并抛出BrokenBarrierException。
值得一提的是,Vector在JDK1.1的时候就有了,而List在JDK1.2的时候出现,待会我们会聊到ArrayList和Vector的区别。 二、ArrayList vs....此类在Iterator或ListIterator迭代中,调用容器自身的remove和add方法进行修改,会抛出ConcurrentModificationException并发修改异常。...基于链表实现的方式使得LinkedList在插入和删除时更优于ArrayList,而随机访问则比ArrayList逊色些。LinkedList实现所有可选的列表操作,并允许所有的元素包括null。...从复杂度和测试结果,我们应该懂得平时在添加或者删除操作频繁的地方,选择LinkedList时考虑: 1、没有大量的元素的随机访问 2、添加/删除操作 自然我下面用LinedList实现一个数据结构–栈。...2、记住并发修改异常 java.util.ConcurrentModificationException ,优先考虑ArrayList,除非你在使用多线程所需。
by this lock } finally { l.unlock(); } 显式锁需要在手动调用lock方法来获得锁,并在使用后在finally代码块中调用unlock方法释放锁,以保证无论操作是否成功都能释放掉锁...避免死锁的方式之一为打破“请求与保持条件”(死锁的四个条件),比如在要获得多个锁才能工作的情况下,如果不能获得全部的锁,就会释放掉已经持有的锁,一段时间之后再去重新尝试获得所有的锁。...如果不能同时获得两个锁,就释放掉已经获得的锁,并随机随眠一段时间,再去尝试获得全部的锁,循环这个过程直到超时。...同理,和内置锁相比,显式锁都优势在于更好的性性。锁的实现方式越好,就越可以避免不必要的系统调用和上下文切换,以提高效率。...公平锁 ReentrantLock的构造函数中提供两种锁的类型: 公平锁:线程将按照它们请求锁的顺序来获得锁; 非公平锁:允许插队,如果一个线程请求非公平锁的那个时刻,锁的状态正好为可用,则该线程将跳过所有等待中的线程获得该锁
Random random伪随机数类在 java.util 包下,是最常用的随机数生成器,其使用线性同余公式来生成随机数,所以才说是伪随机。...具体分析 先看无参构造,直接上源码 // 无参构造也是调用有参构造的,那么放出有参构造,再看里面具体内容 public Random() { this(seedUniquifier() ^ System.nanoTime...) // 可以看出长整型种子是Atomic原子型的,即线程安全 // initialScramble() 是seed与两个具体数值运算,这里不给出了 this.seed...() 表示与系统纳秒异或运算,也就是说随机数依赖于时间 this(seedUniquifier() ^ System.nanoTime()); private static final AtomicLong...(next(26)) << 27) + next(27)) * DOUBLE_UNIT; } 从源码可以看出: 这个类方便我们使用伪随机数,每次调用就新建一个Random类 也知道区间为 [0.0,1.0
散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。...与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。 特点 1.快。 MurMurHash3 比 MD5 快。 2.低碰撞。...32位的,在某些场景下,比如哈希的对象长度小于 128 位,或者存储空间要求占用小,或者需要把字符串转换成一个整数,这一特性就能帮上忙。当然,32 位哈希值发生碰撞的可能性就比 128 位的要高得多。...有趣的是,MurMurHash3 生成 32 位哈希的用时比生成 128 位哈希的用时要长。原因在于MurMurHash3_128 针对现代 x64 平台cpu进行了优化。...良好的碰撞阻力(通过Bob Jenkin的frog.c酷刑测试。对于4字节键没有碰撞,没有小的(1到7位)差异)。 在Intel/AMD硬件上表现出色,散列质量和CPU消耗之间的良好折衷。
平时很少登录公众号后台,如果有需要联系的,可以通过我的博客发送邮件给我。 本系列分为两篇。本篇主要讲解针对千万级别订单对账系统的分析以及架构,以及实际项目中遇到的坑,和解决方案。...下载就不说了,通道方提供FTP下载的服务器带宽就那么大。 主要是加载文件,我们是可以处理的,一期系统使用的是单线程加载,并且是加载对象,加载以及序列化需要的时间也不能忽略,在这里消耗时间比较多。...ii.特殊符号的情况比较少,需要处理的符号可以确认的就是空格和制表符一定要进行处理 iii.redis传输数据时间过长,也会造成连接被关闭,记得将超时时间设置长一点 JVM的优化 在一期系统运行前期...最简单的处理方式就是,可以对于订单号进行取模(但是更加建议使用charAt/substring取订单号中的某一位或者某几位随机的数进行拼接Key,因为订单号可能不是数字,我们公司的就不是…),分批存入Redis...调用charAt基本不会消耗时间。千万级别数据调用charAt方法,多100ms左右的时间。
专栏持续更新中:MySQL详解 一、定义 运行时间比较长,操作的数据比较多的事务我们称之为大事务。...例如,执行超过5s,10s,1min… 二、大事务风险 锁定太多的数据,造成大量的阻塞和锁超时,回滚所需要的时间比较长。 执行时间长,容易造成主从延迟。...a`, `b`) values(1,1); 接着反复执行如下SQL,插入大量数据记录 insert into apple_test(a, b) select a,b from apple_test; 在反复执行的过程中...大表的历史数据归档(前端增加历史查询)难点:时间点选择,如何进行归档操作 六、在大促中数据库服务器 数据库架构:主从复制、读写分离、集群等。...并发量:同一时间处理的请求的数量。 连接数:和服务器进行连接,但大部分处于sleep状态,只有少部分在运行。 并发量大,连接数大说明cpu空闲少繁忙。
二、硬件依赖性 深度学习算法在很大程度上依赖于高端机器,而传统的机器学习算法可以在低端机器上工作。这是因为深度学习算法对GPU有较高的要求,GPU是其工作的一个组成部分。...这样的方式相较于机器学习,在训练时间和成本上有较高的提升。 ? 四、解决问题方法 在使用传统的机器学习算法解决问题时,通常的做法是将问题分解成不同的部分,然后单独解决,最后结合起来得到结果。...五、执行时间 通常,深度学习算法需要很长的时间来训练,这是因为在深度学习算法中有太多的参数,所以训练这些参数的时间比平时要长。...即使比较先进的深度学习算法Resnet,从零开始完全训练也需要大约两周的时间。相比之下,机器学习所需的训练时间要少得多,从几秒钟到几个小时不等。 相较于训练时间,测试时间就要短很多。...在测试时,深度学习算法的运行时间要短得多。但是,如果将其与k近邻机器学习算法进行比较,测试时间会随着数据大小的增加而增加。但这并不适用于所有机器学习算法,因为其中一些算法的测试时间也很短。
线程不安全 有顺序,会按照添加进去的顺序排好 基于数组实现,随机访问速度快,插入和删除较慢一点 可以插入null元素,且可以重复 Vector和前面说的ArrayList很是类似,这里说的也是1.8版本...具有以下特点: 提供随机访问的功能:实现RandomAcess接口,这个接口主要是为List提供快速访问的功能,也就是通过元素的索引,可以快速访问到。...两种扩容都是申请新的数组空间,然后调用数组复制的native函数,将数组复制过去。 Vector可以设置每次扩容的增加容量,但是ArrayList不可以。...,实现ListIterator,在Itr的基础上有了更加丰富的功能。...增删改查的效率 理论上,ArrayList和Vector检索元素,由于是数组,时间复杂度是O(1),在集合的尾部插入或者删除是O(1),但是其他的地方增加,删除,都是O(n),因为涉及到了数组元素的移动
cs:每秒上下文切换次数 CPU(百分比表示) us:用户进程占用cpu时间百分比 sy:系统进程占用cpu时间百分比,如果太高,表示系统调用时间长,例如IO操作频繁。...磁盘I/O 我们之前一直在强调MySQL的顺序读写在性能上要比随机读写高出很多,这是因为现在大多数数据库使用的是机械硬盘,在机械硬盘进行随机读写时需要来回移动磁头,这样就需要耗费长时间的磁头旋转和移动来查找...因为 数据库的特点是随机读(oltp交易系统),所以两个读被合并的概率很低,所以如果出现大量的合并读,说明系统在全盘扫描。...svctm:每一个请求的服务时间(单位毫秒),反应了io性能,5、6ms表示io性能还可以,可以降到1ms以下。 %util:繁忙度,周期内用于IO操作的时间比例,即IO队列非空的时间比率。...如果io不高,但繁忙度高,说明磁盘有问题。 网络带宽 网络在整个系统中充当了桥梁和道路的作用,所以的数据都是通过网络进行传输的。
二、硬件依赖性 深度学习算法在很大程度上依赖于高端机器,而传统的机器学习算法可以在低端机器上工作。这是因为深度学习算法对GPU有较高的要求,GPU是其工作的一个组成部分。...这样的方式相较于机器学习,在训练时间和成本上有较高的提升。 四、解决问题方法 在使用传统的机器学习算法解决问题时,通常的做法是将问题分解成不同的部分,然后单独解决,最后结合起来得到结果。...五、执行时间 通常,深度学习算法需要很长的时间来训练,这是因为在深度学习算法中有太多的参数,所以训练这些参数的时间比平时要长。...即使比较先进的深度学习算法Resnet,从零开始完全训练也需要大约两周的时间。相比之下,机器学习所需的训练时间要少得多,从几秒钟到几个小时不等。 相较于训练时间,测试时间就要短很多。...在测试时,深度学习算法的运行时间要短得多。但是,如果将其与k近邻机器学习算法进行比较,测试时间会随着数据大小的增加而增加。但这并不适用于所有机器学习算法,因为其中一些算法的测试时间也很短。
线程不安全 有顺序,会按照添加进去的顺序排好 基于数组实现,随机访问速度快,插入和删除较慢一点 可以插入null元素,且可以重复 Vector和前面说的ArrayList很是类似,这里说的也是1.8版本...具有以下特点: 提供随机访问的功能:实现RandomAcess接口,这个接口主要是为List提供快速访问的功能,也就是通过元素的索引,可以快速访问到。...两种扩容都是申请新的数组空间,然后调用数组复制的native函数,将数组复制过去。 Vector可以设置每次扩容的增加容量,但是ArrayList不可以。...,实现ListIterator,在Itr的基础上有了更加丰富的功能。...【作者简介】: 秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。
,其中有50个人在等待中,那么此时cpu负载就是1.5,虽然100的并发没有变,但是cpu已经无法支撑这么多任务了,会拖长整体的处理速度,如果长时间高负载的话就需要考虑升级配置来增加处理效率了 tasks...: 用于等待IO完成的CPU时间 hi:处理硬件中断的CPU时间 si: 处理软件中断的CPU时间 st:底层虚拟系统占用的cpu时间 cpu使用率是最常见的了,可以直接体现cpu的繁忙度,表示某段时间内每个进程所占用的...状态线程数 5、zombie表示僵尸进程数 6、clones 表示在监控周期(默认10s)内 clone() 系统调用次数 linux 中进程有两种 sleep 状态: interruptible sleep...) sys、usr字段指示CPU被用于处理进程时,进程在内核态、用户态所占CPU的时间比例 irq字段指示CPU被用于处理中断的时间比例 idle字段指示CPU处在完全空闲状态的时间比例 wait字段指示...CPU处在“进程等待磁盘IO导致CPU空闲”状态的时间比例 CPU列各个字段指示值相加结果为N00%,其中N为cpu核数。
背景 最近被问到mybatis统计每条SQL的执行时间,然而虽然我第一时间想到可以通过切面编程来实现,但是平时还真是没有留意这个问题,所以就查阅了一下资料,总结一下,如果各位还有更好的麻烦留言告知...(); Object obj = pjp.proceed(); long end = System.nanoTime(); log.info("调用Mapper...MyBatis在四大对象的创建过程中,都会有插件进行介入。...插件可以利用动态代理机制一层层的包装目标对象,而实现在目标对象执行目标方法之前进行拦截的效果。 MyBatis 允许在已映射语句执行过程中的某一点进行拦截调用。...道路艰难且长,还请各位多多提点。
1bit:一般是符号位,不做处理 41bit:用来记录时间戳,这里可以记录69年,如果设置好起始时间比如今年是2018年,那么可以用到2089年,到时候怎么办?...4095个,也就是在同一个机器同一毫秒最多记录4095个,多余的需要进行等待下毫秒。...() - startTime) / 1000000 + "ms"); } } Snowflake 工程化之后,会有两种实现方式: 嵌入业务代码,也就是分布在业务服务器中,这种方案的好处是业务代码在使用的时候不需要网络调用...另外一个部署方式是将信号发生器作为独立的服务部署,业务使用信号发生的时候需要多一次网络调用,存在对内网调用性能的损耗,发号器部署实例是有限的,一般可以将机器 ID卸载配置文件里,这样可以保证机器 ID的唯一性...生成序列号可以使用随机的。 上面的方法主要是两种思路: 让算法中的ID符合规则自己的业务特点 解决时间回拨的问题。
CPU 使用率 表示 CPU 在用户态运行的时间百分比 包括:用户态的 CPU 使用率(user)和低优先级的用户态 CPU 使用率(nice) 用户 CPU 使用率高,说明有应用程序比较繁忙 系统...CPU 使用率 表示 CPU 在内核态运行的时间百分比(不包括中断) 系统 CPU 使用率高,说明内核比较繁忙 等待 I/O 的 CPU 使用率 通常也称为 iowait,表示等待 I/O 的时间百分比...iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长 软中断和硬中断的 CPU 使用率 分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比 它们的使用率高,通常说明系统发生了大量的中断...发展的速度远快于内存的发展,CPU 的处理速度就比内存的访问速度快得多 这样,CPU 在访问内存的时候,免不了要等待内存的响应 为了协调这两者巨大的性能差距,CPU 缓存(通常是多级缓存)就出现了 ?...pidstat 的输出进一步观察是否是某个进程导致的问题 找出 CPU 使用率偏高的进程之后就要用进程分析工具来分析进程的行为 比如使用 strace 分析系统调用情况,perf 分析调用链中各级函数的执行情况
领取专属 10元无门槛券
手把手带您无忧上云