Redis实战教程

#感悟:书读百遍,其意自见

#QQ群北京it—推荐–交流:300458205

#群专注内推、大数据、云计算、Java、Android、UI等技术交流,欢迎你的加入。

如果需要脑图可以联系我加群

Redis的底层实现专题

  • 字符串,底层就是字符串
  • list:对应了2种实现方式,一种是压缩列表,另一种是双向循环链表
  • 列表中的数据量比较小的时候,可以采用压缩列表的方式实现。
  • 具体需要满足如下2个条件
  • 列表中保存的单个数据(有可能是字符串类型的) 小于64字节
  • 列表中的数据个数少于512个。
  • 压缩列表不是基础数据结构是redis自己设计的一种数据存储结构。有点类似数组,通过一片连续的内存空间来存储数据。不过跟数组不同一点的是,允许存储的数据大小不同。具体的存储结构也非常简单。优势:节省内存,支持不同类型的数据结构,由于数组存储在一片连续的内存空间中,通过键来获取值为列表类型的数据,读取的效率非常高。
    Redis实战教程_第1张图片> > - [ ] 列表中数据量大的时候,使用双向循环列表
  • redis中还多额为定义一个list结构体来组织链表的首尾指针,还有长度等信息。
  • hash(字典)
    字典类型用来存储一组数据对,每个数据对又包含键值两部分。字典类型也有两种实现方法
  • 压缩列表(同上的2条要求)
  • 字典中保存的键和值的大小都要小于64字节
  • 字典中键值对的个数要小于512个
  • 散列表(无法满足上述要求选择散列表)
  • 依赖MurmurHash2这种运行速度快,随机性好的哈希算法作为哈希函数。对于哈希冲突问题,redis使用链表法解决。除此之外redis还支持散列表的动态扩容、缩容。当数据动态增加之后,散列表的额装载因子会不停的变大,为了避免散列表的性能下降,当装载因子大于1的时候,redis会触发扩容,将散列表扩大为原来大小的2倍左右。当数据动态减少之后为了节省内存,当装载因子小于0.1的时候redis就会触发缩容,缩小为字典中数据个数的大约2倍大小(计算得到的源码可以参考)。这种渐进式的方案减少了数据的搬移分批进行导致的一次性大量数据带来的服务停顿。
  • set(集合)
  • 集合数据类型用来存储不重复的数据,这种数据类型有2种实现方法:基于有序数组,基于散列表。
  • 当存储的数据都是整数以及存储的数据元素个数不超过512个会采用有序数组,否则使用散列表。
  • 有序集合(sortedset)
  • 有序集合采用跳表的实现方式(单链表加多索引) 。用来存储数据,并且每个数据会带一个得分通过得分大小来将数据组织成跳表这样的数据结构,方便快速根据得分值以及得分区间获取数据。
    实际上redis的其他数据类型中的有序集合也不只是跳表实现方式,如果数据量少也会使用压缩列表来实现。

redis的数据持久化原理:

  • 清除原有的存储结构,只将数据存储到磁盘中。当我们需要从磁盘还原数据到内存的时候,再重新将数据组织成原来的数据结构。实际上redis采用的就是这种思路。
  • 弊端:数据从硬盘还原到内存的过程会耗用大量时间。
  • 保存原来的存储格式,将数据按照原有格式存储在磁盘中。我们拿散列表举例的话就是将散列表的大小、每个数据被散列到槽的编号等信息,都保存磁盘汇总。有这些信息我们从磁盘中将数据还原到内存中的时候可以避免重新计算哈希值。

你可能感兴趣的:(职场@中间件@缓存)