Redis总结

数据结构:

SDS(简单动态字符串):

    1.杜绝缓冲区溢出

    2.减少修改字符串长度时所需的内存分配次数

    3.二进制安全

    4.兼容部分C字符串函数

链表:

    平平无奇的链表实现

dict(字典):

    1.使用MurmurHash算法来计算键的hash的哈希值

    2.哈希表使用链地址法来解决键冲突,被分配到同一个索引上的多个键值对会连接成一个单向链表(被分配到同一个索引上的键值对使用next指针将现有的和已存在的连接在一起,新添加的总是排在已有节点的前面)

    3.在对哈希表进行扩展或收缩时,程序将现有的哈希表包含的键值对rehash到新的哈希表里面,这个rehash过程并不是一次性完成的而是采用渐进式

skiplist(跳跃表)

    1.skiplist是一种随机化的数据结构底层是个双向有序链表,大多数情况下,插入、删除、查找的复杂度均为O(logN)(最坏情况下为O(N))

    2.由很多层结构组成,且每一层都是一个有序链表,最底层的链表包含所有元素,如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。

    3.skiplist的性能可以和红黑树媲美,并且实现和维护简单

intset(整数集合):

    1.底层实现为数组,以有序或无序的方式保存元素,在有需要时程序会根据新添加的元素类型改变数组的类型(int16_t  -> int32_t  -> int64_t)

    2.升级操作为整数集合带来了操作上的灵活性,尽可能的节约了内存

    3.整数集合只支持类型升级不支持降级操作

ziplist(压缩列表):

    1.经过特殊编码的双向链表,提高存储效率

    2.包含多个节点,每个节点可以保存一个字节数组或整数值

    3.添加新节点或删除节点肯能会引发连锁更新操作(previous_entry_length属性记录了前一个节点的长度,当节点大于大于254字节时previous_entry_length使用5字节表示,从而引发所有节点previous_entry_length更新)

数据库:

redis是一个键值对数据库服务器

redis数据库结构基于字典,因此数据库增删改查都是对字典操作来实现的

键过期时间:使用一个单独的字典存储键的过期时间,

过期删除策略:redis使用惰性删除和定期删除两种策略删除过期的键

    1)惰性删除:放任键过期不管,每次从数据库获取键时,检查键是否过期,如果过期则删除,未过期则返回

    2)定期删除:每隔一段时间程序对数据库进行一次检查,删除过期的键

RDB持久化:

未完待续……

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(redis,数据库)