- 博客(161)
- 资源 (1)
- 收藏
- 关注
原创 Java知识大全
前言大三即将结束了,最终还是决定不考研。因此,打算把之前学过的知识再梳理一遍,整理成笔记,并进行一些原理上的思考。1. 在Java中,int类型永远是32位因为Java虚拟机的存在,类型的定义也是跨平台的。2. Java适合于网络/分布式环境分布式的前提是网络环境,由于Java对CS模式的支持,因此对网络的支持也渗透到了方方面面。分布式分为数据分布和操作分布。可以通过url的形式,将数据分布在网络中,也可以通过分布式的数据库实现数据分布;操作分布其实就是分布式计算,典型的就是MapRedu
2021-03-01 22:33:48 3114 5
原创 可重入分析
可重入分析1. 什么是“可重入”2. 可能出现重入问题的接口2.1 单个网络调用2.2 多段网络调用2.3 有状态接口3. 可重入保证的关键场景4. 可重入的判断依据引言:微服务中,网络调用随处可见,也带来了很多问题,对于底层搬砖程序员,最明显的影响就似乎分布式事务、网络波动异常等。接口可重入以及接口无状态往往是解决这些问题的关键。1. 什么是“可重入”一般情况下,可重入指的是接口(函数)可以重复调用且不发生异常。个人认为,与幂等相比,可重入是一个业务概念。幂等指的是相同输入必定有相同输出,
2021-11-01 17:07:04 850
原创 RocketMQ学习与分析
RocketMQ学习与分析1. 架构图2. 设计2.1 设计理念2.2 设计目标1. 架构图NameServer:类似注册中心,存储了协调治理Broker所需的所有信息(如<borker:Topic路由信息>,HashMap存储)NameServer集群各节点之间没有信息同步(producer和consumer轮询所有NameServer节点直到拿到所需信息)通过定期心跳来管理Broker信息,并对外提供接口给producer/consumer访问broker信息。Broker
2021-10-29 15:19:21 397
原创 关于“代码分层”的思考
在很多语言中,都会利用“目录”来规范开发者分层的逻辑。比如Javaweb中,会将目录分为Controller,Service,Dao,Model等等。利用目录的形式对开发者进行约束,能够使代码整体结构更加清晰,功能分工更加明确。我一直“以为”我对分层的感受能力还是很强的,但是回顾上星期写的代码,才让我感觉我对分层的理解一直停留在表面。大家都知道:在逻辑上,可能使用概念分层,比如AO,DAO;在功能上,可能使用模块名进行约束,比如xxx_order、xxx_log;进一步到代码上,利用目录进行分
2021-08-25 10:59:12 372
原创 支付安全论
个人觉得支付安全分两部分,一个是技术安全,一个是业务安全。由于目前的技术上限,利用各种加密技术,技术安全是比较容易保障的。业务安全指的是人为操作上的风控,欺诈手段层出不穷,我们需要保证正常支付的进行,也阻断异常支付。技术安全:票据,加密,验签。业务安全:羊毛党:事前事中事后行为模式识别,用户画像+拦截。解决难度:玩法多样,套路层出,策略模型覆盖有限。识别方法:关键行为路径:比如“打开链接支付”这就是一个诈骗强特征,或者说给好友发过来的非好友的收款码转账,也是关键路径。染色扩散:根据已
2021-07-17 16:09:49 204
原创 优惠券发券状态一致性问题
业务需求:用户能够领券用户能够分享券活动领券逻辑:用户从平台自发领券用户点击好友的分享链接,随后领券。两个维度:领券人和分享人。问题1:优惠券库存有限,如何保证活动的可持续性答:首先根据用户量以及营销经费,预估优惠券数量。其次,限制个人领券,一个人只能领取1张平台券,1张分享券(好友分享,提高裂变),分享成功可以再得一张。最后,限制分享券裂变,一次分享链接最多被3个好友领取。问题2:个人领券是有限制的,分享链接的可用次数也是有限制的,这就存在并发问题。这里面有两个写操作,一
2021-07-17 16:08:18 663
原创 Java学习路线以及相关资料
说明学会利用博客记录自己的学习过程,推荐GitHub或CSDN。除特殊说明,跟着视频敲每行代码。学习资料可能存在失效的问题,但解决问题也是必需掌握的能力。官方文档一定是最好的学习资料,多看文档。一、理论基础1. Java基础+MySQLhttps://www.bilibili.com/video/BV1T7411m7Ta?p=537PS:mysql部分熟练掌握数据的增删改查,其他看懂即可2. JavaWeb基础+Redishttps://www.bilibili.com/video/
2021-06-25 18:47:12 281
原创 链表不带头可能造成内存泄露
链表是否带头,指的是是否带有一个空节点作为链表的头部,该节点不存储其他信息。对于是否带头的判断依据,几乎所有的结论都聚焦在“操作区别”上,但是其实是否带头涉及到一个内存泄露的问题。经典题目“反转单链表”想必大家都做过,如果是不带头节点的链表,反转过后就发生了内存泄露。现在使用不带头节点的链表,假设链表如下图所示:head是一个main中的栈对象,而非指针,实际调用了4次new,因此析构时应当回收四个指针对象。下图是翻转过后的。注意看tmp本身的地址0x615ca0,是head对象的最后一个
2021-05-26 13:19:46 498
原创 和钱相关的处理
在后端中,钱的处理不可谓之不重。不同的系统要求的精度不一样,比如日常支付以分为单位便可以了,但是涉及到乘除运算(利息),那就需要更高的精度。但是都有一个通用的做法,就是实现一个专门操作钱的类——Money。大部分语言都有一些高精度(定点数)的工具(类),但是说实话,并不一定好用,不如自己写一个。比如Java的BigDecimal,当用户使用非字符串进行初始化的时候,它是有精度损失的。而数据库可能提供了decimal之类的数据类型(如mysql),但是大都十分占用内存,而且运算速度较慢。还有的使用
2021-05-26 09:50:27 167
原创 C++内存管理
本文为学习侯捷老师的C++内存管理机制的笔记。内存使用的接口等级基本方法new:调用::operator new()->调用malloc开辟空间,如果空间不足,则调用用户注册的newhandler(一般用于释放空间),然后再开辟空间将malloc开辟空间得到的指针,转为我们new的对象指针利用对象指针调用其构造方法delete:调用析构调用::operator delete()->调用free()释放空间new ClassName[SIZE]:new数组,会
2021-05-25 16:05:20 228 1
原创 Redis源码精炼版
目录1. 数据结构1.1 字符串(sds)1.2 链表(list)1.3 字典(dict)rehash渐进式rehash1.4 跳表(zskiplist)1.5 整数集合(intset)升级1.6 压缩列表(ziplist)参考书籍:《Redis的设计与实现》——黄建宏1. 数据结构1.1 字符串(sds)struct sdshdr{ // 字符串的实际长度 int len; // buf的剩余长度 int free; // 实际串 char buf[];}优点:O(1
2021-05-22 21:17:35 1039 2
原创 服务器编程的注意事项
一个进程的所有线程共享所有信号。因此,多线程的时候,需要一个线程处理所有信号。信号处理分散到多个线程中很容易出错。参考14-8-3(linux高性能服务器编程)EPOLLONESHOT即使使用ET,一个连接fd也可能被触发多次。比如在并发程序中,一个线程读取一次fd进行处理,而此时该fd又有读事件被触发,这时候该fd可能被另一个线程拿到,这就出现了多个线程同时操作同一个连接的情况。采用EPOLLONESHOT可保证该fd只能被触发一次(因此执行完该事件后,需要重新设置该fd的EPOLLON..
2021-05-18 12:20:01 132
原创 从epoll到HTTP到Web框架,手写一个Web项目
项目地址1. 项目介绍本项目C++为初学者的学习项目,从epoll到HTTP服务器到Web项目,除了用了boost的字符串处理,全部手撸,没有任何其他依赖。 实现了用户的注册、登录、充值、交易(转账)功能。epoll服务器部分参考《Linux系统编程》以及boost的axio的example(尤其是HTTP协议解析部分)。web后台是笔者按照自己的Java Web开发经验整出来的简单实现。web前端使用bootstrap可视化编程做的,jq写的比较烂。数据库采用的是linux文件系统,仅仅做了简
2021-05-14 13:47:55 342 5
原创 有限状态自动机 解析HTTP请求头与body中的json
代码读起来容易,写起来容易掉头发。HTTP请求头是boost自带的一个example,解析body为JSON字符串是我加的(暂不支持嵌套JSON).hpp文件//// Created by sxuer on 2021/5/5.//#ifndef payhttp_REQUESTPARSER_HPP#define payhttp_REQUESTPARSER_HPP#include <tuple>#include <boost/algorithm/string.hpp&g
2021-05-09 22:48:57 528
原创 C++ 通用对象池的设计与实现
用语:client:使用对象池的线程pool:对象池deque:对象池的容器base-object:初始化时client传入的基本对象object:对象池的存储对象1. 功能概要池一般用于复杂对象、高消耗对象的复用,基于这个观点,基本使用如下:client初始化一个基本对象base-object,该对象的创建过程可以是极其复杂的。client初始化pool对象,并将base-object传入,可以指定pool的capacity(default=16)pool利用base-object,
2021-05-08 22:56:11 443
原创 Java 转 C++ 知识点
目录0. 内存模型1. 变量的作用域2. typedef与define的区别3. 类的继承范围4. 常量与常函数5. 传值、传引用6. 友元的意义7. 左移运算符重载8. 析构函数9. 带指针的类10. 转型11. 多态12. 右值引用与move13. 智能指针14. iterator_traits特征萃取15. IO(C语言)16. 缓冲17. 文件描述符18. 钩子函数19. fork、exec、wait20. 守护进程21. 信号22. mutex和cond23. 线程24. select poll
2021-04-26 09:40:15 3174
原创 自己实现的Java持久层框架
简介该框架名为DdwDao,为笔者自己实现的ORM框架名称。一开始的初衷仅仅是好玩,自己封装了一下JDBC,后面想把它做成毕设,就完善了一下。DdwDao是一款Java语言操作MySQL的持久层框架,用户仅需要让JavaBean的属性命名与数据库的字段命名一一对应(或者通过注解标注别名),即可建立对象与关系的映射。特性:免除SQL语句实现所有等值条件的增删改查;免除了所有的 JDBC 代码以及设置参数和获取结果集的工作;自动完成资源池的维护以及回收;配置化修改框架,如自定义主键配置器,自定
2021-04-15 22:38:25 187
原创 SpringBoot 通过方法参数解析器实现登录用户的统一校验
编写对应的解析器supportsParameter用于对象过滤,返回true才会执行resolveArgument方法,此处只通过User对象。在resolveArgument中,获取到前端的cookie,然后根据cookie拿到用户信息并返回。这样控制器中的User参数,会直接走这里的逻辑。@ModelAttribute也可以做到类似的逻辑这样就对ChatHistory对象做了提前校验,但是这个方法在控制器的任意方法执行前都会执行一遍,所以不太合理。他的最佳用处还是用于控制器级别的执行前
2021-03-13 22:12:26 300
原创 docker命令遗忘后快速上手方案
安装yum install docker或者apt-get install docker.io避免sudo权限,将当前用户加入docker用户组#添加docker用户组sudo groupadd docker#将登陆用户加入到docker用户组中sudo gpasswd -a $USER docker#更新用户组newgrp docker#测试docker命令是否可以使用sudo正常使用docker ps开启systemctl start docker开机自动开启system
2021-03-13 17:17:01 297
原创 IDEA-SpringBoot项目利用docker实现一键打包部署运行
服务器上配置1. 开启docker远程访问cd /lib/systemd/systemsudo vim docker.service#替换或修改:127.0.0.1(本地网络访问)换成0.0.0.0表示不限制访问地址[Service]ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:23752. 重载配置systemctl daemon-reload3. 重启docker 服务systemctl restart docker.se
2020-12-06 16:34:12 715
转载 mysql设置utf8mb4后无效,依旧无法保存emoji
字符集分 库级、表级、列级,尽管数据库字符集为utf8mb4,但是列级不一定是utf8mb4,查看admin表的列级字符集show full columns from admin;并不是utf8mb4修改为utf8mb4alter table admin modify user_name varchar(100) charset utf8mb4;查看结果...
2020-11-28 11:03:25 1062
原创 Shiro会话管理/前后分离身份鉴别原理
目录问题1. SecurityUtils.getSubject().getPrincipal()返回类型;问题2. Shiro如何利用session保持会话我们常用 SecurityUtils.getSubject().getPrincipal();获取当前登录用户信息,但是这个方法是如何获得用户信息的?Shiro又是如何区分不同用户的身份的?问题1. SecurityUtils.getSubject().getPrincipal()返回类型;查看源码得知它是Object,但是实际上,他的返回类型由
2020-11-19 15:17:34 994
原创 【算法】找出三级分类中的最低级对象
题目三级分类泛指事物从属于三个分类,这三个分类拥有从属关系,如商品的三级分类,代理等级,领导关系…有时候我们需要找出该事物最接近的一个分类。下面以行政区领导关系为例:现有三级领导,省领导–市领导–区县领导,一个省领导下有多个市领导,一个市领导只从属于一个省领导,一个市领导下有多个区县领导,一个区县领导只从属于一个市领导。一个地区可以只有单个、两个或三个领导,如:三级领导都有;有省领导而没有市领导也没有区县领导;有市领导有省领导但没有区县领导;……只有省领导;只有市领导;只有区县领导
2020-08-22 12:54:49 193
原创 SpringTask实现数据库中获取任务、调用方法、方法参数
目录1. 引言2. 数据表设计3. 代码4. 用途5. 待完善:1. 引言quartz对数据库支持非常强大,但是用起来并没有SpringTask那么简单。因此,个人造了一点小轮子,让SpringTask拥有类似quartz的功能(当然没有那么完善)。转载请注明出处,欢迎留言交流。2. 数据表设计设计思路:exec_time字段提供对固定时间执行一次的支持,也可以通过cron字段,实现任意触发时间。method_name字段表示需要触发的方法名;args则是method_name对应方法的
2020-08-22 12:35:52 1001
原创 nginx解决no-referrer-when-downgrade,设置了‘Access-Control-Allow-Origin‘ ‘*‘依旧跨域
location /api { add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow_Credentials' 'true' always; add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,U
2020-08-21 09:49:28 4635
原创 docker限制mysql资源占用(内存、IO等)
容器已启动;在宿主机任意位置下vim docker.cnf写入skip-host-cacheskip-name-resolveperformance_schema_max_table_instances=400table_definition_cache=400table_open_cache=256performance_schema=off将这个文件复制到mysql容器内sudo docker cp ./docker.cnf 容器名:/etc/mysql/conf.d更新容器资
2020-08-19 10:50:47 1444 1
翻译 解决 tomcat乱码、IDEA中tomcat乱码
在 tomcat / conf 目录下,打开 logging.properties ,增加参数java.util.logging.ConsoleHandler.encoding = GBK
2020-07-29 09:56:40 159
原创 【经验分享】RESTFul实践以及数据库字段兼容设计与字段预留
1. RESTFul与API设计RESTFul是一种架构设计风格,它有多个实现层级,最常用的领域在于前后端交互时的API设计。API一般有两层含义:一是指语言或者框架的使用方法(如JAVA API文档),描述了语言或框架的函数调用接口;而是指远程调用的接口地址。RESTFul有两个最大的特征:面向资源操作以及无状态,本次分享只涉及到面向资源操作。RESTFul将请求抽象为资源操作,比如我们百度搜索“学习”,其实是在向百度服务器中的 “学习”【资源的查询】操作。资源基本操作包含四种:【查询】、【添加
2020-07-26 15:21:30 366
原创 【精简版】git分支融合与冲突处理
分支名称:test主干名称:master将代码拉取到本地(已有则忽略)git checkout test (保证本地下载分支)git checkout master (切换到主干)git merge test (融合test分支)报错,存在冲突按报错信息打开对应的文件,将>>>HEAD ===之类的删除,处理内容git add -Agit commit -m “处理冲突并融合”git push其他可能用上的命令:撤销merge状态:git merge --
2020-07-25 20:34:40 198 1
原创 经验:数据库中性别、状态、字典使用什么字段?
结论:使用char类型,长度为10表示女,1表示男。char类型可以在java中转换成String,方便前端进行判断转换,而且方便在Java代码中进行转换,比如excel导出时使用。如:gender = gender.equals(“1”)?“男”:“女”如果字段是tinyint、bit,将会面对类型转换的麻烦。同理,凡是字典类型,建议数据库中用char,java中用String。...
2020-07-17 16:51:23 7727
原创 免费快捷一键生成SSL证书
https://freessl.cn/https://www.pianyissl.com/https://certbot.eff.org/我只用过第一个,因为太强了,差不多五分钟搞定。下面两个是别人推荐的。
2020-07-13 21:33:15 2741
原创 新手对跨域的误解以及Credentials对跨域配置的坑
在学习过程中,跨域似乎很简单,无非就是“当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域”;无非就是“后端加一下跨域的相关响应头即可”。但是在前后联调过程中,发现跨域并没有那么容易解决。后端环境是springboot,一开始用的重写WebMvcConfigurer里面的addCorsMappings,添加相应的响应头,但是发现无效。百度一下猜测可能是因为过滤器链的顺序问题,因此单独写了一个Filter并将order设为较靠前的位置。然而,设置的ACCESS_CONTR
2020-07-12 09:24:43 1282
原创 Nginx配置跨域响应头解决跨域问题
# For more information on configuration, see:# * Official English Documentation: http://nginx.org/en/docs/# * Official Russian Documentation: http://nginx.org/ru/docs/user nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid /run/n
2020-07-12 08:34:47 1927
原创 手写服务器笔记记录与tomcat相关笔记(无源码)
目录@[TOC](目录)1. 前言2. 逻辑推导3. 关键问题:4. servlet5. 问题思考6. 图解与说明7. 优化servlet缓存池servlet线程安全8. 应用联想1. 前言阅读之前,请先理解以下概念:web服务器:如tomcat,它是web应用的载体。由于我们平时老是说“客户端与服务端进行交互”,然后容易误以为我们写的web应用就是服务器,这种理解是错误的。web服务器相当于一个容器,装载着我们写的web应用,与浏览器进行交互的是web服务器,处理逻辑的是我们的web应用。web
2020-06-30 18:28:16 168
原创 【未解决】获取注解上的注解的值
网上没找到相关资料,自己尝试做了下。注解1@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface Test1 { String test1v() default "测试1的值";}注解2使用注解1@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)
2020-06-27 14:36:04 375 3
原创 【jpa坑爹记录】不报错也不生成数据表
网上的解决办法都是加update、改包名位置、加注解…都没用的话解决办法:不要使用hibernate的@Tableimport org.hibernate.annotations.Table;我两个Table都用了,因为hibernate的@Table可以写comment,但是发现这是个坑。另外一个坑:订单表经常看到命名为Order,其实Order是mysql的保留关键字,用它会报错,可以加个前缀或者后面加个s...
2020-06-22 15:52:59 438
原创 前后分离 redis实现单用户登录限制(用户仅可以在一处登录)
token设计: username+”,”+userId+”,”+IP+”,”+loginTimeredis存储K-V: key:username+”,”+id value: ip+”,”+loginTime登录实现:前端传参username,password;通过username查出user,得到userId和加密密码;初始化boolean flag=false,构造key:username+”,”+id,在redis中查询记录,若成功查到结果(即ip+loginTime),则解析字
2020-06-14 15:27:19 1699 4
原创 @Valid 无效,BindingResult中的error为0,解决方案
加上以下依赖即可 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.2.Final</version> </dependency>...
2020-06-13 14:55:28 718 2
原创 实用型实战开发笔记
开发笔记1. 分页查询2. 条件查询3. 文件上传4. 缓存理论5. 静态渲染概念6. 数据表通用字段动态映射方法(如两个必备时间)7. 定时任务调度8. 支付9. elasticSearch1. 分页查询依赖:PageHelper新建一个分页实体对象Service中startPage起到拦截作用,仅对其后的第一条查询语句有效。若依分页原理:通过((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
2020-06-12 14:43:07 448
原创 【JUnit】Java单元测试
JUnit1. 测试流程2. JUnit3. Junit生命周期4. 异常测试5. 参数化测试5. 超时测试6. springboot中的测试1. 测试流程2. JUnit相关术语:TestCase:表示一个测试单元TestSuite:表示一组TestCaseTestFixture:测试环境TestResult:保存测试结果TestRunner:运行测试TestListener:监听测试过程,收集测试数据Assert:断言3. Junit生命周期有五个常用注解@Tes
2020-06-10 12:13:12 440
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人