- 浏览: 140285 次
文章分类
最新评论
前面介绍了 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 属性。
其中:
属性 type 记录了对象的类型,其值可以是下表中的常量之一。
因为对于 Redis 中的键值对来说,键总是一个字符串对象,所以平常说的某个键的类型其实是指值的类型,这也是 TYPE 命令的返回结果。
属性 encoding 记录了对象所使用的编码,它决定了属性 ptr 指针指向的底层实现数据结构,其值可以是下表中的常量之一。
每种类型的对象都至少使用了两种不同的编码,下表列出了每种类型的对象可以使用的编码。
可以使用 OBJECT ENCODING 命令来查看一个值对象的编码,如下所示。
正是通过 encoding 属性,Redis 才可以根据不同的使用场景来为一个对象设置不同的编码,从而达到优化对象在某一场景下的效率。关于 Redis 中的对象在在底层所使用的编码方式,以及从一种编码转换成另一种编码所需的条件等内容,请查看后续章节。
参考书籍:
1、《Redis 设计与实现》第 8 章——对象。
通过这五种不同类型的对象,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 章——对象。
发表评论
-
Lua 脚本
2019-10-07 19:49 654Redis 2.6 版本开始引入对 Lua 脚 ... -
Redis事务的实现
2019-09-22 18:56 464Redis 事务是 ... -
Redis集群之复制、故障转移及消息实现
2019-09-14 21:04 493在Redis集群 ... -
Redis集群实现原理
2019-09-14 12:19 656Redis 集群是 Redis 提供的分布式数 ... -
sentinel 系统介绍
2019-08-04 18:35 496Sentinel(哨兵)是 Redis 的高可 ... -
数据库复制
2019-07-13 22:02 362在连接到一 ... -
redis 客户端实现
2019-06-02 15:06 364Redis 服务器是典型的一对多服务器程序,通 ... -
AOF 持久化
2019-05-12 13:36 411除了前面提到的 RDB 持久化功能外,Redi ... -
RDB 文件结构
2019-04-27 12:10 569在RDB 持久化一节中,我们对 RDB 持久化 ... -
RDB 持久化
2019-04-14 17:20 417RDB 持久化功能可以将 Redis 在某个时 ... -
Redis 数据库通知功能的实现
2019-04-07 11:56 1276Reids 数据库通知功能可以让客户端通过订阅 ... -
数据库实现
2019-03-24 13:58 434Redis 服务器将其所有的数据库都保存在 r ... -
Redis 五种对象
2019-01-20 11:13 359阅读本节前需要阅读 Redis 对象系统概览一 ... -
整数集合与压缩列表
2018-12-09 21:19 589在 Redis 中,当一 ... -
跳跃表在 Redis 中的应用
2018-08-23 16:30 2021前提申明,因篇幅 ... -
字典实现
2018-08-20 15:49 559字典在 Redis 中的应用相当广泛,如 Redis ... -
redis 字符串和列表实现
2018-08-08 16:41 744Redis 虽说由 C 语言 ...
相关推荐
以下是一个简要的Redis实战教学概览: 一、Redis基础概念 定义:Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,它使用内存作为主要存储介质,同时也支持将数据异步写入硬盘以实现持久化。 特点:高...
通过思维导图,你可以快速概览Redis的全貌,而安装包则可以帮助你在实际环境中部署和测试Redis,加深对这些概念的理解。在学习过程中,建议结合实际操作和实验,理论与实践相结合,才能更好地掌握Redis的精髓。
#### 一、Spring Data Redis 概览 **Spring Data Redis** 是 **Spring Data** 家族中的一个模块,它为 **Redis** 提供了一套方便的操作接口,使得开发人员可以更加高效地利用 **Redis** 进行数据存储与检索。本章节...
6. Redis发布订阅:Redis的pub/sub(发布/订阅)模式允许消息的发布者和订阅者之间进行非持久性的消息传递,常用于实现实时消息系统。 7. Redis主从复制:为了提高可用性和扩展性,Redis支持主从复制。通过复制,...
Redis是一款高性能的键值存储系统,它具有内存数据存储、网络通信及复杂的数据结构操作等功能。本文旨在深入解析Redis的启动过程,帮助读者更好地理解其内部机制。文章主要依据《Redis 设计与实现》一书中的相关内容...
#### 一、Spring Data Redis 概览 Spring Data Redis 是 Spring Data 项目的一部分,旨在简化 Redis 在 Spring 应用中的集成与使用。该技术文档版本为 1.7.2.RELEASE,发布日期为 2016 年 6 月 15 日,由 Costin ...
- **例子**: Redis源码因其简洁高效的风格成为良好的学习对象。 #### 第一部分:redis服务框架 - **第1章:初探redis** - **位置**: Redis在缓存系统中的定位。 - **作用**: 解释Redis如何与其他系统交互以及其...
通过以上内容的学习,我们可以了解到Java注解的基本用法及其应用场景,Linux系统的基础操作命令,以及Redis和NoSQL数据库的相关概念与使用方法。这些知识对于开发Java Web应用以及管理服务器环境都是非常重要的。
### Redis专项进阶课程知识点概览 #### 一、Redis基础回顾与应用场景解析 - **Redis简介**:Redis(Remote Dictionary Server)是一款开源的、基于内存的键值存储系统,用作数据库、缓存和消息中间件。它支持多种...
### Redis入门教程精要 #### 1....以上就是 Redis 入门教程的核心内容概览,涵盖了 Redis 的安装、启动、基本操作以及数据结构、持久化策略、主从复制和配置等方面的详细介绍。希望对初学者有所帮助。
#### 一、Redis 数据结构概览 Redis 是一款高性能的键值存储系统,因其出色的速度、丰富的数据结构以及高度的灵活性,在诸多应用场景中发挥着重要作用。Redis 支持多种类型的数据结构,这些数据结构不仅能满足常见...
#### 一、Key-Value存储系统概览与Redis的选择 在《Redis实战》这本由红丸出品的书中,作者深入浅出地介绍了多种Key-Value存储系统,包括Voldemort、Dynamo、memcachedb、Cassandra、memcached以及Hypertable等。...
Redis,作为一款高性能的键值存储系统,其内部数据结构的设计是其高效、灵活的基础。本手册深入浅出地介绍了Redis所采用的关键数据结构及其应用原理,旨在帮助读者理解Redis内部的工作机制。 ##### 1.1 简单动态...
Redis 是一种高性能的键值存储系统,在 Spring Boot 中与之集成可以提供高效的缓存服务。以下是一些使用 Redis 时的关键技巧: - **usePrefix**: 这个配置项决定了缓存键名是否使用前缀。不使用前缀时,Redis 会...
3. **Hibernate或MyBatis ORM**:对象关系映射技术,将Java对象与数据库表进行映射,简化数据库操作。 四、权限与安全 1. **Spring Security**:提供认证和授权功能,保护系统资源,防止未授权访问。 2. **...
在互联网领域,知名网站的系统架构是技术爱好者们研究和学习的重要对象。这些大型网站背后所采用的技术栈、架构设计和优化策略,不仅体现了当前信息技术的发展趋势,也是解决高并发、大数据量、高可用性等挑战的关键...