`

Redis 对象系统概览

阅读更多
        前面介绍了 Redis 中用到的所有主要数据结构,如简单动态字符串、双端链表、字典、压缩列表和整数集合等,不过 Redis 并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,该系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都至少使用了一种数据结构。
        通过这五种不同类型的对象,Redis 可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。此外,还可以针对不同的使用场景来为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。
        Redis 的对象系统还实现了基于引用计数的内存回收机制,它会自动释放程序不再使用的对象(可通过命令“OBJECT REFCOUNT key”来查看对应键的引用计数)。另外,Redis 还通过引用计数技术实现了对包含整数值的字符串对象的共享机制(服务器启动时会自动创建包含值 0-9999 的字符串对象),以便在适当的条件下,让多个数据库键共享同一个对象来节约内存。
        最后,Redis 的对象还带有访问时间记录信息,该信息可以用于计算数据库键的空转时长(使用命令“OBJECT IDLETIME key”可查看对应键的空转时长,注意,使用该命令访问键时不会修改对象的 lru 属性)。此外,如果服务器启用了 maxmemory 选项,并且服务器用于内存回收的算法为 volatile-lru 或者 allkeys-lru,那么当服务器占用的内存数超过了 maxmemory 选项值时,空转时长较大的那些键会优先被删除(更多信息可查看配置文件的 maxmemory 和 maxmemory-policy 选项)。
        Redis 中的键和值都是使用对象来表示的,每个对象在底层都是一个 redisObject 结构,其中和保存数据有关的三个属性分别是 type 属性、encoding 属性和 ptr 属性。
typedef struct redisObject{
    unsigned type:4;            // 类型
    unsigned encoding:4;        // 编码
    void *ptr;                  // 指向底层实现数据结构的指针
    int refcount;               // 引用计数和对象共享
    unsigned lru:22;            // 记录对象最后一次被访问的时间,用于计算空转时长
}robj;

       其中:
       属性 type 记录了对象的类型,其值可以是下表中的常量之一。

       因为对于 Redis 中的键值对来说,键总是一个字符串对象,所以平常说的某个键的类型其实是指值的类型,这也是 TYPE 命令的返回结果。
redis> SADD fruits apple banana cherry
(integer) 3
redis> TYPE fruits
set

        属性 encoding 记录了对象所使用的编码,它决定了属性 ptr 指针指向的底层实现数据结构,其值可以是下表中的常量之一。

        每种类型的对象都至少使用了两种不同的编码,下表列出了每种类型的对象可以使用的编码。

        可以使用 OBJECT ENCODING 命令来查看一个值对象的编码,如下所示。
redis> SET msg "hello world"
OK
redis> OBJECT ENCODING msg
"embstr"
redis> SET story "long long long long long long ago ..."
OK
redis> OBJECT ENCODING story
"raw"

redis> SADD numbers 1 3 5
(integer) 3
redis> OBJECT ENCODING numbers
"intset"
redis> SADD numbers "seven"
(integer) 1
redis> OBJECT ENCODING numbers
"hashtable"

        正是通过 encoding 属性,Redis 才可以根据不同的使用场景来为一个对象设置不同的编码,从而达到优化对象在某一场景下的效率。关于 Redis 中的对象在在底层所使用的编码方式,以及从一种编码转换成另一种编码所需的条件等内容,请查看后续章节。

参考书籍:
1、《Redis 设计与实现》第 8 章——对象。
  • 大小: 35.9 KB
  • 大小: 85.1 KB
  • 大小: 169.7 KB
分享到:
评论

相关推荐

    redis的实战教学.pdf

    以下是一个简要的Redis实战教学概览: 一、Redis基础概念 定义:Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,它使用内存作为主要存储介质,同时也支持将数据异步写入硬盘以实现持久化。 特点:高...

    Redis思维导图及课件

    通过思维导图,你可以快速概览Redis的全貌,而安装包则可以帮助你在实际环境中部署和测试Redis,加深对这些概念的理解。在学习过程中,建议结合实际操作和实验,理论与实践相结合,才能更好地掌握Redis的精髓。

    Spring-data-redis使用指南

    #### 一、Spring Data Redis 概览 **Spring Data Redis** 是 **Spring Data** 家族中的一个模块,它为 **Redis** 提供了一套方便的操作接口,使得开发人员可以更加高效地利用 **Redis** 进行数据存储与检索。本章节...

    redis学习脑图mmap.zip

    6. Redis发布订阅:Redis的pub/sub(发布/订阅)模式允许消息的发布者和订阅者之间进行非持久性的消息传递,常用于实现实时消息系统。 7. Redis主从复制:为了提高可用性和扩展性,Redis支持主从复制。通过复制,...

    Redis启动过程详解

    Redis是一款高性能的键值存储系统,它具有内存数据存储、网络通信及复杂的数据结构操作等功能。本文旨在深入解析Redis的启动过程,帮助读者更好地理解其内部机制。文章主要依据《Redis 设计与实现》一书中的相关内容...

    spring data redis 官方文档

    #### 一、Spring Data Redis 概览 Spring Data Redis 是 Spring Data 项目的一部分,旨在简化 Redis 在 Spring 应用中的集成与使用。该技术文档版本为 1.7.2.RELEASE,发布日期为 2016 年 6 月 15 日,由 Costin ...

    redis源码日志

    - **例子**: Redis源码因其简洁高效的风格成为良好的学习对象。 #### 第一部分:redis服务框架 - **第1章:初探redis** - **位置**: Redis在缓存系统中的定位。 - **作用**: 解释Redis如何与其他系统交互以及其...

    JavaWeb之Linux与Redis

    通过以上内容的学习,我们可以了解到Java注解的基本用法及其应用场景,Linux系统的基础操作命令,以及Redis和NoSQL数据库的相关概念与使用方法。这些知识对于开发Java Web应用以及管理服务器环境都是非常重要的。

    Redis专项进阶课 解决Redis工作实际问题+掌握Redis6.x特性

    ### Redis专项进阶课程知识点概览 #### 一、Redis基础回顾与应用场景解析 - **Redis简介**:Redis(Remote Dictionary Server)是一款开源的、基于内存的键值存储系统,用作数据库、缓存和消息中间件。它支持多种...

    超强、超详细Redis入门教程

    ### Redis入门教程精要 #### 1....以上就是 Redis 入门教程的核心内容概览,涵盖了 Redis 的安装、启动、基本操作以及数据结构、持久化策略、主从复制和配置等方面的详细介绍。希望对初学者有所帮助。

    Redis命令.docx

    #### 一、Redis 数据结构概览 Redis 是一款高性能的键值存储系统,因其出色的速度、丰富的数据结构以及高度的灵活性,在诸多应用场景中发挥着重要作用。Redis 支持多种类型的数据结构,这些数据结构不仅能满足常见...

    《Redis实战》红丸出品

    #### 一、Key-Value存储系统概览与Redis的选择 在《Redis实战》这本由红丸出品的书中,作者深入浅出地介绍了多种Key-Value存储系统,包括Voldemort、Dynamo、memcachedb、Cassandra、memcached以及Hypertable等。...

    Redis中文手册

    Redis,作为一款高性能的键值存储系统,其内部数据结构的设计是其高效、灵活的基础。本手册深入浅出地介绍了Redis所采用的关键数据结构及其应用原理,旨在帮助读者理解Redis内部的工作机制。 ##### 1.1 简单动态...

    Springboot整合redis使用技巧.docx

    Redis 是一种高性能的键值存储系统,在 Spring Boot 中与之集成可以提供高效的缓存服务。以下是一些使用 Redis 时的关键技巧: - **usePrefix**: 这个配置项决定了缓存键名是否使用前缀。不使用前缀时,Redis 会...

    java进销存管理系统.rar

    3. **Hibernate或MyBatis ORM**:对象关系映射技术,将Java对象与数据库表进行映射,简化数据库操作。 四、权限与安全 1. **Spring Security**:提供认证和授权功能,保护系统资源,防止未授权访问。 2. **...

    各大知名网站系统架构

    在互联网领域,知名网站的系统架构是技术爱好者们研究和学习的重要对象。这些大型网站背后所采用的技术栈、架构设计和优化策略,不仅体现了当前信息技术的发展趋势,也是解决高并发、大数据量、高可用性等挑战的关键...

Global site tag (gtag.js) - Google Analytics