redis设计与实现是什么?redis设计与实现

TheDisguiser 2020-03-26 20:42:29 java常见问答 3795

Redis相信程序员小伙伴们知道吧,Redis,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。最近有幸拜读了一本名为redis设计与实现的书,觉得非常有趣,今天就给大家介绍介绍这本书。

《Redis设计与实现》是2014年出版的图书,作者是黄健宏老师。这本书详细讲解了Redis的内部机制与实现方式,并且对Redis的大多数单机功能以及所有多机功能的实现原理进行了介绍,除了给出大量参考信息外,还展示了这些功能的核心数据结构以及关键的算法思想。是一本不可多得的好书。通过阅读此书, 读者可以快速、有效地了解 Redis 的内部构造以及运作机制, 从而学会如何更高效地使用 Redis 。

《Redis设计与实现》目录结构

全书主要分为四个大部分:

1. 数据结构与对象

2. 单机数据库的实现

3. 多机数据库的实现

4. 独立功能的实现

首先是介绍数据结构以及数据结构组成的redis的基础的数据对象。数据对象一般在初级应用的阶段,大部分人都会有涉及到一些,知道redis能存储的数据对象类型有5种:string,list,map,set,zset。这一部分讲解的就是在string,list,map,set,zset这5个对象底层的基本数据结构是哪些,数据结构的实现原理是什么,并简单讲解了在redis内部机制中数据对象是如何共享,如何回收的(这里有一个常见的知识点:引用计数算法,给一个对象中添加一个引用计数器,初始为1,每当有一个地方引用他时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象都不再被继续使用,你会在很多软件的对象回收机制中看到这个算法,比如jvm对象回收的早期模式,现在已经用可达性分析算法了,比如redis的对象回收)。如果对数据结构不感兴趣的同学其实可以先跳过这一部分,但是个人建议数据结构最后都是要捡回起来的东西,现在不学,等你水平到了能自己开始编写中间件的时候,还是得学习,博主在数据结构方面也是菜鸟,深受其害。除了基础的string,list,map,set,zset5种数据结构之外,还有两种特殊的数据结构,分别是Bitmaps,HyperLogLog和GEO。由于string,list,map,set这几类数据结构在正常的工作中经常会接触到,我们主要针对zset,GEO,Bitmaps,HyperLogLog4种数据结构进行分析。

Bitmaps

Bitmaps不是一种数据结构,是只有二进制数字的字符串,可以理解为二进制位的数组,比如:“0101001” ,可以理解为[0,1,0,1,0,0,1], 数组下标在这里称为偏移量(可以理解为内存的那个偏移量)从0开始递增;

Bitmaps最大的优点是内存占用小,只要业务设计上是合理的,可以充分利用每一位;

Bitmaps的位操作:

特定bit位的操作,比如设置/获取某个特定比特位的值,setbit key1 10 1 ,意思就是设置key1对应的Bitmaps的第10位为1; 0010000000经过setbit key1 10 1后就变成了0010000001。同理getbit key1 10;

bitcount key start end: 获取范围内,bitmaps有多少位为1的位数量;

bitop 位运算,bitop and|or|not|xor key_result [key1,key2,key3…], 比如bittop and keyres key1 key2,

keyres 就是key1和key2进行位运算and后的结果;

bitpos key 1 计算出bitmaps中第一个值为1的偏移量

单个bitmaps的最大长度是512MB,即2的32次方个比特位,简单来说就是字符串的最大长度可以到4294967296。

HyperLogLog

HyperLogLog也不是一种新的数据结构,也是字符串结构…不知道存的是啥玩意,应该也是二进制的字符串(不确定)。每个HyperLogLog最大只需要12kb内存,就能计算接近2^64个不同的数据;

HyperLogLog是对存入的数据进行基数计数:常用来统计一个集合中不重复的元素个数。

HyperLogLog操作命令:

pfadd key keyall v1 v2 v3,向keyall中添加3个元素

pfcount keyall, 统计keyall的不重复的元素总数,3.1中是3个

pfmerge destkey sourcekey1 sourcekey2 求多个HyperLogLog的并集并赋值给destkey

特色介绍

本书的特色是:

1.带有丰富的图示和表格, 帮助读者更好地理解书中的知识点。

2.关注功能的高层设计思路而不是底层的实现代码, 让读者无须花时间研读代码就可以了解到 Redis 的内部实现。

3.提供带有中文注释的 Redis 源码, 帮助有需要的读者做进一步的学习。

这就是今天的内容了,更多相关内容请持续关注本网站。