掘友等级
获得徽章 0
#每天一个知识点# redis数据库主要由dict和expires两个字典构成,其中dict字典负责保存键值对,expires字典负责保存键的过期时间。因为数据库由字典构成,所以对数据库的操作都建立在字典操作之上。
#每天一个知识点# redis会在初始化服务器时,创建一万个字符串对象,包含0-9999的所有整数值。当服务器需要用到值为0到9999的字符串对象时,服务器就会使用这些共享对象,而不是新创建对象。
创建共享字符串对象的数量可以通过修改redis.h/REDIS_SHARED_INTEGERS常量来修改。
#每天一个知识点# redis所使用的的主要数据结构有:简单动态字符串、双端链表、字典、压缩列表、整数集合等。
redis基于这些数据结构创建了一个对象系统,这个系统包含:字符串对象、列表对象、哈希对象、集合对象和有序集合对象。每种对象都用到了至少一种数据结构。
redis可以针对不同使用场景,为对象设置多种不同数据结构实现,优化使用效率。
#每天一个知识点# 在redis中,压缩列表(ziplist)是一种为节约内存而开发的顺序型数据结构,被用作列表键和哈希键的底层实现之一。
压缩列表可以包含多个节点,每个节点可以保存一个字节数组或整数值。添加或删除节点,可能会引发连锁更新操作,但出现几率不高。
#每天一个知识点# redis使用的过期键删除策略是惰性删除加上定期删除,这两个策略相互配合,可以很好地在合理利用CPU时间和内存空间之间取得平衡。
#每天一个知识点# 跳跃表是redis有序集合的底层实现之一。Redis的跳跃表实现由zskiplist和zskiplistNode两个结构组成,其中zskiplist用于保存跳跃表信息(比如表头节点、表尾节点、长度),而zskiplistNode则用于表示跳跃表节点。
#每天一个知识点# Redis使用MurmurHash2算法来计算键的哈希值。MurmurHash算法最初由Austin Appleby于2008年发明,这种算法的优点在于,即使输入的键是有规律的,算法仍能给出一个很好的随机分布性,并且算法的计算速度也非常快。
#每天一个知识点# C语言使用长度为N+1的字符数组来表示长度为N的字符串,并且字符数组的最后一个元素总是空字符'\0'。
在redis的实现中,定义了SDS数据结构来实现动态字符串的存储,而不是C字符串。
SDS结构如下:
struct sdshdr {
//记录buf数组中已使用字节的数量
//等于SDS所保存字符串的长度
int len;
//记录buf数组中未使用字节的数量
int free;
//字节数组,用于保存字符串
char buf[];
};
SDS通过len实现了O(1)时间的数据长度查询。
通过free减少了修改字符串带来的内存重分配次数。
SDS是二进制安全的,可以保存文本或二进制数据,C字符串只能保存文本。
#每天一个知识点# 在高可用领域,CAP定理经常被提起。最早由加州大学伯克利分校的计算机科学家Eric Brewer 在2000年的ACM PODC大会上演讲时阐述。
在一个分布式系统中,当涉及到读写操作时,只能保证一致性、可用性、分区容错性三者中的两个,另一个必须被牺牲。
在CAP理论中,P是必须的。因此只能从AP和CP中进行抉择。zookeeper保证的是CP,注册中心eureka实现的是AP。
#每天一个知识点# 在V2EX上看到的一个很有意思的前端开源项目——一键给网页添加WebGL动态背景。作者的网站:
uvcanvas.com,有兴趣的jym可以给提提PR。
下一页