Scala提供了一种灵活的字符串插值机制,从而可以在字符串中嵌入表达式。一个常见的字符串插值场景是字符串拼接:

阅读更多

首先,我们来对比两个递归方法的求值步骤来看看递归函数应用。
假设有方法gcd,用来计算两个数的最大公约数。下面是欧几里得算法的实现:

阅读更多

Scala提供了if-else表达式来表达条件判断。和java中的if-else类似,但是适用于表达式而不是语句。例子:

1
def abs(x: Double) = if (x >=0) x else -x

阅读更多

虽然我们通常把Redis作为缓存中间件,但是Redis对数据库事务还是提供了简单的支持。数据库事务的目的是为了保证操作能够原子的完成,不同事务之间的操作能够保证数据的一致性,事务之间相互隔离,且提交了的数据库操作能够持久生效,也就是我们常说的数据库ACID特性。那么Redis的事务是否满足我们常说的ACID特性呢?

阅读更多

现代计算机为了提高主存访问速度,通常会有多级缓存。CPU不直接读写主存,而是对L1/L2/L3缓存进行读写。为了提高效率,缓存加载并不是一次一个字节,而是一次加载一个缓存行大小的数据到缓存。如果CPU对缓存行的数据进行了修改,就需要将缓存行写回主存。

由于现代计算机的处理器通常不止一个核,那么如果不同的核心对同一个缓存行进行频繁的读写,就可能存在缓存行频繁的加载和写回主存,造成的后果就是缓存行频繁失效,每次操作都需要重新加载缓存行。而缓存命中和缓存miss情况下CPU耗费的时间是有较大差距的,这种情况下通常会导致吞吐量降低。这种情况我们称为伪共享。

阅读更多

Redis通常用来作为缓存服务器,其数据全部保存在内存里面。但是,是机器就会存在宕机的情况,一旦宕机,所有的内存数据就全部丢失了。因此,必须有一种机制来保证Redis的数据能能被持久化,以便在宕机时降低损失。

Redis为我们提供了两种持久化的策略,RDB和AOF。RDB是一种全量备份机制,其备份得到的是二进制内容,结构上十分紧凑;而AOF则是一种通过增量日志实现持续备份的机制,AOF记录的是对内存数据中进行了修改的操作指令,存储的文本内容。

阅读更多

缓存是提高性能一种有效手段,从处理器的L1,L2,L3缓存,到各种内存缓存,再到分布式缓存、CDN等,无不是通过增加缓存层,提高数据访问的速度。然而缓存是宝贵的,也是稀有的,必然涉及缓存满了,需要淘汰部分内容的问题。LRU(Least Recently Used), 是其中较为经典的一种算法,翻译过来就是最近最少使用策略。

阅读更多

skiplist是William Pugh提出的一种基于概率统计链表结构,优化了普通链表的查询性能,是一种典型的空间换时间的算法。skiplist处理的情况是有序链表,里面的节点是排序好的,skiplist能够高效的查找元素,因为他能够跳过大部分的节点,直接定位到要找的节点附近。

阅读更多

Redis中有5个基本的数据结构,string(字符串),list(链表),hash(哈希),set(集合)以及zset(有序集合),本文对每个类型进行简单的介绍,并给出一些常用的使用命令。

阅读更多

ParNew是一个比较常用的年轻代垃圾回收期,采用复制算法进行回收。一般ParNew不会占用很高的CPU,之前遇到过的ParNew高CPU的情况也是内存分配很快导致的,这种情况下ParNew的表现是ParNew回收很频繁,单次回收很快。而这次要说的这个情况不是这样,他的GC频率不会太高,但是单次GC花费很长的CPU时间,导致的结果就是服务器CPU使用率打满,这个服务性能降级,负载分担到其他节点。不幸的是,这个症状一段时间后’传染’到其他节点,整个集群的节点一个接一个的跑满CPU,形成一种雪崩效应。

阅读更多

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×