Redis的设计与实现 对象

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,倚天版 1GB 1个月
简介: 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时间就会得到这个键值对多长时间没有被使用,也就是他的空转时长。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
存储 缓存 NoSQL
深入浅出Redis(一):对象与数据结构
深入浅出Redis(一):对象与数据结构
|
3月前
|
存储 NoSQL 网络协议
redis主从同步对象模型学习笔记
redis主从同步对象模型学习笔记
63 0
|
1月前
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
2月前
|
缓存 NoSQL Java
redis系列之------对象
redis系列之------对象
|
3月前
|
缓存 NoSQL Java
Spring Data Redis对象缓存序列化问题
在使用 Redis 时,有没有遇到同我一样,对象缓存序列化问题的呢?
103 6
Spring Data Redis对象缓存序列化问题
|
3月前
|
存储 缓存 NoSQL
Redis 数据类型和对象机制
Redis 是(key-value)的 NoSQL 数据库,所有的 key 都是 String ,它的 **value** 可以是 **String、hash、list、set、zset(有序集合)**、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等数据类型,这些类型都支持 push/pop、add/remove 及取交集和差集。而且这些操作都是**原子性**的。
60 1
Redis 数据类型和对象机制
|
3月前
|
存储 NoSQL Redis
Redis淘汰策略、持久化、主从同步与对象模型
Redis淘汰策略、持久化、主从同步与对象模型
107 0
|
3月前
|
缓存 NoSQL Java
Redis实现商品信息对象缓存
Redis实现商品信息对象缓存
139 0
|
3月前
|
存储 NoSQL Redis
redis主从同步与对象模型
redis主从同步与对象模型
31 0
|
3月前
|
NoSQL Unix Redis
Redis对象及redisObject源码解析
Redis对象及redisObject源码解析