- 博客(88)
- 收藏
- 关注
原创 Controller一般干些啥
拿到请求(request),1. 然后从request中解析出参数,2. 进行一些参数校验,3. 构造出下一层需要的参数,下一层可能是model层(mvc模型),也有可能是application层(ddd模型)想起以前某个老项目的request一路传到最后面,痛不欲生步骤1中解析参数的部分可能会交给容器(PathVariable,RequestParam等等),可能就省了手动从Request拿参数的部分。但是后面要用到的参数都应该在这里封装好步骤2的参数校验也可能交给容器,有一些校验器啥的,但是有一些
2021-05-11 16:22:53 1550
转载 kafka生产者客户端
原文来自掘金小册:https://juejin.cn/book/6844733793220165639/section/6844733793622818830文章目录生产者拦截器、序列化器和分区器整体架构元数据更新生产者拦截器、序列化器和分区器生产者拦截器:生产者拦截器既可以用来在消息发送前做一些准备工作,比如按照某个规则过滤不符合要求的消息、修改消息的内容等,也可以用来在发送回调逻辑前做一些定制化的需求,比如统计类工作。生产者拦截器的使用也很方便,主要是自定义实现 org.apache.kafka.
2021-04-22 16:23:36 248
转载 kafka基本概念
原文来自掘金小册:https://juejin.cn/book/6844733793220165639/section/6844733793572503559主要角色**Producer:**生产者,也就是发送消息的一方。生产者负责创建消息,然后将其投递到 Kafka 中。**Consumer:**消费者,也就是接收消息的一方。消费者连接到 Kafka 上并接收消息,进而进行相应的业务逻辑处理。Kafka 消费端也具备一定的容灾能力。Consumer 使用拉(Pull)模式从服务端拉取消息,并且保
2021-04-22 15:51:50 175
原创 交叉熵的梯度优化证明
https://shimo.im/docs/86xtyVGWXQW9RvjQ/ 《交叉熵的梯度优化证明》,可复制链接后用石墨文档 App 或小程序打开公式复制到csdn会有问题
2021-04-20 22:19:55 275
原创 自定义maven插件
maven插件开发maven插件熟练掌握的话毫无疑问会给开发带来许多便捷,这边初步整理了一下maven插件的开发方法一个简单的maven插件1. 配置project descriptor首先一个maven插件,首先需要一个maven工程,然后配置一下项目描述:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2020-10-26 15:31:28 139
原创 02 NdArray的API
NdArray API在MXNet中,NDArray是一个类,也是存储和变换数据的主要工具。创建NdArray首先从MXNet导入ndarray模块。这里的nd是ndarray的缩写形式。from mxnet import nd使用nd创建一个行向量x = nd.arange(12)通过shape属性获取x的形状x.shape通过size属性获取x的元素个数x.size通过reshape方法重构数组x.reshape((3,4))通过zeros方法创
2020-10-06 12:10:37 235
原创 01 数学基础
线性代数向量一个nnn维向量x\boldsymbol{x}x的表达式可写成x=[x1x2⋮xn],\boldsymbol{x} = \begin{bmatrix} x_{1} \\ x_{2} \\ \vdots \\ x_{n} \end{bmatrix},x=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤,其中x1,…,xnx_1, \ldots, x_nx1,…,xn是向量的元素。将各元素均为实数的nnn维向量x\boldsymbol{x}x,
2020-10-06 12:06:15 280
原创 需求和目标
需求和目标在写技术文档的时候,通常需要清晰明确地传达方案设计理念。而需求和目标是必不可少的,写清楚需求和目标在我开始学习写文档的时候遇到不少困惑。这边记录一下前辈的话,以便在后续学习的过程中不断揣摩:这里的需求是产品的需求文档,需求文档是PM对开发将要实现的某个功能或系统的背景,以及大致要做什么事情怎么做进行撰写描述。需求文档中一般确定了一种可以具体实施的方案。目标是产品需求的源头,有了目标才衍生出做一件事以及怎么做(需求)。目标也是产品需求的终结点,开发者参考产品需求,最终要实现达到产品的目标。每一
2020-10-06 01:53:30 2964
原创 动手学深度学习,搭建过程
动手学深度学习,搭建过程一个所见即所得的学习工具,可以一遍阅读一遍查看代码。并且关于深度学习的介绍比较简单。项目路径在:https://github.com/d2l-ai/d2l-zh.git,码云搜d2l-zh有不少镜像安装miniconda。根据操作系统从官网下载miniconda,下载了以后是个脚本文件,运行即可。就是要记得退出终端重进一下下载源码,更新环境。miniconda会构造一个python运行环境,把你需要的依赖库给安装好,你需要哪些依赖都写在environment.yml里,比如哪
2020-10-06 01:48:50 394 1
原创 java监控命令
文章目录JVM学习04——java监控命令jpsjstat:虚拟机统计信息监视工具jinfo:Java配置信息工具jmap:Java内存映像工具jhat:虚拟机转储快照分析工具jstack:Java堆栈跟踪工具JVM学习04——java监控命令jpsjps可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class)、名称以及这些进程的本地虚拟机唯一id(LVMID,local virtual mechine identifier)。jps命令格式jps [options] [host
2020-08-25 15:04:16 670
转载 org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
根据博客问题解决https://blog.csdn.net/lw5885799/article/details/88646051
2020-08-19 17:37:21 413
原创 算法学习13——笔试老大难,二分法的各种模板
文章目录二分法模板二分基本型左区间的最大值右区间的最小值二分法个人觉得二分法学习分两个阶段,第一个阶段是处理各种基本的二分场景,就是在数组中根据下标来搜索各种想要的数;第二阶段就是不再基于数组构建二分模型,而是各种搜索,我觉得很多题的难度不亚于动态规划。第二阶段只能靠多练习吧。模板二分基本型二分的本质是,根据某一个判断(条件),在一个排序数组中检索某一个数,基本型的意思就是,这个判断有三种结果:大于、小于、等于,我们只需要返回使等于成立的情况。并且只需要和当前数进行比较,不需要和左右比较。pub
2020-08-17 11:20:24 275
原创 redis学习5——常用操作
常用操作缓存使用问题缓存雪崩缓存失效时间接近,同时有大并发量的请求,直接把db打挂了解决办法:1. 每个Key的失效时间都加个随机值就好了,这样可以保证数据不会在同一时间大面积失效;2. 如果Redis是集群部署,将热点数据均匀分布在不同的Redis库中也能避免全部失效的问题;3. 设置热点数据永远不过期,有更新操作就更新缓存就好了缓存穿透缓存穿透是指缓存和数据库中都没有的数据,而用户(攻击者)不断发起请求,**解决办法:**1. 参数校验;2. 布隆滤波;3. 布谷鸟滤波;4. 从缓存取不到
2020-08-07 11:35:48 122
原创 redis学习4——独立功能
文章目录独立功能发布订阅事务WATCHACIDredis中使用luaevalscript load和evalshalua内置函数通过文件执行脚本伪客户端eval的执行独立功能发布订阅订阅指令:subscribe 频道名发布指令publish 频道名 消息支持模式,即*通配符订阅模式psubscribe 频道名.*事务输入MULTI,标志事务的开始命令队列,输入的命令入队列,如果命令是EXEC,DISCARD,WATCH,MULTI其中之一,那么立刻执行命令;其余的入队列输入
2020-08-06 23:18:25 365
原创 lua学习
文章目录lua学习环境安装脚本式编程程序执行标识符保留字全局变量数据类型变量循环while循环数组for循环泛型for循环repeat...until 循环breakgoto流程控制函数定义多返回值可变参数字符串字符串操作redis中使用luaevalscript load和evalshalua内置函数通过文件执行脚本伪客户端eval的执行lua学习环境安装linux下载源码sirius@slave:~$ wget http://www.lua.org/ftp/lua-5.4.0.tar.gz
2020-08-06 23:17:48 713
原创 redis学习3——多机数据库
文章目录多机数据库主从架构(复制)同步命令传播断线重连的问题新版的复制功能(部分同步)心跳检查sentinelsentinel的启动获取主服务器信息获取从服务器信息向主服务器和从服务器发送信息主观下线状态客观下线状态选举领头sentinel故障转移多机数据库主从架构(复制)在redis中,用户可以在服务器上执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器,进行复制的服务器为从服务器。slaveof ip portredis的复制功
2020-08-06 21:41:12 264
原创 redis学习2——单机数据库
文章目录redis学习2——单机数据库数据库设置过期时间过期键删除策略过期策略AOF、RDB和复制功能对过期键的处理RDBAOF复制RDB持久化BGSAVE命令执行时的服务器状态自动间隔保存AOF持久化AOF文件的载入与数据还原AOF重写后台重写redis学习2——单机数据库数据库redis服务器在初始化时,会根据dbnum属性创建多个数据库redis客户端可以根据select命令对数据库进行切换127.0.0.1:6379> get hello"world"127.0.0.1:6379
2020-08-06 21:40:13 390
原创 redis学习1——数据结构和对象
文章目录redis学习简单动态字符串3.2以前的SDS设计redis5.0的设计1. 长度小于32的短字符串2. 长度大于32的字符串基本操作链表跳跃表跳跃表操作创建跳跃表创建节点插入节点删除节点删除跳跃表压缩列表整体表结构列表元素结构previous_entry_lengthencodingcontent散列表、字典操作初始化添加元素扩容rehash迭代器遍历全遍历普通迭代器安全迭代器间断遍历整数集合结构体升级操作查询插入删除对象内存回收对象共享对象的空转时长redis学习简单动态字符串Redis没
2020-08-05 23:08:28 817
原创 map容器
map容器hashmaphashmap的结构和底层原理hashmap就是用来存放key-value数据结构的容器,在1.7以前是数组+链表,1.8是数组+链表+红黑树根据key计算每个元素的在数组存放的下标。然后用链表或者红黑树来解决由于hash函数造成的碰撞问题。插入规则1.8以前是头插法,新的节点会作为头节点保存在数组中,旧的头节点会放置在新节点之后1.8以后是尾插法,在尾部进行插入1.7尾插导致的循环因为1.7的resize会导致链表倒序,原本尾节点变成原本的头节点。那next指针
2020-08-03 22:32:23 182
原创 算法学习13——红黑树
文章目录红黑树红黑树的性质红黑树的插入红黑树红黑树是一棵二叉搜索树,拥有二叉搜索树的性质:左子树的所有值小于根节点,右子树的所有值大于根节点。同时还具有近似平衡性质,近似平衡指的是任何节点的左右子树高度不会超过一半。它相对平衡二叉树的优势在于,任何不平衡都可以在三次之内的旋转解决,而平衡二叉树最坏会达到树的高度级别的旋转次数。红黑树的性质红黑树节点除了左节点,右节点,关键字的值三个基本二叉树元素之外,还维护了红黑色作为标记。同时null被定义成为叶子节点,具有关键字的节点被定义成为内部节点。红黑树
2020-07-27 22:40:42 547
原创 java多线程开发09——线程通信
java多线程开发09——线程通信wait方法wait()方法就是使线程停止运行,会释放对象锁。wait()方法会使当前线程调用该方法后进行阻塞,并且将该线程置入锁对象的等待队列中,直到接到通知notify或被中断interrupt为止。wait()方法只能在同步方法或同步代码块中调用,如果调用wait()时没有适当的锁,会抛出异常。wait()方法执行后,当前线程释放锁,其他线程可以竞争该锁。wait()方法被中断或者notify后,不会立刻获取锁,需要重新竞争notif
2020-07-26 22:12:37 127
原创 java多线程开发08——中断interrupt
java多线程开发-8——中断interrupt有三个方法和中断有关:public void interrupt():线程对象的成员方法,调用此方法,可以向线程内发送中断信号,有一些原生方法可以捕捉中断信号从而抛出被中断异常InterruptException,同时会线程内的中断标志会变成true。public static boolean interrupted():Thread的静态方法,调用此方法,可以查看当前线程是否被中断,即查看中断标志,需要说明的是,标志为true时,调用一次会自动把标志
2020-07-26 21:51:17 162
原创 java多线程开发07——final
java多线程开发07——final对final域,编译器和处理器要遵守两个重排序规则。在构造器函数内对一个final域的写入,随后把这个被构造的对象赋值给引用变量,两个操作不能重排序。即构造函数中对一个final域的写入构造完把对象赋值给引用变量初次读取一个包含final域的对象引用,随后初次读这个final域,两个操作不能重排序。即初次读取一个包含final域的对象引用初次读取这个final域...
2020-07-26 20:12:58 91
转载 java多线程开发06——锁和内存屏障
java多线程开发06——锁和内存屏障资源来自:原文链接锁概述我们知道线程安全问题的产生前提是多个线程并发访问共享变量、共享资源(以下统称为共享数据)。于是,我们很容易想到保障线程安全的方法将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问,该线程访问结束后其他线程才能对其进行访问。锁(Lock)就是利用这种思路以保障线程安全的线程同步机制。按照上述思路,锁可以理解为对共享数据进行保护的许可证。对于同一个许可证所保护的共享数据而言,任何线程访问这些共享数据前必须先持有
2020-07-26 19:22:55 498 1
原创 java多线程开发05——相对顺序问题
文章目录java多线程开发05——相对顺序问题顺序一致性as-if-serialhappens-before规则java多线程开发05——相对顺序问题程序员为了开发方便,希望写的程序可以按他们写的逻辑,一行一行执行。而处理器设计者,考虑到如果逐行执行,一方面效率低:每个变量写入和读取都从主存的话IO开销太大;一方面无法发挥多核处理器的优势:如果是一行一行串行执行指令只能在一个CPU上执行程序。因此,现代CPU每个处理器都有自己的读写缓存区,用以批量地更新变量。然后通过优化指令的手段,将指令代码在多个C
2020-07-25 15:01:07 191
原创 java多线程开发04——内存模型
文章目录java多线程开发04——内存模型并发编程线程同步问题java内存模型重排序重排序和内存屏障java多线程开发04——内存模型并发编程线程同步即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态**临界区(线程维护):**通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后
2020-07-25 11:32:40 95
原创 算法学习11——位运算
位运算求n的二进制表示中的第k位的值x=n>>kx&1lowbit,返回x的最后一位1:x&(-x)基于lowbit计算x中二进制表示中1的个数每次减轻最后一位1,计算次数源码:x,反码:~x,补码:~x+1=-x...
2020-07-24 11:15:35 149
原创 算法学习10——java中的map
文章目录算法学习10——java中的mapmap接口AbstractMap抽象Map域方法HashMap域静态类方法算法学习10——java中的mapmap接口定义了一个用来把keys映射到maps的对象,一个map不能包含重复key,每个key最多映射一个value的值这个提供三个collection视图,允许返回keys的set,values的collection,和key-value的键值对映射。如果将可变对象作为键值需要格外注意方法功能int size();返回
2020-07-21 09:10:32 353
原创 算法学习09——计数、基数、桶排序
文章目录计数、基数、桶排序计数排序基数排序桶排序计数、基数、桶排序嘿嘿嘿,懒得写代码了计数排序计数排序的思想和实现都很简单,就是统计每个元素出现的次数,然后迭代每个元素的次数进行排序基数排序获取最大的数获取最大的数的位数按照低位的数字,使用稳定的排序算法,对数组进行排序类似的思路,使用稳定的算法从低位到高位,对数组进行排序桶排序将数组划分成为多个区间每个区间进行排序...
2020-07-20 19:15:48 187 1
原创 算法学习08——快速排序
快速排序此处只有一个我背的滚瓜烂熟的模板public void quickSort(int[] arr, int left, int right){ if(left >= right) return; int i = left - 1; int j = right + 1; int x = arr[left]; while(i < j){ while(arr[++i] < x); while(arr[--j] &g
2020-07-20 18:47:09 99
原创 算法学习07——堆操作
文章目录堆操作基本操作插入和弹出最大的元素从一个数组建立堆序堆排序源码堆操作基本操作上滤: private void percolateUp(int index){ //如果以及到达根节点,无法继续上滤,返回即可 if(index==0) return; //获得父节点 T parent = (T)elements[(index-1)/2]; //当前节点 T current = (T)elements[index]; //父节点比当前
2020-07-20 17:09:47 216
原创 算法学习06——堆
文章目录~~堆~~二叉堆堆操作建堆堆排序堆**堆序性质:**和普通的树不同的是,堆具有堆序性质。所谓堆序性质,即堆的根节点要比所有字节点大,并且递归地具有此性质。即树根比左孩子和右孩子要大,同时左孩子在左子树中最大,右孩子在右子树中最大。**结构性质:**类似完全二叉树,底层上的元素被全部填满,底层从左往右填入元素。二叉堆二叉堆即每个节点最多只有两个节点的堆结构,每个节点(序号i)的父节点,左子节点,右子节点具有如下的变换关系父节点: ⌊i/2⌋\left \lfloor i/2 \ri
2020-07-20 12:40:07 72
原创 java多线程开发03——CAS
文章目录java多线程开发03——CASCAS 是怎么实现线程安全的?存在问题java多线程开发03——CAScas全称是Compare and Swap,即比较再交换,乐观锁的一种实现方式,是一种轻量级锁,JUC 中很多工具类的实现就是基于 CAS 的。CAS 是怎么实现线程安全的?线程在读取数据时不进行加锁,在准备写回数据时,先去查询原值,操作的时候比较原值是否修改,若未被其他线程修改则写回,若已被修改,则重新执行读取流程。比较+更新 整体是一个原子操作存在问题循环时间长CPU开销大:
2020-07-07 20:56:50 108
原创 java多线程开发02——synchronized
文章目录java多线程开发02——synchronizedsynchronized应用对象头偏向锁轻量级锁java多线程开发02——synchronized偏向锁、轻量级锁是JVM级别实现的重量级锁是操作系统级别实现的JUC是JDK级别实现的synchronized应用对于普通方法,锁是当前实例对象对于静态同步方法,锁是当前类的Class对象对于同步方法块,锁是Syschronized括号里配置的对象对象头锁的状态通过java对象头进行区分。syschronized用的锁是存
2020-07-07 20:56:05 169
原创 java多线程开发01——volatile
文章目录java多线程开发01——volatilevolatile可见性禁止指令重排序java多线程开发01——volatilevolatile一但一个共享变量(类成员变量,类静态成员变量) 被volatile修饰后那么就具备了以下两层语义(1)保证不同线程对其的可见性,即不同线程修改该变量,新值对于其他线程是立即可见的。(2)禁止指令重排序。可见性所谓可见性,是指某个线程对volatile修饰的变量进行修改,其他线程可见修改后的内容。基于以下两点实现这个功能:将当前处理器缓存行的数据写回
2020-07-04 21:04:59 151
原创 netty学习笔记09——filechannel的使用
文章目录netty学习笔记09——filechannel的使用netty学习笔记09——filechannel的使用写入内容import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class NIOFileChannelWriter { public static void main
2020-06-02 18:24:34 407 1
原创 netty学习笔记08——Channel
文章目录netty学习笔记08——Channel基本介绍netty学习笔记08——Channel基本介绍NIO的通道(channel)类似流,但是有以下的区别:通道可以同时进行读写(双工),而流只能读或者只能写(单工)通道可以实现异步读写数据通道可以从缓冲读数据,也可以写数据到缓存Channel在NIO中是一个接口public interface Channel extends Closeable()A channel represents an open connect
2020-06-02 18:17:21 202
原创 netty学习笔记06——NIO三大组件的关系
netty学习笔记06——NIO三大组件的关系每个channel都会对应一个bufferselector对应一个线程,一个线程对应要给channel(连接、socket)程序切换到哪个channel是由事件决定的selector会根据不同的事件,在各个通道上切换buffer就是一个内存块,底层是有一个数组数据的读取写入是通过Buffer,这个和BIO有本质不同的。bio是面向流的,流有输入输出,不能双向。buffer可以读也可以写channel也是双向的...
2020-05-27 16:55:05 214
原创 netty学习笔记07——缓冲区Buffer
文章目录netty学习笔记07——缓冲区Buffer基本介绍重要参数相关API阅读构造bufferBuffer的创建flip()方法行为Get()和Put()行为netty学习笔记07——缓冲区Buffer基本介绍缓冲区Buffer,缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel提供从文件、网络读取数据 渠道,但是读取或写入的数据都必须经由Buffer
2020-05-27 16:54:09 416
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人