知识积累
文章平均质量分 64
舜绪
以兴趣为驱动
展开
-
可重入分析
可重入分析1. 什么是“可重入”2. 可能出现重入问题的接口2.1 单个网络调用2.2 多段网络调用2.3 有状态接口3. 可重入保证的关键场景4. 可重入的判断依据引言:微服务中,网络调用随处可见,也带来了很多问题,对于底层搬砖程序员,最明显的影响就似乎分布式事务、网络波动异常等。接口可重入以及接口无状态往往是解决这些问题的关键。1. 什么是“可重入”一般情况下,可重入指的是接口(函数)可以重复调用且不发生异常。个人认为,与幂等相比,可重入是一个业务概念。幂等指的是相同输入必定有相同输出,原创 2021-11-01 17:07:04 · 767 阅读 · 0 评论 -
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 · 329 阅读 · 0 评论 -
关于“代码分层”的思考
在很多语言中,都会利用“目录”来规范开发者分层的逻辑。比如Javaweb中,会将目录分为Controller,Service,Dao,Model等等。利用目录的形式对开发者进行约束,能够使代码整体结构更加清晰,功能分工更加明确。我一直“以为”我对分层的感受能力还是很强的,但是回顾上星期写的代码,才让我感觉我对分层的理解一直停留在表面。大家都知道:在逻辑上,可能使用概念分层,比如AO,DAO;在功能上,可能使用模块名进行约束,比如xxx_order、xxx_log;进一步到代码上,利用目录进行分原创 2021-08-25 10:59:12 · 320 阅读 · 0 评论 -
支付安全论
个人觉得支付安全分两部分,一个是技术安全,一个是业务安全。由于目前的技术上限,利用各种加密技术,技术安全是比较容易保障的。业务安全指的是人为操作上的风控,欺诈手段层出不穷,我们需要保证正常支付的进行,也阻断异常支付。技术安全:票据,加密,验签。业务安全:羊毛党:事前事中事后行为模式识别,用户画像+拦截。解决难度:玩法多样,套路层出,策略模型覆盖有限。识别方法:关键行为路径:比如“打开链接支付”这就是一个诈骗强特征,或者说给好友发过来的非好友的收款码转账,也是关键路径。染色扩散:根据已原创 2021-07-17 16:09:49 · 176 阅读 · 0 评论 -
优惠券发券状态一致性问题
业务需求:用户能够领券用户能够分享券活动领券逻辑:用户从平台自发领券用户点击好友的分享链接,随后领券。两个维度:领券人和分享人。问题1:优惠券库存有限,如何保证活动的可持续性答:首先根据用户量以及营销经费,预估优惠券数量。其次,限制个人领券,一个人只能领取1张平台券,1张分享券(好友分享,提高裂变),分享成功可以再得一张。最后,限制分享券裂变,一次分享链接最多被3个好友领取。问题2:个人领券是有限制的,分享链接的可用次数也是有限制的,这就存在并发问题。这里面有两个写操作,一原创 2021-07-17 16:08:18 · 559 阅读 · 0 评论 -
和钱相关的处理
在后端中,钱的处理不可谓之不重。不同的系统要求的精度不一样,比如日常支付以分为单位便可以了,但是涉及到乘除运算(利息),那就需要更高的精度。但是都有一个通用的做法,就是实现一个专门操作钱的类——Money。大部分语言都有一些高精度(定点数)的工具(类),但是说实话,并不一定好用,不如自己写一个。比如Java的BigDecimal,当用户使用非字符串进行初始化的时候,它是有精度损失的。而数据库可能提供了decimal之类的数据类型(如mysql),但是大都十分占用内存,而且运算速度较慢。还有的使用原创 2021-05-26 09:50:27 · 123 阅读 · 0 评论 -
自己实现的Java持久层框架
简介该框架名为DdwDao,为笔者自己实现的ORM框架名称。一开始的初衷仅仅是好玩,自己封装了一下JDBC,后面想把它做成毕设,就完善了一下。DdwDao是一款Java语言操作MySQL的持久层框架,用户仅需要让JavaBean的属性命名与数据库的字段命名一一对应(或者通过注解标注别名),即可建立对象与关系的映射。特性:免除SQL语句实现所有等值条件的增删改查;免除了所有的 JDBC 代码以及设置参数和获取结果集的工作;自动完成资源池的维护以及回收;配置化修改框架,如自定义主键配置器,自定原创 2021-04-15 22:38:25 · 165 阅读 · 0 评论 -
Java知识大全
前言大三即将结束了,最终还是决定不考研。因此,打算把之前学过的知识再梳理一遍,整理成笔记,并进行一些原理上的思考。1. 在Java中,int类型永远是32位因为Java虚拟机的存在,类型的定义也是跨平台的。2. Java适合于网络/分布式环境分布式的前提是网络环境,由于Java对CS模式的支持,因此对网络的支持也渗透到了方方面面。分布式分为数据分布和操作分布。可以通过url的形式,将数据分布在网络中,也可以通过分布式的数据库实现数据分布;操作分布其实就是分布式计算,典型的就是MapRedu原创 2021-03-01 22:33:48 · 1391 阅读 · 5 评论 -
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 · 634 阅读 · 0 评论 -
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 · 1021 阅读 · 0 评论 -
Shiro会话管理/前后分离身份鉴别原理
目录问题1. SecurityUtils.getSubject().getPrincipal()返回类型;问题2. Shiro如何利用session保持会话我们常用 SecurityUtils.getSubject().getPrincipal();获取当前登录用户信息,但是这个方法是如何获得用户信息的?Shiro又是如何区分不同用户的身份的?问题1. SecurityUtils.getSubject().getPrincipal()返回类型;查看源码得知它是Object,但是实际上,他的返回类型由原创 2020-11-19 15:17:34 · 872 阅读 · 0 评论 -
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 · 917 阅读 · 0 评论 -
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 · 4323 阅读 · 0 评论 -
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 · 1323 阅读 · 1 评论 -
解决 tomcat乱码、IDEA中tomcat乱码
在 tomcat / conf 目录下,打开 logging.properties ,增加参数java.util.logging.ConsoleHandler.encoding = GBK翻译 2020-07-29 09:56:40 · 132 阅读 · 0 评论 -
【经验分享】RESTFul实践以及数据库字段兼容设计与字段预留
1. RESTFul与API设计RESTFul是一种架构设计风格,它有多个实现层级,最常用的领域在于前后端交互时的API设计。API一般有两层含义:一是指语言或者框架的使用方法(如JAVA API文档),描述了语言或框架的函数调用接口;而是指远程调用的接口地址。RESTFul有两个最大的特征:面向资源操作以及无状态,本次分享只涉及到面向资源操作。RESTFul将请求抽象为资源操作,比如我们百度搜索“学习”,其实是在向百度服务器中的 “学习”【资源的查询】操作。资源基本操作包含四种:【查询】、【添加原创 2020-07-26 15:21:30 · 341 阅读 · 0 评论 -
【精简版】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 · 166 阅读 · 1 评论 -
经验:数据库中性别、状态、字典使用什么字段?
结论:使用char类型,长度为10表示女,1表示男。char类型可以在java中转换成String,方便前端进行判断转换,而且方便在Java代码中进行转换,比如excel导出时使用。如:gender = gender.equals(“1”)?“男”:“女”如果字段是tinyint、bit,将会面对类型转换的麻烦。同理,凡是字典类型,建议数据库中用char,java中用String。...原创 2020-07-17 16:51:23 · 6731 阅读 · 0 评论 -
免费快捷一键生成SSL证书
https://freessl.cn/https://www.pianyissl.com/https://certbot.eff.org/我只用过第一个,因为太强了,差不多五分钟搞定。下面两个是别人推荐的。原创 2020-07-13 21:33:15 · 2555 阅读 · 0 评论 -
新手对跨域的误解以及Credentials对跨域配置的坑
在学习过程中,跨域似乎很简单,无非就是“当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域”;无非就是“后端加一下跨域的相关响应头即可”。但是在前后联调过程中,发现跨域并没有那么容易解决。后端环境是springboot,一开始用的重写WebMvcConfigurer里面的addCorsMappings,添加相应的响应头,但是发现无效。百度一下猜测可能是因为过滤器链的顺序问题,因此单独写了一个Filter并将order设为较靠前的位置。然而,设置的ACCESS_CONTR原创 2020-07-12 09:24:43 · 1219 阅读 · 0 评论 -
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 · 1877 阅读 · 0 评论 -
手写服务器笔记记录与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 · 148 阅读 · 0 评论 -
【未解决】获取注解上的注解的值
网上没找到相关资料,自己尝试做了下。注解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 · 272 阅读 · 3 评论 -
【jpa坑爹记录】不报错也不生成数据表
网上的解决办法都是加update、改包名位置、加注解…都没用的话解决办法:不要使用hibernate的@Tableimport org.hibernate.annotations.Table;我两个Table都用了,因为hibernate的@Table可以写comment,但是发现这是个坑。另外一个坑:订单表经常看到命名为Order,其实Order是mysql的保留关键字,用它会报错,可以加个前缀或者后面加个s...原创 2020-06-22 15:52:59 · 402 阅读 · 0 评论 -
@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 · 671 阅读 · 2 评论 -
【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 · 382 阅读 · 0 评论 -
超级巨坑记录:springboot+thymeleaf更换背景图(静态资源图片)无法获取(404错误)
在login.html中应用了一张background.jpg图片,然后我把该图片换成另一张图片,也改名外background.jpg,然后就无法获取该图片,404错误。当我把原图换回来的时候,又可以看见了。这好像是第二张图片有毒一样。而且:shiro没有对该图进行拦截。thymeleaf的缓存已被关闭。这两张图片是同名的。最后找到答案:尽管关闭了thymeleaf的缓存,浏览器依...原创 2020-03-24 19:59:35 · 2393 阅读 · 2 评论 -
Java泛型
泛型1. 什么是泛型2. 泛型类、接口类接口3. 泛型方法4. 类型通配符5. 泛型擦除6. 泛型和数组1. 什么是泛型在推出泛型之前,程序员通过构建元素类型为Object的集合,存储多个任意类型的数据对象;在使用该对象的过程中,程序员需要明确知道存储每个元素的数据类型(几乎不可能),否则会引发ClassCastException。显然,类型的优点:在不知道集合存储类型的前提下,泛型能够...原创 2020-03-24 14:10:16 · 129 阅读 · 0 评论 -
【学习】微信小程序开发
小程序开发1. 下载编辑器2. 项目目录3. 组件4. 指令5. 前后端交互1. 下载编辑器百度搜索微信小程序,在开发者工具里面下载即可。安装完毕之后创建一个小程序项目,选择测试ID。2. 项目目录app.jsonpages:用于登记注册页面,小程序按照pages中的页面顺序进行展示.wxml :html的封装版本,支持原生html或者wx的一些自定义标签.wxss:css的封...原创 2020-03-22 16:53:31 · 137 阅读 · 0 评论 -
复杂sql记录
灵感来了也记不住,在这里记录一下一些sql查询,方便以后复制粘贴往角色为st_admin的用户的user_msg表中插入一条记录。难点:角色为st_admin的用户个数不定<insert id="sendMsgToRole"> insert into user_msg (user_id,title,content,sender) select tmp....原创 2020-03-17 15:35:29 · 81 阅读 · 0 评论 -
重温mysql
mysql起步命令1. DQL语言1.1 基础查询1.2 条件查询1.3 排序查询1.4 常见函数单行函数分组函数1.5 分组查询2. DML语言3. DDL语言4. TCL语言5. 视图6. 存储过程与函数7. 流程控制结构容易犯的逻辑错误SQL准备相关sql在文章底部起步命令启动\终止服务net start mysqlnet stop mysql登录数据库mysql [-...原创 2020-02-04 16:54:58 · 3046 阅读 · 1 评论 -
Java lambda&Stream
lambda&Stream1. lambda1.1 函数式接口1.2 表达式编写方法2. Stream2.1 Stream介绍2.2 流的三种操作2.2.1 生成流2.2.2 中间操作2.2.3 终值操作2.3 流的执行顺序2. 4 IDEA可视化Stream1. lambdaLambada 简介:Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。L...转载 2020-01-18 14:30:58 · 235 阅读 · 0 评论 -
前端常用插件(长期补充)
Markdown编辑器内容排版动画代码高亮目录生成滚动检测平滑滚动即时二维码生成原创 2020-01-11 16:34:34 · 121 阅读 · 0 评论 -
一个if-else搞定输出棱形
无论是什么编程语言,学习循环控制的时候,总会出现这道题——打印棱形。常见的做法是:将棱形拆分成上半部分和下半部分(左半部分和又半部分),然后通过控制语句实现。但是实际上,只需要一个判断语句就可以实现。//行列数int n=7;for(int i=0;i<n;i++){ for(int j=0;j<n;j++) { if ((i+j)>...原创 2019-12-23 18:37:49 · 329 阅读 · 0 评论