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  阅读(89)  评论(0编辑  收藏  举报