周末花了两个下午,把之前买的一本书看完了。书名叫做《Redis深度历险:核心原理与应用实践》。书很薄,正文只有230页,全彩印刷,定价79,买的时候有打折,50多块。

全书内容

全书分为5篇,分别是基础和应用篇、原理篇、集群篇、拓展篇和源码篇。

基础应用篇

基础和应用篇,讲了下 Redis 的基础功能,以及 Redis 原生支持的一些功能。读的时候,这一篇原本是想略过的,以为就是要写 Redis 的各种命令的使用。 实际上也确实是讲了各种命令,但是还讲了一些我原本并不了解的功能。这一篇的内容,大致可以分为两种,一是内置的命令以及应用,比如 HyperLogLog、Bitmap等;二是一些功能如何使用 Redis 实现,书中讲了分布式锁、延时队列、限流等。

HyperLogLog

书中给 HyperLogLog 举的以一个应用例子是记录一个网页的UV。计算 uv,需要对不同的用户进行去重,一个很直接的想法就是用一个 set 记录所有访问过的用户。这个方法的问题在于,如果用户数过多,占用的空间会非常大。而 HyperLogLog 可以用很少的空间,完成同样的工作,代价则是计数有误差,大概在 0.81%。Redis 的实现里,这个很少的空间是 12KB,与用户的数目无关。

HyperLogLog 是基于概率基数统计算法。其基本思想是,一个二进制串的集合中,所有元素的第一个为 1 的比特的位置 k,与集合的基数 n 之间,存在n = 2^k 的数学关系,当然,是约等于,并且误差比较大。因此实现上,会进行分桶,用调和平均数减小误差。Redis 的实现里,会使用 2^14 = 16384 个桶。

书中对 HyperLogLog 只讲了大概,背后涉及的伯努利实验以及概率都没有讲,可以自己 google,网上还是有不少文章的。

原理篇

原理篇讲了一些 Redis 的一些功能的基本原理吧。说了下 IO 模型、通信协议、管道、事务等。因为我本身对 Redis 不是很了解,所以对我而言,这一篇还是学到了一些东西,对 Redis 的一些功能的实现有了点了解。但我还是要说,这一篇的内容不够深入,这也是整本书的风格,内容不够深入。

集群篇

集群篇讲了主从、Sentinel、Codis 以及 Redis Clster。看完可以对这几点内容都有些了解,大面上可以了解 Codis 和 Redis Cluster 区别以及不同的技术选型。比如,Codis 有 zk 保存槽位信息,通过 proxy 访问实例;Redis Cluster 去中心化,实例间通过 Gossip 交互,客户端可以直接访问实例,速度更好。这些了解,在使用中可能也够了。不过,这一篇没有深入实现细节。

拓展篇

拓展篇讲了 Redis 5.0 的 Stream,又讲了 Info 命令。然后是过期策略、懒惰删除等。甚至还有如何用 Jedis 以及用 Spiped 来安全传输。总之,这一篇讲的比较杂,设计了 Redis 内置的命令,也有 Redis 的原理以及实现考量,又有如何使用 Redis 的库。算是在源码篇之前,又不适合放到其他篇的一些内容吧。

源码篇

源码篇,顾名思义,是讲源码的。这一篇的源码,主要是关于 Redis 的数据结构的,比如字符串、hash、list、zset等等。这一篇,可以很明显的感觉到,Redis 实现过程中,对于内存的斤斤计较,以及单线程下对于 CPU 占用时长的考量。

总结

整本书看下来,收获不算小,对 Redis 也有了更多的了解。书的语言也是比较通俗易懂,图解也是很清楚的。看得比较顺畅。缺点呢,也有一些。前边也说过,内容讲得不够深入,偏浅。这一点可能也是因为 Redis 的东西本来就不多吧,很多内容应该可以在网上找到的。还有就是,有些地方是可以不用代码的。比如在讲 HyperLogLog 时,为了说明 n 和 k 关系,贴了两段用于实验的代码,Java 和 Python 各一版。说实话,这些完全没有必要,并没有比用文字更清晰,也和讲解的内容关系不大,有点像是凑篇幅一样。如果作者认为确实很重要,可以放到附录里。此外,书中的一些代码的排版是有问题的,尤其原本 Redis 里的注释。源码的注释,在打印到书里,由于太长,会换行,但是换行还不多。比如这样,

    /* If we reached the 1:1 ratio, and we are allowed to resize
the hash
     * table (global setting) or we should avoid it but the ratio
between
     * elemenets/buckets .....
     */ 

真的很影响阅读体验,并且浪费纸。

总体而言,给7分吧。