基于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脚本求值,防止过期时误解锁
基于redis的分布式锁可以基于redis的set
命令实现:
删除操作需要借助eval
命令的原子性 eval命令文档
if redis.call(‘get’, KEYS[1]) == ARGV[1] then return redis.call(‘del’, KEYS[1]) else return 0 end
通过对这段lua脚本求值,防止过期时误解锁
1 | server.bind().await().channel().closeFuture().sync(); //这么做的意义是什么 |
都是阻塞当前线程,等待直到前面任务所在的线程结束。异步操作失败时,sync会抛出异常,而await()不会抛出异常,调用closeFuture().sync()之后,线程才会阻塞在当前的位置
读取文件流等操作中,通常通过 if err == io.EOF
判断文件流是否终止,此时退出循环。
通常文件中err == io.EOF
时,此时读取的字节一般为0,但是在gzip.Reader
中,读取到文件结尾时,err != nil
且 read != 0
,what…和python、java的习惯有点不一样啊,看样子在处理时不能遗漏最后一个读取出来的字节,所以还是把doSomeThing放到Read
结束之后立即操作吧。
Linux/MacOS中的xargs
命令可以通过-P
参数,利用机器的多核进行操作,堪称神器:
1 | # 4个进程并行压缩文件夹下的所有文件 |
当然xargs
只能利用本机的资源,如果想同时利用多台计算机进行并行的操作时,就要用到 gnu/parallel
了,安装paralle的方式:
brew install paralle
sudo apt-get install parallel
通常地,xargs
和parallel
的命令非常相似:
1 | ls |xargs -I{} -P 4 gzip "{}" |
ActiveMQ、RabbitMQ、Kafka等都是大家耳熟能详的消息队列,了解消息队列的原理,我们也可以尝试构建一个自己的消息队列。
从消息队列的功能上思考 - 生产者创建一条消息流,通过http或tcp协议传输到消息队列中;消息队列对数据流进行处理,在适当的时机发送给合适的消费者;消费者接收处理消息后,将处理结果反馈给消息队列服务。简而言之,消息队列作为中间人,为生产者和消费者架起数据流传输的桥梁,使生产者和消费者之间无需关注自己在和谁交换数据,整个过程都是异步的。
南昌 -> 西宁 - 丽江 - 玉龙雪山 - 泸沽湖 - 大理 - 西双版纳 -> 南昌,我们五人13天,从西北到西南,
从青藏到云贵,抓着毕业的小尾巴,必须好好浪一波~
在最近的开发及原有方案的改良中,一个feture就是加快对GB级大文件的读取和计算MD5的速度。这是一个IO密集和CPU密集的耗时操作,
在无法硬性提高CPU的条件下,我考虑从IO上如何提高速率。
RX-* 系列的库是一款开源的并发流程控制的框架,有多种语言的实现[1]。用户可以通过它使用流式的编程风格,写出高可读性的并发流程控制代码。以下是针对RX-Java中,observable的各种变换(如map、flatmap)的内部实现的分析。
从公司回来,到明天的毕业图像采集,差不多满满一个月了。
从南昌火车站下车,坐232回到麦庐,再从菊圃路口懒洋洋地走到学校后门,如此熟悉的小路,如此熟悉的灯光,也许后面的日子里,我能重复走过的次数屈指可数了。
本来从北京回来时就想写一些东西,然而一直在折腾Linux环境之类的东西拖到了现在。这一个月里,脑海中频频地回荡着在京城的三个月时光。七月中旬到GeneDock实习,十月中旬返校,这期间经历了许许多多的事情,在学习、在心智、在眼界,都有不小的收获。