Redis 中的烂设计
in redis with 0 comment

Redis 中的烂设计

in redis with 0 comment

前情提要:Redis 最佳设计 Top 9

Redis 是一个非常优秀的数据库,既然有好设计,那有没有不合理的设计呢?

答案当然是有的,本文章并不是打算批评设计的如何如何,而且许多设计放在当时可能是合理的,也可能因为背了历史负担导致原有的不合理设计难以改动,文章单纯属图一乐。

ziplist

ziplist 会出现联级更新问题,后续开发出了新的 listpack 来替代,相比新的 listpack:

但是由于出现联级更新的可能性实在是太小了,而且新数据结构节省的空间并没有那么明显,如果把现有的 ziplist 替换成 listpack 风险太大了,所以只在 stream 里用到了。

PS:看起来已经弃用了,在 Redis 7.0 中,加载旧的 RDB 格式时会动态的把 ziplist 编码的 key 转换为 listpacks。

RESP

RESP 是 Redis 的通信协议,和 HTTP 一样都是文本协议,协议以 \r\n 结尾。

RESP 的优点:

可以看得出来优点其实都是站在 Redis 开发者角度的,对于用户其实没有这么关系这些点。可能是因为作者一开始感觉这样就够用了,如果可以重新设计估计会也会给改成二进制协议(你看隔壁 HTTP 2.0 就是二进制的了)。

位图操作

可能是我没 get 到那个点,无法理解为什么 set 是以字节为单位操作的,但是获取的时候需要通过字节的索引来获取。bitcount 的设计确实令人不解,至少应该提供可选的按照 bit 为 index 的命令。如果有懂哥可以给我科普一下。

select db

这个设计毫无意义,不仅集群只支持 db0,而且在使用过程中非常容易切错数据库导致数据写入出问题。

连作者都认为这个是个烂设计了,只不过因为历史原因有人已经在用了不好做改动。希望后续能删除这个功能吧。