木之陽兮 卿云烂兮

0%

基于redis的分布式锁可以基于redis的set命令实现:

  • NX 当不存在时创建
  • EX 设置 n 秒後过期

删除操作需要借助eval命令的原子性 eval命令文档

if redis.call(‘get’, KEYS[1]) == ARGV[1] then return redis.call(‘del’, KEYS[1]) else return 0 end

通过对这段lua脚本求值,防止过期时误解锁

Read more »

  1. 启动服务时,无所谓使用sync还是await,执行时语句都是非阻塞的,那么它们的意义是什么?
    1
    server.bind().await().channel().closeFuture().sync(); //这么做的意义是什么

都是阻塞当前线程,等待直到前面任务所在的线程结束。异步操作失败时,sync会抛出异常,而await()不会抛出异常,调用closeFuture().sync()之后,线程才会阻塞在当前的位置

Read more »

读取文件流等操作中,通常通过 if err == io.EOF 判断文件流是否终止,此时退出循环。
通常文件中err == io.EOF时,此时读取的字节一般为0,但是在gzip.Reader中,读取到文件结尾时,err != nilread != 0,what…和python、java的习惯有点不一样啊,看样子在处理时不能遗漏最后一个读取出来的字节,所以还是把doSomeThing放到Read结束之后立即操作吧。

Read more »

Linux/MacOS中的xargs命令可以通过-P参数,利用机器的多核进行操作,堪称神器:

1
2
# 4个进程并行压缩文件夹下的所有文件
ls |xargs -I{} -P 4 gzip "{}"

当然xargs只能利用本机的资源,如果想同时利用多台计算机进行并行的操作时,就要用到 gnu/parallel了,安装paralle的方式:

  • mac brew install paralle
  • ubuntu sudo apt-get install parallel

通常地,xargsparallel的命令非常相似:

1
2
ls |xargs -I{} -P 4 gzip "{}"
ls |parallel -I{} -j4 gunzip "{}"
Read more »

ActiveMQ、RabbitMQ、Kafka等都是大家耳熟能详的消息队列,了解消息队列的原理,我们也可以尝试构建一个自己的消息队列。

从消息队列的功能上思考 - 生产者创建一条消息流,通过http或tcp协议传输到消息队列中;消息队列对数据流进行处理,在适当的时机发送给合适的消费者;消费者接收处理消息后,将处理结果反馈给消息队列服务。简而言之,消息队列作为中间人,为生产者和消费者架起数据流传输的桥梁,使生产者和消费者之间无需关注自己在和谁交换数据,整个过程都是异步的。

Read more »

南昌 -> 西宁 - 丽江 - 玉龙雪山 - 泸沽湖 - 大理 - 西双版纳 -> 南昌,我们五人13天,从西北到西南,
从青藏到云贵,抓着毕业的小尾巴,必须好好浪一波~

吸氧上瘾

Read more »

在最近的开发及原有方案的改良中,一个feture就是加快对GB级大文件的读取和计算MD5的速度。这是一个IO密集和CPU密集的耗时操作,
在无法硬性提高CPU的条件下,我考虑从IO上如何提高速率。

  1. 超大文件的MD5计算,需要分段将文件中的内存更新到MessageDigest中。(注:MessageDigest的实例不能共享,CSDN等博客上介绍MD5计算的demo,将MessageDigest设置为单例模式,单线程计算一个文件的MD5不会出错,多线程计算就会出问题了。)
  2. Java的NIO中提供了内存映射,通过将文件的一部分映射到内存中,可以一定程度地提高IO速率,从提高整体的效率。使用NIO的内存映射需要注意
    内存的释放(之前未释放内存,在100GB级的文件测试中,抛出了OOM错误)。
    Read more »

RX-* 系列的库是一款开源的并发流程控制的框架,有多种语言的实现[1]。用户可以通过它使用流式的编程风格,写出高可读性的并发流程控制代码。以下是针对RX-Java中,observable的各种变换(如map、flatmap)的内部实现的分析。

Read more »

从公司回来,到明天的毕业图像采集,差不多满满一个月了。

从南昌火车站下车,坐232回到麦庐,再从菊圃路口懒洋洋地走到学校后门,如此熟悉的小路,如此熟悉的灯光,也许后面的日子里,我能重复走过的次数屈指可数了。
麦庐后门
本来从北京回来时就想写一些东西,然而一直在折腾Linux环境之类的东西拖到了现在。这一个月里,脑海中频频地回荡着在京城的三个月时光。七月中旬到GeneDock实习,十月中旬返校,这期间经历了许许多多的事情,在学习、在心智、在眼界,都有不小的收获。

Read more »

volatile关键字: 使用volatile关键字修饰的的变量,总能“看到”任意线程对它最后的写入,即总能保证任意线程在读写volatile修饰的变量时,总是从内存中读取最新的值。以下是volatile在内存中的语义实现及同步的原理。

一:接触内存模型

Java中的实例、静态变量以及数组都存储在堆内存中,可在线程之间共享。而Java进程间通信由Java内存模型(JMM)控制,JMM可以决定共享变量的写入何时对另一个线程可见。(从JDK5开始,Java使用JSR-133内存模型,从该规定开始,即使是在32位的机器上,一个64位的double/long的读操作也必须满足原子性)

Read more »