<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[frwcode的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/frwcode</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; frwcode]]></copyright><item><title><![CDATA[在IDEA使用arthas实现jar包方法耗时统计]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/143625331</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/143625331</guid><author>frwcode</author><pubDate>Fri, 08 Nov 2024 14:30:43 +0800</pubDate><description><![CDATA[统计jar包函数执行耗时]]></description><category></category></item><item><title><![CDATA[正数正则表达式]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/137865550</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/137865550</guid><author>frwcode</author><pubDate>Wed, 17 Apr 2024 11:19:04 +0800</pubDate><description><![CDATA[正数（排除0的情况）正则表达式：]]></description><category></category></item><item><title><![CDATA[zookeeper的一些笔记]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/122859984</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/122859984</guid><author>frwcode</author><pubDate>Thu, 10 Feb 2022 16:56:31 +0800</pubDate><description><![CDATA[个人对zookeeper的一些笔记]]></description><category></category></item><item><title><![CDATA[durid多数据源配置不同validation-query]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/117434602</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/117434602</guid><author>frwcode</author><pubDate>Tue, 01 Jun 2021 09:13:53 +0800</pubDate><description><![CDATA[之前在网上也能看到很多关于多数据源的配置方式，但是大多都是同种数据库，针对不同数据库类型的资料较少，最近项目需要一个模块同时连接sqlserver、impala和Oracle，在durid中配置
]]></description><category></category></item><item><title><![CDATA[关于事件触发的小计]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/116033097</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/116033097</guid><author>frwcode</author><pubDate>Thu, 22 Apr 2021 21:32:34 +0800</pubDate><description><![CDATA[业务场景：

1.根据用户操作触发相应的逻辑；

2.事件有操作类型，比如说开户、入金、交易满额、拉新等等；

3.通过配置相应的活动及活动的奖励，在条件满足条件下发送奖励



首先事件的接收肯定是通过MQ，而MQ中必须要有操作的类型code，上下游是统一的。

而code就是用户的操作类型，比如说入金。那么就进入入金Handler

那么入金在哪些活动中有配置奖励是可以配置、编码确定的。

活动也是有类型的，同时可能存在多个同种类型的活动，此时就可以采用取第一个满足条件的活动进行发送奖励。

另外活动.]]></description><category></category></item><item><title><![CDATA[redis和rabbitmq的随笔]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/115981466</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/115981466</guid><author>frwcode</author><pubDate>Wed, 21 Apr 2021 22:16:48 +0800</pubDate><description><![CDATA[1.关于redis分布式锁的一些认识
redis做分布式锁是面试中经常问到的问题，而之前参与的项目关于这点，使用的都比较捡漏，最近看了一个项目中的使用，有一些认知，记录下来。
set操作保存uuid
为什么需要保存一个UUID，并且还需要记录？
这是因为在加锁时，一般都是根据用户ID或是其他的ID值，并且这个key还需要追加相应加锁业务前后缀。在线程A获取锁情况下，可能由于业务耗时超过了redis配置的过期时间，而其他的线程B也需要用到这个锁，此时set了值，线程B获取了锁，而之后线程A本意是将他自己的锁释]]></description><category></category></item><item><title><![CDATA[面试题]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/115358676</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/115358676</guid><author>frwcode</author><pubDate>Wed, 31 Mar 2021 19:50:55 +0800</pubDate><description><![CDATA[1.HashMap在多线程情况下，可能出现问题的环境有哪些？
HashMap是数组+单向链表/红黑树的结构，在2处可能出现问题。
①在对一个数组位置上为空新增一个节点时，若多线程同时tab[i] = new Node()，则其他线程操作的数据将会丢失。
②在扩容阶段，对链表进行扩容时，因是采用node.next()方式获取下个元素，多线程情况下可能出现死循环。
2.ConcurrentHashMap是如何解决上面的问题的？
①针对数据位置上为空，多线程同时新增的问题，采用CAS（乐观锁）的方式新增元素，若失]]></description><category></category></item><item><title><![CDATA[redis tips]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/115335144</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/115335144</guid><author>frwcode</author><pubDate>Tue, 30 Mar 2021 20:49:20 +0800</pubDate><description><![CDATA[Redis在4.0版本后针对大键（一个上百万对象的SET），在删除过程中，之前版本因读写单线程，此时删除耗时较多，影响其他线程使用，因此在清除数据时，首先预估耗时，达到阈值后使用lazy free方式，直接将该键数据置位无效，交给异步线程进行清除。因此也是修改了底层的数据结构。

redis的回收策略：

1、键过期了并不会立刻回收，redis会有定时任务检查过期的数据进行删除，在客户端访问这个过期数据时，也会触发键的删除操作

2、当配置的内存满了，redis默认策略是不接受写操作，返回错误信息，接收读操]]></description><category></category></item><item><title><![CDATA[Go的defer执行逻辑]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/114693795</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/114693795</guid><author>frwcode</author><pubDate>Fri, 12 Mar 2021 13:47:13 +0800</pubDate><description><![CDATA[Go中的defer可以类比java中的finally关键字，在出现异常或是方法执行完成后执行。
package main

import "fmt"

func main() {
	fmt.Println("外层开始")
	defer func() {
		fmt.Println("外层准备recover")
		if err := recover(); err != nil {
			fmt.Printf("%#v-%#v\n", "外层", err)
		} else {
			fmt.Println(]]></description><category></category></item><item><title><![CDATA[Golang中的零值]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/114656660</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/114656660</guid><author>frwcode</author><pubDate>Thu, 11 Mar 2021 11:16:04 +0800</pubDate><description><![CDATA[Go的零值也就是默认值，与java中不同的是string是基础类型，零值是空字符串，而不是nil
有时候在go语言中看到的并不就是原始的状态，go对于nil在fmt输出时会做处理，又是看着是空数组，其实是nil
其他可以类比对象的有指针类型、切片（不是数组）、map的零值是nil，但是在fmt直接输出时却不是nil

...]]></description><category></category></item><item><title><![CDATA[oom-killer]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/114576137</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/114576137</guid><author>frwcode</author><pubDate>Tue, 09 Mar 2021 10:11:00 +0800</pubDate><description><![CDATA[发现部署的服务莫名挂掉了，并没有溢出dump文件及错误日志，通过万能搜索引擎帮助，在/var/log/message下查找被谁干掉了。


thread1 invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
....
Mar  8 10:40:12 localhost kernel: Out of memory: Kill process 17946 (java) score 184 or sacrifice child
Mar  8]]></description><category></category></item><item><title><![CDATA[缓存击穿和缓存穿透的区别]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/114575932</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/114575932</guid><author>frwcode</author><pubDate>Tue, 09 Mar 2021 09:49:57 +0800</pubDate><description><![CDATA[关于缓存的常问概念，缓存穿透、缓存击穿的区别点在于：穿透指查询的key在缓存及数据库中并不存在，常指恶意攻击；而缓存击穿是指之前存在key的缓存，单过期了，因此去数据库中查询。



穿透 --》 数据库和redis都不存在

击穿 --》 redis中的失效了，需要取数据库中查询
...]]></description><category></category></item><item><title><![CDATA[Hystrix的资源隔离]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/114176610</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/114176610</guid><author>frwcode</author><pubDate>Sat, 27 Feb 2021 15:33:07 +0800</pubDate><description><![CDATA[Hystrix为避免因调用单个服务耗用连接多，造成调用其他服务的不可用情况，提供了线程隔离的功能。

有2种模式：

1、线程池


使用线程池的方式控制访问某个资源的线程数，对于超出此线程池核心线程数的请求，放置在队列中。
feign调用过程中，若开启了Hystrix熔断，则feign调用接口将是经过代理的Hystrix类。
对于每个feign client都会在服务启动时，创建名称为该应用名的线程池，默认10个核心线程数。

2、信号量


信号量这个并不是Hystrix特有的，在网关中也存在这个概念。]]></description><category></category></item><item><title><![CDATA[mysql中rowid的理解]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/114166253</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/114166253</guid><author>frwcode</author><pubDate>Sat, 27 Feb 2021 13:15:45 +0800</pubDate><description><![CDATA[主要记录下mysql中的rowid的理解。

MySQL中也是存在rowid的概念，名字叫 _rowid ，是一个非空唯一列的别名，不同情况下指向的不同列，并且存在rowid不存在的情况。

存在rowid

①当表存在integer类型的单字段主键，_rowid指向的就是当前主键字段

②表不存在主键，但是有integer类型的唯一性单字段索引，_rowid指向的就是当前该字段。



不存在rowid

①表的主键是联合主键，多个主键字段。

②表主键是单字段，但是是字符串类型。

③表不存在主键，但.]]></description><category></category></item><item><title><![CDATA[oracle中的rowid和rownum理解]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/114165598</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/114165598</guid><author>frwcode</author><pubDate>Sat, 27 Feb 2021 11:14:15 +0800</pubDate><description><![CDATA[rownum

Oracle分页查询相较于mysql来说要繁琐得多，需要配合rownum实现。

而为什么需要先获取小于某个值的数据后，再获取大于某个值的结果？

是因为rownum是一个逻辑伪列，并不会真实存在，每次生成都是在先生成列表数据后，新增rownum这一列，并且从1开始。

那么按照以下方式分页查询第二页数据的SQL


select * from user_info where rownom &gt; 10;

在获取结果集后，此时生成伪列ROWNUM，值从1开始，此时不满足大于10的要求，因]]></description><category></category></item><item><title><![CDATA[spring配置文件加载顺序]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/112913156</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/112913156</guid><author>frwcode</author><pubDate>Wed, 20 Jan 2021 23:01:03 +0800</pubDate><description><![CDATA[首先config中的优先级高于config外resource下的，也就是在environment中的PropertySource元素排在前面。

而在springboot项目中，加载application文件，在springcloud项目中，application和bootstrap都可以加载，但是application的优先级更高。
...]]></description><category></category></item><item><title><![CDATA[oracle与mysql 区别小记]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/112789299</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/112789299</guid><author>frwcode</author><pubDate>Mon, 18 Jan 2021 17:21:15 +0800</pubDate><description><![CDATA[Oracle相较于MySQL数据库来说，规范更严格，MySQL内涵的隐式转换在Oracle来说是不安全、不允许的。

今天主要记录下Oracle和mysql中数值类型的定义区别

Oracle中的number(3)和mysql中的int(3)的区别：

Oracle中，指定了精度，那么整数位就只能有3位，超出报错

而MySQL中并不会报错，从使用上来说int(3)和int(6)没有区别。
...]]></description><category></category></item><item><title><![CDATA[数据库重建索引的一个思路]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/112788132</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/112788132</guid><author>frwcode</author><pubDate>Mon, 18 Jan 2021 16:43:03 +0800</pubDate><description><![CDATA[最近需求涉及到一个保存实时数据的功能，使用Oracle数据库。

保存的数据量不大，但是覆盖会比较频繁。

造成了一个就几万数据的表，序列可能都达到千万了。

这个在Oracle环境下其实还好，但是需要兼容pgsql环境，使用了serial自增序列，最大21亿，因此了解了下关于重置序列的方式。



方案一：

先drop再create

优点：简单

缺点：在服务运行过程中执行存在风险



方案二：

利用负数步长将序列值减小，再恢复步长为1



此次使用方案二在程序中定期重置序列

存储过程样...]]></description><category></category></item><item><title><![CDATA[java使用freemarker导出word（xlsx格式，含图表）]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/112671021</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/112671021</guid><author>frwcode</author><pubDate>Fri, 15 Jan 2021 15:39:29 +0800</pubDate><description><![CDATA[使用java程序导出word，此次使用的是模板值替换方式，而导出的word版本是xlsx。

直接替换文本和图片，可以直接使用一个word改造的ftl模板，替换启用的参数即可，但是对于图表就比较麻烦。

也参照了很多大佬的做法，针对xlsx07版本，主要是将xlsx文件解压，得到很多xml文件，其中文字内容是在document.xml中，如果要替换文本内容，将xml中参数使用freemarker替换即可。

如果是图片，则按照图片的先后顺序，保存在word/media/下，以image1.png这个格式开头]]></description><category></category></item><item><title><![CDATA[MongoDB备份与恢复]]></title><link>https://blog.youkuaiyun.com/frwcode/article/details/109722128</link><guid>https://blog.youkuaiyun.com/frwcode/article/details/109722128</guid><author>frwcode</author><pubDate>Mon, 16 Nov 2020 15:22:47 +0800</pubDate><description><![CDATA[# 备份，预先创建保存路径/data/mongo/mongo/backup，dataqulity是需要备份的数据库名称
./mongodump -h 192.168.118.128:27017 -d dataqulity -o /data/mongo/mongo/backup

#恢复 /data/mongo/mongo/backup/dataqulity/是上一步备份文件存放路径，主要要深入一层
./mongorestore -h 192.168.118.128:27017 -d dataqulity -]]></description><category></category></item></channel></rss>