redis进阶(二)redis对象
如上一篇文章所述,介绍了redis底层的几种数据类型(简单动态字符串SDS、双端连表、字典、压缩列表、整数集合等),但是在redis并没有直接使用这些数据类型实现键值对数据库,redis是在基础数据类型的基础上又封装了一层,实现了一个包含了五种数据结构类型的统一对象。
每次在redis中创建一个键值对,都是创建了两个redis对象,其中一个用作redis键,一个用作值。(整理自redis设计与实现(第二版)第八章)
下面介绍一下redis的数据存储对象。对象的结构如下图所示:
从此可以引出一下几个问题:
1、为什么要使用redisObject,优点是什么
- 通过不同类型的对象,Redis 可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。
- 我们可以针对不同的使用场景,为对象设置不同的数据结构实现,从而优化对象在不同场景下的使用效率。
2、object中的各个参数有什么作用
(1)type(类型)
type记录了对象的类型。可以是字符串对象、列表对象、哈希对象、集合对象、有序集合对象中的一种。对于redis数据库保存的键值对来说,键永远是字符串对象,值可以是所有类型其中的一种。
使用type命令可以查看键值对中值对象的类型,其中返回的值对象类型如下图所示:
(2)encoding(编码)
encoding属性记录了对象所使用的的编码,即这个对象使用什么数据结构作为对象的底层实现。属性值如下表所示:
每种数据对象都至少使用了两种不同的编码。下表列出了每种对象可以使用的编码。
使用object encoding命令,可以查看数据库值对象使用的编码,下表为对应的输出
(3)lru:REDIS_LRU_BITS(对象最后一次被访问的时间)
可以用于计算数据建的空转时长,在服务器启动了maxmemory的情况下,空转时长较大的键可能会优先被服务器删除
(4)refcount(引用计数)
引用计数的优点:redis的垃圾回收是基于引用计数实现的,当对象不再被引用时,则释放对象占用的内存;
redis通过引用计数实现了对象共享复制,在适当情况下,可以使用多个数据库键值共享同一对象
(5)*ptr(指向实际值的指针)
指针ptr指向对象底层的数据结构实现,而这些数据结构有对象的encoding属性决定
总结如下:
(1)redis数据库中的每个键值对的键和值都是一个对象
(2)redis共有字符串、列表、哈希、集合、有序集合五种类型的对象,每种类型的对象至少都有两种或以上的编码方式,不同的编码可以再不同的使用场景上优化对象的使用效率
(3)服务器再执行某些命令之前,会先检查给定键的类型能否执行执行的命令,而检查检查一个键的类型就是检查一个键的值对象的类型
(4)redis的对象系统带有引用计数实现的内存回收机制,当一个对象不再被使用时,该对象所占用的内存就会被释放。
(5)redis会共享值从0-9999的字符串对象
(6)对象会记录自己的最后一次被访问时间,这个时间可以用于计算对象的空转
下一篇文章将介绍不同数据类型的Object对象实现
posted on 2020-12-03 20:26 1450811640 阅读(94) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~