Redis的设计与实现 对象

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis的设计与实现 对象

一 对象的概念

Redis没有使用数据结构来实现键值对数据库,而是基于数据结构创建了一个对象系统,包括字符串对象,列表对象,有序集合对象,哈希对象,集合对象五种类型的对象。

二 对象的数据结构

  typedef stuct redisObject {
      // 类型
      unsigned type:4;
      // 编码
      unsigned encoding:4;
      // 指向底层数据结构的指针
      void *ptr;
      
      ....
      unsigned lru:22
  }
  
  1. 类型

     字符串键,列表键,有序集合键,哈希键,集合键
    
  2. 编码

    对应底层的数据结构

二 对象的种类

  1. 字符串对象

    三种编码 int raw embstr

  2. 列表对象

    列表对象的编码可以是ziplist(压缩列表)和linkedlist(链表)
    当列表中保存的字符串元素都小于64字节,或者元素数量小于512时使用ziplist否则使用linkedlist

  3. 哈希对象

    哈希对象的编码可以是ziplist或者hashtable(底层通过字典来实现,类似java hashMap)
    当哈希对象中保存的字符串元素都小于64字节,或者元素数量小于512时使用ziplist否则使用hashtable

  4. 集合对象

    集合对象编码可以是intsert和hashtable
    insert是整数集合,如果使用hashtable那么只是使用了hashtable的key他的value都是为null的

  5. 有序集合对象

    有序集合对象编码可以是ziplist也可以是skiplist
    有序集合元素数量小于128个时或者里面保存的元素都小于64字节时使用ziplist,其他的使用hashtable

三 内存回收

C语言不具备自动内存回收功能,所以redis自己实现了引用计数来实现垃圾回收,基本和java的引用计数发回收是一致的

四 对象共享

创建1000个字符串对象在内存中,这1000个对象其实是可以共享,如不同的键但是相同的value,这样就可以节省空间。

五 对象的空转时长

redisObject对象中有一个lru属性,记录对象最后一次命令的访问时间,通过当前时间减去键值对的lru时间就会得到这个键值对多长时间没有被使用,也就是他的空转时长。

相关文章
|
6月前
|
存储 NoSQL 算法
Redis设计与实现——数据结构与对象
Redis 是一个高性能的键值存储系统,其数据结构设计精妙且高效。主要包括以下几种核心数据结构:SDS、链表、字典、跳跃表、整数集合、压缩列表。此外,Redis 对象通过类型和编码方式动态转换,优化内存使用,并支持引用计数、共享对象和淘汰策略(如 LRU/LFU)。这些特性共同确保 Redis 在性能与灵活性之间的平衡。
|
存储 消息中间件 NoSQL
Redis 数据结构与对象
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求和数据特点来选择合适的数据结构,并合理地设计数据模型,以充分发挥 Redis 的优势。
243 64
|
存储 NoSQL 网络协议
redis主从同步对象模型学习笔记
redis主从同步对象模型学习笔记
176 0
|
存储 缓存 NoSQL
深入浅出Redis(一):对象与数据结构
深入浅出Redis(一):对象与数据结构
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
234 3
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
缓存 NoSQL Java
redis系列之------对象
redis系列之------对象
|
缓存 NoSQL Java
Spring Data Redis对象缓存序列化问题
在使用 Redis 时,有没有遇到同我一样,对象缓存序列化问题的呢?
293 6
Spring Data Redis对象缓存序列化问题
|
存储 缓存 NoSQL
Redis 数据类型和对象机制
Redis 是(key-value)的 NoSQL 数据库,所有的 key 都是 String ,它的 **value** 可以是 **String、hash、list、set、zset(有序集合)**、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等数据类型,这些类型都支持 push/pop、add/remove 及取交集和差集。而且这些操作都是**原子性**的。
104 1
Redis 数据类型和对象机制
|
存储 NoSQL Redis
Redis淘汰策略、持久化、主从同步与对象模型
Redis淘汰策略、持久化、主从同步与对象模型
220 0