Skip to content

Instantly share code, notes, and snippets.

@arrayadd
arrayadd / hash1.md
Last active August 3, 2021 06:30
到底什么是哈希Hash(1)

刚在吃饭回来的路上,走路时候闲的蛋疼,问了下自己什么是哈希?结果一下给自己搞蒙了。仔细想想工作中每天都在与这个叫哈希的家伙打交道,不是HashMap,就是MD5,SHA1的,但你若问我什么是哈希的,我压根就回答不上了来,或者说给一个确切的解释。直观感觉就是,不是中文“传统”词语,读起来就别扭,很难通过词来达意。


先找定义

从网上搜了下“哈希”,发现没有直接关于“哈希”这个词的解释,都是周边相关的,例如,哈希函数,哈希算法,散列函数,哈希表什么的。 初步给人感觉这个词语极有可能是一类东西的统称,就像水果,汽车这样词语。

后来又google了英文hash [hæʃ] 发现维基百科中关于hash在计算机方面的解释,也是罗列了一些哈希函数,哈希表这样相关词语。

@arrayadd
arrayadd / jobs.md
Last active April 14, 2021 08:47
【Linux】让任务后台运行

平时我们用CRT,或者Xshell 连接到Linux服务器上执行一些命令操作,执行完成后,关闭窗口完事。但有些场景下,例如,启动一个java程序,而这个程序会每隔1分钟执行一些任务。如果我们用类似命令:

[root@test ~]# java -jar ./test.jar

但这样做有个问题,如果我们关闭终端,这个java进程也会随着退出。


让程序后台运行

linux下有个命令nohup可以让程序后台运行,即使是我们退出了终端,它也会持续运行。

@arrayadd
arrayadd / fenpei.md
Created August 2, 2017 12:52
分配担保意义

我们知道HotSpot虚拟机把堆空间(内存上可以是不连续的)分成不同区域,来进行所谓分代收集。 其中又根据来自IBM一些数据研究结果,把一些朝生夕死的短命鬼划分到年轻代,其他一些老不死的放到老年代。 当年轻代存不下新分配对象时候,就会触发所谓的Minor GC,进而引发老年代和新生代之间的分配担保机制

关于分配担保机制的详细过程,网上充栋,这里就不说了,但更有意思是,这种机制不需要可以吗?使用了它又有什么意义?实际工作场景中有没有可以参考的。


为什么需要是连续的空间

分配担保机制中,无论是新生代所有对象总和还是历次晋升到老年代的平均大小的经验值,在进行比较时候都会和老年代最大连续空间进行比较。 难道不连续只要凑起来够就不行了?毕竟老年代还是**标记-清理-(压缩)**算法。

@arrayadd
arrayadd / cron.md
Last active November 1, 2018 05:50
【Linux】cron表达式的小坑

今天遇到个坑,因为凌晨要执行个脚本,把一些数据从一个表清洗到另一个表。结果写好脚本,线下服务器测试crontab定时任务的时候,到时间死活就是不执行。后来找同事看了下,才发现

Linux 下的crond服务,所用的cron表达式,只能精确到分,而通常项目中,例如spring,quartz 是可以精确到秒的。

结果我复制的项目中平时运行好好的的cron表达式,自然无法定时执行。


Linux下cron表达式格式

cron有两个配置文件,一个是全局配置文件(/etc/crontab),是针对系统任务的;一组是crontab命令生成的配置文件(/var/spool/cron/用户名 下的文件),是针对某个用户的. 通常都用/var/spool/cron下的。

@arrayadd
arrayadd / consistenghash.md
Last active April 27, 2018 10:51
一致性hash 一致在哪里?

关于一致性哈希算法的介绍,网上挺多的,图文并茂,易懂详细,例如:一致性哈希算法与Java实现


一些注意点

  • key的哈希及服务集群节点的哈希应该用同一个哈希函数。尽管理论上可以用不同函数,只需要保证这两个hash函数的哈希值范围及均匀性相近就行,但实际中完全没理由这么做,除非想没事找事,脱裤子放屁..
  • 每个节点的可虚拟节点数,及总的虚拟节点数,应该有已被实践过的参考范围,而不应该是越多越好。同时,随着实际节点数的变化,对应的总的虚拟节点数也应该是动态的。而不是线性的。
  • 实际开发中难点还有一处,就是如何有效的发现集群中节点的变化,也就是动态的删除,增加节点。
@arrayadd
arrayadd / KiB.md
Last active September 13, 2017 17:08
搞清楚KiB,KB,bps

KiB

Kibibyte是一种资讯计量单位,代表1024字节,即2^10字节,一般简称为KiB。Kibibyte是来自英文 kilo binary byte 的缩写,意思为“千位二进制字节”。 与其他储存单位的换算[编辑] 1KiB = 1024B 1MiB = 1024KiB


###KB KB 千字节 (Kilobyte),常写作kB, KB或K,是一种资讯计量单位,现今通常在标示内存等具有一般容量的储存媒介之储存容量时使用,像硬盘,U盘。根据SI标准,1kB=1000B(字节, Byte)。

@arrayadd
arrayadd / JVM-PCR.md
Last active August 20, 2017 16:29
【JVM】程序计数器为什么是线程私有的?

我们知道,JVM运行时数据区域中有一个线程私有的区域Program Counter Register,姑且翻译为程序计数器。 当然也有翻译为 PC寄存器的。以下简称PCR. 我们知道在计算机的CPU中有两个专有的寄存器

  • 指令寄存器,用于存储正在执行的指令
  • 程序计数器,其存储的是下一个等待执行的指令地址。

在JVM中,这两个专有寄存器功能应该是融合的(没考证,推测的,但不影响理解其功能)


@arrayadd
arrayadd / final.md
Last active August 20, 2017 16:04
一个java中的无奈实现

作为一个大部分时间都在使用java的工程师,final这个关键字几乎无时无刻都能在代码里面看到,尤其是在使用多线程内部类的时候,一部分时间都在处理变量中的final问题。非常烦人,可一旦按照正常习惯去掉final,IDE中又常常会提示红色下划线错误,为什么匿名内部类使用其所在方法的局部变量式需要额外添加final关键字?


示例代码

public void doWork(){
        final int num=12;//基本数据类型
        final List<String> list=new ArrayList();//引用数据类型

 new Thread() {
@arrayadd
arrayadd / log4j.md
Last active July 20, 2017 17:01
从log4j日志升级想到

这几天在对自己业务组的十几个模块进行日志升级,从log4j1 升级到log4j2. 在实施的过程中遇到各种各样的问题,其中有个问题特别突出,导致好几个项目没法升级。

首先说下背景,我们这些模块只是集团一个小业务线中的子模块,除业务部分外代码需要自己编码外,项目中其他部分代码从框架,数据库,公共组件都是使用集团统一所谓的自研框架,例如有个叫XYRedis组件,XY是公司名字,其只不过是把redis的大部分代码copy过来,连包名都不改,套了个maven壳子。经常出一些莫名其妙的问题,一看日志,不对啊,jedis官方怎么会犯这样低级错误。总之,东施效颦一般。

就说这次日志升级中最令人发指的部分,这些公共组件,有好些个居然使用的日志框架是log4j 而不是 SLF4J, 导致我们项目没法从log4j1 升级到log4j2 (两者配置文件格式不兼容),一启动项目就包错,找不到合法的日志配置文件,一查原来是依赖的公共组件要用到旧的配置文件,奔溃。


@arrayadd
arrayadd / random.md
Last active July 4, 2017 17:00
记一个需求开发的思维过程

昨天临下班的时候,意外接到一个叫**「我的足迹」**的需求,大意就是把用户访问过的商品记录下来,方便用户以后查看。


重审需求是否合理

从用户使用层面,上面这个需求提供的功能,或多或少有和我的收藏功能重叠嫌疑。但作为开发有质疑需求的意识还是非常必要的,尤其是做应用开发的,绝对不能PM给个需求就急着开发,时常驳回一些拍脑袋的需求还是必修的。养成这个意思非常重要。 当然关于这个需求,PM还提出了以下一些要求:

  • 每个用户只保留最近100条浏览记录
  • 不能重复,同一个商品浏览多次,算最近一次时间。