笔记
水心可乐
没事写点自己的体会
展开
-
Disruptor 消费线程丢失、写入无限阻塞问题
Disruptor 消费线程丢失、写入无限阻塞问题原创 2023-03-03 18:35:03 · 1630 阅读 · 0 评论 -
flink学习
用户提交一个Flink程序时,会首先创建一个Client,该Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群。Master进程,Flink系统的协调者,它负责接收Flink Job及Job的管理和资源的协调,包括任务调度,检查点管理,失败恢复、调度组成Job的多个Task执行等。Client会将用户提交的Flink程序组装成一个JobGraph,并且是以JobGraph的形式提交的。实际负责执行计算的Worker,在其上执行Flink Job的一组Task。原创 2022-11-30 11:04:45 · 420 阅读 · 0 评论 -
202209笔记
---原创 2022-09-26 16:14:56 · 179 阅读 · 0 评论 -
AG评论业务回顾(3)发评论
用户在下载应用之后,可以发评论。通过唯一主键:appid+version+country+uid限制发表次数。通过一个字典树维持敏感词,对评论内容进行过滤,如果包含敏感词直接发表失败。这个操作是同步的,敏感词库的条数后来已经来到了几千条,存在内存里面不涉及IO,实际上性能还可以接受。评论请求还会起一个异步线程,调用安全服务做自动化审核,这个服务不在我们这边,里面大概做一些对ip、uid、内容文字等的识别,判断是否存在一些集聚的刷子黑产。入库的时候会写入es、mysql、Cassandra,刷原创 2021-12-24 17:33:46 · 796 阅读 · 0 评论 -
aop使用的注意点
1. 使用类名引用,注入时报错jdk代理无法引用2. aop不生效,需要public方法,用bean引用调用。3. 继承时,不应该在父类做autowire,会重复初始化。原创 2022-05-05 19:58:47 · 673 阅读 · 0 评论 -
缓存:redis、内存、cdn缓存的使用
CDNCDN用于静态资源(包括HTML、CSS、JS、图片等)静态资源更新策略:路径中带资源版本号: https://xxx.xx/xx/{version}/xxx.js 版本上线前刷新CDN,注意cdn最终地址是否和代码中一致。 内存缓存用于存放热点数据,比如配置、预置热点数据,如果是可变数据,在对一致性要求不高时使用。定时任务更新,对于实时性要求不高可采用 订阅通知更新,实时性要求高可采用 需要评估内存资源消耗,和淘汰策略。常用LRU、配合caffeine可以用LFU。.原创 2021-09-17 10:32:46 · 875 阅读 · 2 评论 -
语言码 地区码
在互联网产品中,涉及海外运营时,需要考虑全球化语言问题:1、一个物理机房站点可能需要服务多个国家。1)不同国家的数据是否需要在用户面隔离展示2)如果不隔离,不同国家的语言不一致,2、一个运营团队可能需要运营多个站点、或者多个国家。需要在前台可用筛选国家\语言,方便运营分工。3、一个国家可能有多个语言。国际标准国际地区码可用表示为:CN 中国TW 中国台湾国际标准语言码可用表示为:zh-tw 台湾繁体中文zh-hk 香港繁...原创 2022-03-31 17:13:49 · 448 阅读 · 0 评论 -
mysql 表模型设计
主键、 bigint \varchar(32)时间 datetime普通的数值 int状态值 tinyInt文本内容 varchar原创 2022-03-13 14:56:45 · 1053 阅读 · 0 评论 -
IDEA 使用
快捷键查找找文件ctrl + shift + r找内容ctrl + h找使用 ctrl + 左键点击找继承 ctrl + t文件内查找ctrl + f导航把structure开在右边方便找函数回溯光标 alt+ 左右箭头上次编辑位置 ctrl +q设置书签ctrl + shift +数字,跳到书签ctrl +数字所有书签 shift+f11自动补全展示修改建议 alt + enter生成代码 alt + insert (右键)重构快原创 2022-03-10 17:23:21 · 290 阅读 · 0 评论 -
使用es 自定义function score做排序
如何初始化es客户端连接可以参考这个文章:【es笔记三】Java Low Level REST Client_西瓜游侠的博客-CSDN博客_restclientbuilderElasticSearch6.5.0 【Java客户端之REST Client】_weixin_33704234的博客-CSDN博客通过从文件中读取算分脚本以及参数,创建Script对象Map<String, Object> params = new HashMap<>();para...原创 2022-03-08 16:30:28 · 3570 阅读 · 0 评论 -
使用java 8语法进行开发
1. StreamList<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);// 获取对应的平方数List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());2. Optional3. future4. 集合new ArrayList<Integ原创 2022-03-08 09:52:03 · 103 阅读 · 0 评论 -
对开发流程的一点思考
1、开发不允许偷偷修改代码、所有修改必须有需求单号或者问题单号,需求单问题单必须走到测试手中关闭,这样是为了让测试能感知到可能发生的问题,减少风险。2、版本发布前需要做开源认证,如果引用的风险版本的开源软件,需要升级到推荐版本,如果无安全版本,需要移除依赖。3、开发在需求开发时,要输出story,明确修改点,测试以此作为凭据。并且要输出核心流程用例,并完成自验证。...原创 2022-03-07 21:43:44 · 136 阅读 · 0 评论 -
Java获取服务器Ip
Enumeration<NetworkInterface> allNetInterfaces = null; try { allNetInterfaces = NetworkInterface.getNetworkInterfaces(); } catch (SocketException e) { LOG.error("get local ip failed.", e); ...原创 2022-03-04 15:20:12 · 3112 阅读 · 1 评论 -
mysql导出表为文件、导入表
导出为sql文件mysqldump -h {ip} -u {user}-p {pwd} --set-gtid-purged=off -t {tableName} > xxx.sql从sql文件导入mysql -u r{user}-p {pwd} < xxx.sql原创 2022-03-04 14:17:42 · 310 阅读 · 0 评论 -
redis缓存失效、竞争加载引发的性能问题
redis缓存失效时,众所周知,如果不做保护自己放任请求去并发重新加载缓存,会导致大量请求直接打到数据库上,即出现缓存击穿问题。项目组为了解决这个问题,使用了竞争获取锁刷新缓存的方式,应对缓存失效。比如A B两个请求到达,在redis进行锁竞争,获取锁的线程开始查表刷缓存。获取不到锁的线程则开始通过循环sleep的方式,查询缓存是否刷新完毕,如果循环等待时间超过一定1秒,就放弃。这样看起来很完美,实际上引起了Redis的性能问题生成环境中,发现redis 的请求延迟和请求量均在2小时左右周期原创 2022-01-25 16:29:21 · 910 阅读 · 0 评论 -
idea找不到jar包,却可以断点走到代码里面
通过类加载器找路径,发现是jar包中集成了jar包。原创 2022-01-13 20:36:24 · 313 阅读 · 0 评论 -
记录一次reactive模型接口问题
表现生产环境一百多台机器,某接口全面返回http错误码590。接口相关的业务功能不可用,且不能自己恢复,后紧急下线相关功能配置,重启后恢复。Bug引入微服务使用netty的reactive模式进行开发,请求返回体为completableFuture<XXResponse>。接口处理函数中,新建一个completableFucture,作为返回值。completableFuture中有代码实现判空不到位,导致抛空指针异常,导致无法走到complete(XXRespons原创 2022-01-11 20:27:22 · 648 阅读 · 0 评论 -
Java服务端开发知识总结
# Java服务端开发## 中间件### redis- redis的常用数据结构和应用场景有哪些? - redis的数据结构 - String - list - 双端链表 - 压缩列表 - set - hash - zset - 底层跳表 skiplist - 数据结构存储 - https...原创 2021-12-27 20:52:30 · 931 阅读 · 0 评论 -
kafka
kafkaproducer pushconsumer pull 长轮训多个broker rebalancetopicpartition内保持有序 按key分区group 组播连续存储,写入很快,按offset访问按segment删除sendfile不走应用层 不能做死信队列和延迟队列rabbitmq可以 因为用mmap做零拷贝rocketmq按级别延迟activemq也不可以kafka 如何实现死信和延迟...原创 2021-11-03 19:16:12 · 4182 阅读 · 0 评论 -
配置项在打包、部署、运行
很多业务中,服务需要部署在不同机房、站点、国家。不同站点的版本不一定同步、一个版本在不同站点也可能是多套配置。如果发布时,是对各个站点分别出版本,需要在打发布包时嵌入配置项。可以用maven的resources 插件实现分别打包。 <profile> <id>dev</id> <properties> <env>local_dev</env原创 2021-09-14 17:23:48 · 176 阅读 · 0 评论 -
常用java代码
判断是否为空:Objects.nonNull()判断集合为空:CollectionUtils.isEmpty()空集合:Collections.emptyList() 注意这个返回的是一个不可变集合,不能添加新元素数组转listArrays.asList(0, 1, 2);List<String> list = Arrays.asList(array);集合转数组String [] array = set.toArray(new String[set.size(.原创 2021-09-09 14:23:29 · 3155 阅读 · 0 评论 -
全球发布,使用访问者的语言做接口查询
涉及跨微服务调用,需要传递语言信息在调用请求中。zh_CHen_USen_GBru_RU原创 2021-09-03 14:29:49 · 68 阅读 · 0 评论 -
ThreadPoolExecutor线程池配置
目的1、为了防止不断申请新线程导致线程资源耗尽。2、为了复用已经申请的线程资源。配置:coreSizemaxSizequeueSizeidleTimenew ArrayBlockingQueue<Runnable>(queueSize)满队列规则:new ThreadPoolExecutor.DiscardPolicy()一般max配coreSize两倍。...原创 2021-08-04 17:16:56 · 738 阅读 · 0 评论 -
使用Java PriorityQueue和TreeSet排序的踩坑小记录
背景是需要一种数据结构:支持添加元素进入该结构、或根据元素内容从结构中移除该元素;该结构支持按给定的排序规则遍历。于是就想到了 priorityQueue!!!给它定义一个按字符串的长度倒序排序:priorityQueue = new PriorityQueue<>(Comparator.comparingInt(String::length).reversed());一顿添加之后:发现:顺序竟然不对?! 丝毫没有向想象中的结果发展。。。即使用内置的迭代器遍历结果也是一样原创 2021-07-06 09:49:37 · 702 阅读 · 0 评论 -
签名、加密
什么数据需要加密密码、用户不公开数据比如个人隐私、个人可见数据。区分加密与编码1. aes加密:用于对密钥、敏感数据进行加密2. base64编码:文本中的emoji,如果直接存进数据库很有可能有乱码问题,用base64编码后存储可解决。密钥管理Root key : 根密钥 相当于KEKWorking key : 随机生成,使用root key加密为密文存放在配置中,相当于DEK// 随机生成working key (也叫kek)// 生成root key(也叫maste原创 2021-04-14 16:39:57 · 4191 阅读 · 0 评论 -
Java+mysql时区处理
一般来说,在Mysql中存的是utc时间,遵循存储与展示分离原则,时间在展示时转换为当地时间。Java中的时间Java的Date类型,是一个绝对时间值,是根据当前服务器时间获取的,服务器的时间和时区需要正确配置,至于配什么时间+时区无所谓,重要的是绝对时间是对的。Mysql中的时间存储mysql的DateTime类型,可以认为是一个字面量。如果指定了jdbc连接串时区为UTC,会直接把java Date的UTC绝对时间变为字面量写入DateTime字段。如果指定了jdbc连接串.原创 2021-04-07 15:39:30 · 355 阅读 · 0 评论 -
自签名证书实现 java服务 <->nginx HTTPS 双向认证
生成证书C="CN"ST="Zhejiang"L="HanZhou"O="Alibaba"OU="Nginx"CN="11.22.33.44"CN_CLIENT="MicroService"emailAddress="abc@edf.com"PASSWD="password"JKS_PASSWD="password"rm -rf tempmkdir tempcd temp/mkdir -p demoCA/newcertstouch demoCA/index.txttou原创 2021-04-06 20:34:18 · 343 阅读 · 0 评论 -
break label和continue label
1. label只能加在循环关键字上 label1 : for ,如果加在非循环保留字上,break label和continue label编译报错2. break表示跳出某个循环,continue 表示进入标记的循环的下一次循环原创 2021-03-24 15:38:04 · 424 阅读 · 0 评论 -
不安全的加密算法
不安全的加密算法SKIPJACK\RC4\RSA(1024位以下) des、md2、md4、md5原创 2021-03-24 14:32:15 · 13400 阅读 · 0 评论 -
Java 泛型 <? super T> <? extend T> 的通俗理解
假设,我们有下面几个类:class Food{}class Meat extends Food{}class Fruit extends Food{}class Apple extends Fruit{}class RedApple extends Apple{}class GreenApple extends Apple{}泛型通常用于容器,假如我们有一些箱子:可以装肉的箱子 new Box<Meat>();可以装水果的箱子 new Box&原创 2021-03-23 15:16:18 · 1492 阅读 · 0 评论 -
SQL注入防范
1. 尽量使用statementType="PREPARED",条件变量都用#{},有表名变量的话用${},一定要做好校验。2. limit #{}不能用来计算,用${}有风险,最好是在代码计算好start和end,再传入limit #{start},#{end}3. order by 不能用#{}选择列名,用${}有风险。4. 特殊字符建议用CDATA包住。5.like ‘%$name$% 建议写成 <![CDATA[ ANDname LIKECONCAT('%', #{na...原创 2021-03-11 19:24:39 · 127 阅读 · 0 评论 -
springboot profile
springboot 默认读取application.properties,其他配置文件需要自己在启动参数添加--spring.config.name=example// 类路径--spring.config.location=classpath:cong/example.properties// file目录 多个用逗号隔开--spring.config.location=classpath:cong/example.properties,file:E:/example.propert...原创 2021-03-01 17:26:00 · 94 阅读 · 0 评论 -
Spring autoConfig
假如要添加一个配置文件 example.properties 。里面放键值对:myconfig.example.hosts=192.168.1.1想在项目启动的时候读取它,并用于创建bean。首先要创建配置模型@Component// 这边会把配置文件中的myconfig.exmaple前缀的全带出来,自动组装成bean,使用前提是,这个类的属性和配置的名称能刚好对应上@ConfigurationProperties("myconfig.example")public class E原创 2021-03-01 17:24:32 · 463 阅读 · 0 评论 -
软件开发:QA、PMO、开发、测试岗位的思考
简单说,开发和测试是软件开发过程的工人。开发负责执行开发流程,对产生的质量问题负责。测试负责执行测试流程,对漏测的质量问题负责。QA负责监督流程开发、测试是否遵守流程的规范,对最终质量呈现负责。PMO则负责优化流程中的细节环节,引入新流程等,对效率和质量负责,实际上pmo也是最容易甩锅的岗位。但是很多公司的岗位都有越界。很多QA干着pmo的工作。鄙视链 PMO -> QA -> 测试 -> 开发。所以干啥不好,非要干毫无地位还辛苦的开发?...原创 2021-02-04 14:40:02 · 1450 阅读 · 0 评论 -
微服务日志:打印、定位、调用链traceId
在生产环境中,一般不用debug断点,日志是定位问题的非常重要的凭据。1. 打印日志需要关注的信息有接口日志:一般tomcat自带,请求外部日志:用于判断所依赖服务可用性,以及耗时。中间件日志:比如redis、dmq等。业务日志:用于记录业务流程中的关键信息。2. 日志工具业界比较常用的有log4jlogback。需要引入logback的jar包和相关配置。配置方法可以参考:https://www.liaoxuefeng.com/wiki/125259954834..原创 2021-02-03 15:50:05 · 1693 阅读 · 1 评论 -
Java gc优化
内存使用分析free -m 查看内存使用情况,最好没有swap,有最好禁用。jstat -gcutil <pid> 3s 3 重点是O(老年代)和FGCT\FGC,如果单次FGC时间很长,会影响服务可用。在我的服务器上,FGCT为3时,FGCT为0.7,O区内存使用51%。jmap -histo <pid> | head -n20 查看实例数,找到怀疑的对象,一般都是自己写的类jmap -histo:live <pid> | head -n10 触发一原创 2021-01-19 15:51:53 · 590 阅读 · 4 评论 -
常用命令: 用户管理
拿到机器,一般都会新建用户并创建home目录1. 添加组groupadd appusersuseradd -g appusers -m apppasswd appchmod -R 750 app2. jdkgroupadd jdkuseradd -g appusers -m jdkpasswd jdkchmod -R 750 jdksu - jdkwget https://download.oracle.com/otn/java/jdk/8u251-b08..原创 2021-01-14 19:48:51 · 122 阅读 · 1 评论 -
常用命令:磁盘操作
1. 磁盘操作磁盘中有几个概念:PV: 物理卷 LV:逻辑卷 VG:逻辑卷组通常在机器上新增一个磁盘后,会出现在/dev/ 目录下。可以使用lsblk、df -h等命令,查看磁盘和挂载关系。图中vda是一块磁盘,vda1是一个part,表示它是一个物理分区。这种是用fdisk命令可以创建。一般我们为了方便扩容,使用逻辑卷,为了能使用这块磁盘,需要做以下操作:1)pvcreate /dev/vdb2)vgextend sys /dev/vdb 这样这块磁盘就可以被用于sys这个原创 2021-01-14 19:25:20 · 516 阅读 · 0 评论