redis 学习笔记一
此笔记基于《redis设计与实现》
一、redis的简单动态字符串:
redis自己构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS用作redis的默认字符串表示。
二、redis对象:
Redis用到的主要数据结构:简单动态字符申(SDS)、双端链表、字典、压缩列表、整数集合、跳跃表。
Redis并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种上面所说的数据结构(还是叫编码方式吧) 。
通过 encoding属性来设定对象所使用的编码, 而不是为特定类型的对象关联一种固定的编码,极大地提升了 Redis的灵活性和效率, 因为 Redis可以根据不同的使用场景来为一个对象设置不同的编码, 从而优化对象在某一场景下的效率。
举个例子, 在列表对象包含的元素比较少时, Redis使用压缩列表作为列表对象的底层实现 :
- 因为压缩列表比双端链表更节约内存. 并且在元素数量较少时, 在内存中以连续块方式保存的压缩列表比起双端链表可以更快被载入到缓存中;
- 随着列表对象包含的元素越来越多,使用压缩列表来保存元素的优势逐渐消失时,对象就会将底层实现从压缩列表转向功能更强、 也更适合保存大量元素的双端链表上 面。
三、内存回收:
因为 c语言并不具备自动内存回收功能, 所以 Redis在自己的对象系统中构建了一个引用计数( reference counting)技术实现的内存回收机制, 通过这一机制,程序可以通过跟踪对象的引用计数信息, 在适当的时候自动释放对象并进行内存回收。每个对象的引用计数信息由 redisObject结构的 refcount属性记录:
四、对象共享:
尽管共享更复杂的对象可以节约更多的内存, 但受到 CPU时间的限制,Redis只对包含整数位的字符串对象进行共享
五、重点回顾: